Replace the HMP-specific MonitorDef with a GDB feature that exposes supervisor stack pointers (ssp, usp, isp), function code registers (sfc, dfc), MMU registers (urp, srp, dttr0/1, ittr0/1, mmusr) as read-only system registers through the internal GDB coprocessor interface.
Signed-off-by: Marc-André Lureau <[email protected]> --- configs/targets/m68k-softmmu.mak | 2 +- gdbstub/gdb-xml/m68k-system.xml | 32 ++++++++++++++++++++++++++ target/m68k/cpu.c | 22 ------------------ target/m68k/helper.c | 49 +++++++++++++++++++++++++++++++++++++++- 4 files changed, 81 insertions(+), 24 deletions(-) diff --git a/configs/targets/m68k-softmmu.mak b/configs/targets/m68k-softmmu.mak index 0bc889f326e3..f3ac9b74c862 100644 --- a/configs/targets/m68k-softmmu.mak +++ b/configs/targets/m68k-softmmu.mak @@ -1,4 +1,4 @@ TARGET_ARCH=m68k TARGET_BIG_ENDIAN=y -TARGET_XML_FILES= cf-core.xml cf-fp.xml m68k-core.xml m68k-fp.xml +TARGET_XML_FILES= cf-core.xml cf-fp.xml m68k-core.xml m68k-fp.xml m68k-system.xml TARGET_LONG_BITS=32 diff --git a/gdbstub/gdb-xml/m68k-system.xml b/gdbstub/gdb-xml/m68k-system.xml new file mode 100644 index 000000000000..0a91be0edc00 --- /dev/null +++ b/gdbstub/gdb-xml/m68k-system.xml @@ -0,0 +1,32 @@ +<?xml version="1.0"?> +<!-- + SPDX-License-Identifier: GPL-2.0-or-later +--> +<!DOCTYPE feature SYSTEM "gdb-target.dtd"> +<!-- System-register values are read-only; writes are ignored. --> +<feature name="org.qemu.gdb.m68k.system"> + <reg name="ssp" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="usp" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="isp" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="sfc" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="dfc" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="urp" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="srp" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="dttr0" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="dttr1" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="ittr0" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="ittr1" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="mmusr" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> +</feature> diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c index 9b52ad5fc234..ad7303305848 100644 --- a/target/m68k/cpu.c +++ b/target/m68k/cpu.c @@ -25,7 +25,6 @@ #include "disas/capstone.h" #ifndef CONFIG_USER_ONLY #include "migration/vmstate.h" -#include "monitor/hmp.h" #endif #include "cpu.h" @@ -666,32 +665,11 @@ static const VMStateDescription vmstate_m68k_cpu = { }, }; -#ifdef CONFIG_HMP -static const MonitorDef m68k_monitor_defs[] = { - { "ssp", offsetof(CPUM68KState, sp[0]) }, - { "usp", offsetof(CPUM68KState, sp[1]) }, - { "isp", offsetof(CPUM68KState, sp[2]) }, - { "sfc", offsetof(CPUM68KState, sfc) }, - { "dfc", offsetof(CPUM68KState, dfc) }, - { "urp", offsetof(CPUM68KState, mmu.urp) }, - { "srp", offsetof(CPUM68KState, mmu.srp) }, - { "dttr0", offsetof(CPUM68KState, mmu.ttr[M68K_DTTR0]) }, - { "dttr1", offsetof(CPUM68KState, mmu.ttr[M68K_DTTR1]) }, - { "ittr0", offsetof(CPUM68KState, mmu.ttr[M68K_ITTR0]) }, - { "ittr1", offsetof(CPUM68KState, mmu.ttr[M68K_ITTR1]) }, - { "mmusr", offsetof(CPUM68KState, mmu.mmusr) }, - { NULL }, -}; -#endif - #include "hw/core/sysemu-cpu-ops.h" static const struct SysemuCPUOps m68k_sysemu_ops = { .has_work = m68k_cpu_has_work, .get_phys_addr_debug = m68k_cpu_get_phys_addr_debug, -#ifdef CONFIG_HMP - .monitor_defs = m68k_monitor_defs, -#endif }; #endif /* !CONFIG_USER_ONLY */ diff --git a/target/m68k/helper.c b/target/m68k/helper.c index 5f91d206f596..1a29eaaf37f6 100644 --- a/target/m68k/helper.c +++ b/target/m68k/helper.c @@ -123,6 +123,48 @@ static int m68k_fpu_gdb_set_reg(CPUState *cs, uint8_t *mem_buf, int n) return 0; } +#ifndef CONFIG_USER_ONLY +static int m68k_gdb_read_system_register(CPUState *cs, GByteArray *buf, int n) +{ + CPUM68KState *env = cpu_env(cs); + static const int stacks[] = { M68K_SSP, M68K_USP, M68K_ISP }; + + if (n >= 0 && n < ARRAY_SIZE(stacks)) { + int sp = stacks[n]; + + return gdb_get_reg32(buf, env->sp[sp]); + } + switch (n) { + case 3: + return gdb_get_reg32(buf, env->sfc); + case 4: + return gdb_get_reg32(buf, env->dfc); + case 5: + return gdb_get_reg32(buf, env->mmu.urp); + case 6: + return gdb_get_reg32(buf, env->mmu.srp); + case 7: + return gdb_get_reg32(buf, env->mmu.ttr[M68K_DTTR0]); + case 8: + return gdb_get_reg32(buf, env->mmu.ttr[M68K_DTTR1]); + case 9: + return gdb_get_reg32(buf, env->mmu.ttr[M68K_ITTR0]); + case 10: + return gdb_get_reg32(buf, env->mmu.ttr[M68K_ITTR1]); + case 11: + return gdb_get_reg32(buf, env->mmu.mmusr); + default: + return 0; + } +} + +static int m68k_gdb_write_system_register(CPUState *cs, uint8_t *buf, int n) +{ + /* These registers are exposed for inspection only. Ignore writes. */ + return 4; +} +#endif + void m68k_cpu_init_gdb(M68kCPU *cpu) { CPUState *cs = CPU(cpu); @@ -135,7 +177,12 @@ void m68k_cpu_init_gdb(M68kCPU *cpu) gdb_register_coprocessor(cs, m68k_fpu_gdb_get_reg, m68k_fpu_gdb_set_reg, gdb_find_static_feature("m68k-fp.xml")); } - /* TODO: Add [E]MAC registers. */ + /* TODO: Add [E]MAC registers. */ +#ifndef CONFIG_USER_ONLY + gdb_register_internal_coprocessor(cs, m68k_gdb_read_system_register, + m68k_gdb_write_system_register, + gdb_find_static_feature("m68k-system.xml")); +#endif } void HELPER(cf_movec_to)(CPUM68KState *env, uint32_t reg, uint32_t val) -- 2.56.0.116.g6de20f6092dc
