Add a sparc64-system.xml GDB feature that exposes asi, pstate, cansave, canrestore, otherwin, wstate, and cleanwin as read-only system registers through the GDB coprocessor interface.
Signed-off-by: Marc-André Lureau <[email protected]> --- configs/targets/sparc64-softmmu.mak | 2 +- gdbstub/gdb-xml/sparc64-system.xml | 22 +++++++++++++++++++++ target/sparc/gdbstub.c | 38 +++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/configs/targets/sparc64-softmmu.mak b/configs/targets/sparc64-softmmu.mak index 4e621fb8e39e..7f2789136653 100644 --- a/configs/targets/sparc64-softmmu.mak +++ b/configs/targets/sparc64-softmmu.mak @@ -1,7 +1,7 @@ TARGET_ARCH=sparc64 TARGET_BASE_ARCH=sparc TARGET_BIG_ENDIAN=y -TARGET_XML_FILES=sparc64-cpu.xml sparc64-fpu.xml sparc64-cp0.xml +TARGET_XML_FILES=sparc64-cpu.xml sparc64-fpu.xml sparc64-cp0.xml sparc64-system.xml TARGET_LONG_BITS=64 TARGET_NOT_USING_LEGACY_LDST_PHYS_API=y TARGET_NOT_USING_LEGACY_NATIVE_ENDIAN_API=y diff --git a/gdbstub/gdb-xml/sparc64-system.xml b/gdbstub/gdb-xml/sparc64-system.xml new file mode 100644 index 000000000000..e00baedb467e --- /dev/null +++ b/gdbstub/gdb-xml/sparc64-system.xml @@ -0,0 +1,22 @@ +<?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.sparc.system"> + <reg name="asi" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="pstate" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="cansave" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="canrestore" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="otherwin" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="wstate" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> + <reg name="cleanwin" bitsize="32" type="uint32" + group="qemu-debug" save-restore="no"/> +</feature> diff --git a/target/sparc/gdbstub.c b/target/sparc/gdbstub.c index 2874ce1b3501..ca23a4a94532 100644 --- a/target/sparc/gdbstub.c +++ b/target/sparc/gdbstub.c @@ -266,6 +266,39 @@ static int sparc_cp0_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) #endif } +#if defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY) +static int sparc64_gdb_read_system_register(CPUState *cs, GByteArray *buf, + int n) +{ + CPUSPARCState *env = cpu_env(cs); + + switch (n) { + case 0: + return gdb_get_reg32(buf, env->asi); + case 1: + return gdb_get_reg32(buf, env->pstate); + case 2: + return gdb_get_reg32(buf, env->cansave); + case 3: + return gdb_get_reg32(buf, env->canrestore); + case 4: + return gdb_get_reg32(buf, env->otherwin); + case 5: + return gdb_get_reg32(buf, env->wstate); + case 6: + return gdb_get_reg32(buf, env->cleanwin); + default: + return 0; + } +} + +static int sparc64_gdb_write_system_register(CPUState *cs, uint8_t *buf, int n) +{ + /* These registers are exposed for inspection only. Ignore writes. */ + return 4; +} +#endif + void sparc_cpu_register_gdb_regs(CPUState *cs) { #if defined(TARGET_ABI32) || !defined(TARGET_SPARC64) @@ -282,5 +315,10 @@ void sparc_cpu_register_gdb_regs(CPUState *cs) gdb_register_coprocessor(cs, sparc_cp0_gdb_read_register, sparc_cp0_gdb_write_register, gdb_find_static_feature("sparc64-cp0.xml")); +#ifndef CONFIG_USER_ONLY + gdb_register_coprocessor(cs, sparc64_gdb_read_system_register, + sparc64_gdb_write_system_register, + gdb_find_static_feature("sparc64-system.xml")); +#endif #endif } -- 2.55.0.543.g5ebe2ebe4ea8
