Add an m68k-system.xml 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 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/helper.c | 47 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) 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/helper.c b/target/m68k/helper.c index 5f91d206f596..f2615d5bcfb8 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,6 +177,11 @@ 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")); } +#ifndef CONFIG_USER_ONLY + gdb_register_coprocessor(cs, m68k_gdb_read_system_register, + m68k_gdb_write_system_register, + gdb_find_static_feature("m68k-system.xml")); +#endif /* TODO: Add [E]MAC registers. */ } -- 2.55.0.543.g5ebe2ebe4ea8
