target/arm: Don't put FPEXC and FPSID in org.gnu.gdb.arm.vfp XML
Currently we send VFP XML which includes D0..D15 or D0..D31, plus FPSID, FPSCR and FPEXC. The upstream GDB tolerates this, but its definition of this XML feature does not include FPSID or FPEXC. In particular, for M-profile cores there are no FPSID or FPEXC registers, so advertising those is wrong. Move FPSID and FPEXC into their own bit of XML which we only send for A and R profile cores. This brings our definition of the XML org.gnu.gdb.arm.vfp feature into line with GDB's own (at least for non-Neon cores...) and means we don't claim to have FPSID and FPEXC on M-profile. (It seems unlikely to me that any gdbstub users really care about being able to look at FPEXC and FPSID; but we've supplied them to gdb for a decade and it's not hard to keep doing so.) Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210921162901.17508-5-peter.maydell@linaro.org
This commit is contained in:
parent
89f4f20e27
commit
b355f08a37
@ -1,5 +1,5 @@
|
||||
TARGET_ARCH=aarch64
|
||||
TARGET_BASE_ARCH=arm
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_XML_FILES= gdb-xml/aarch64-core.xml gdb-xml/aarch64-fpu.xml gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml
|
||||
TARGET_XML_FILES= gdb-xml/aarch64-core.xml gdb-xml/aarch64-fpu.xml gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-vfp-sysregs.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -1,6 +1,6 @@
|
||||
TARGET_ARCH=arm
|
||||
TARGET_SYSTBL_ABI=common,oabi
|
||||
TARGET_SYSTBL=syscall.tbl
|
||||
TARGET_XML_FILES= gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml
|
||||
TARGET_XML_FILES= gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-vfp-sysregs.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml
|
||||
TARGET_HAS_BFLT=y
|
||||
CONFIG_ARM_COMPATIBLE_SEMIHOSTING=y
|
||||
|
@ -1,4 +1,4 @@
|
||||
TARGET_ARCH=arm
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_XML_FILES= gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml
|
||||
TARGET_XML_FILES= gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-vfp-sysregs.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -2,6 +2,6 @@ TARGET_ARCH=arm
|
||||
TARGET_SYSTBL_ABI=common,oabi
|
||||
TARGET_SYSTBL=syscall.tbl
|
||||
TARGET_WORDS_BIGENDIAN=y
|
||||
TARGET_XML_FILES= gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml
|
||||
TARGET_XML_FILES= gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-vfp-sysregs.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml
|
||||
TARGET_HAS_BFLT=y
|
||||
CONFIG_ARM_COMPATIBLE_SEMIHOSTING=y
|
||||
|
@ -82,7 +82,5 @@
|
||||
<reg name="q14" bitsize="128" type="neon_q"/>
|
||||
<reg name="q15" bitsize="128" type="neon_q"/>
|
||||
|
||||
<reg name="fpsid" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fpscr" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fpexc" bitsize="32" type="int" group="float"/>
|
||||
</feature>
|
||||
|
17
gdb-xml/arm-vfp-sysregs.xml
Normal file
17
gdb-xml/arm-vfp-sysregs.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0"?>
|
||||
<!-- Copyright (C) 2021 Linaro Ltd.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved.
|
||||
|
||||
These are A/R profile VFP system registers. Debugger users probably
|
||||
don't really care about these, but because we used to (incorrectly)
|
||||
provide them to gdb in the org.gnu.gdb.arm.vfp XML we continue
|
||||
to do so via this separate XML.
|
||||
-->
|
||||
<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
||||
<feature name="org.qemu.gdb.arm.vfp-sysregs">
|
||||
<reg name="fpsid" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fpexc" bitsize="32" type="int" group="float"/>
|
||||
</feature>
|
@ -23,7 +23,5 @@
|
||||
<reg name="d14" bitsize="64" type="float"/>
|
||||
<reg name="d15" bitsize="64" type="float"/>
|
||||
|
||||
<reg name="fpsid" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fpscr" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fpexc" bitsize="32" type="int" group="float"/>
|
||||
</feature>
|
||||
|
@ -39,7 +39,5 @@
|
||||
<reg name="d30" bitsize="64" type="float"/>
|
||||
<reg name="d31" bitsize="64" type="float"/>
|
||||
|
||||
<reg name="fpsid" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fpscr" bitsize="32" type="int" group="float"/>
|
||||
<reg name="fpexc" bitsize="32" type="int" group="float"/>
|
||||
</feature>
|
||||
|
@ -144,11 +144,7 @@ static int vfp_gdb_get_reg(CPUARMState *env, GByteArray *buf, int reg)
|
||||
}
|
||||
switch (reg - nregs) {
|
||||
case 0:
|
||||
return gdb_get_reg32(buf, env->vfp.xregs[ARM_VFP_FPSID]);
|
||||
case 1:
|
||||
return gdb_get_reg32(buf, vfp_get_fpscr(env));
|
||||
case 2:
|
||||
return gdb_get_reg32(buf, env->vfp.xregs[ARM_VFP_FPEXC]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -172,13 +168,31 @@ static int vfp_gdb_set_reg(CPUARMState *env, uint8_t *buf, int reg)
|
||||
}
|
||||
}
|
||||
switch (reg - nregs) {
|
||||
case 0:
|
||||
vfp_set_fpscr(env, ldl_p(buf));
|
||||
return 4;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vfp_gdb_get_sysreg(CPUARMState *env, GByteArray *buf, int reg)
|
||||
{
|
||||
switch (reg) {
|
||||
case 0:
|
||||
return gdb_get_reg32(buf, env->vfp.xregs[ARM_VFP_FPSID]);
|
||||
case 1:
|
||||
return gdb_get_reg32(buf, env->vfp.xregs[ARM_VFP_FPEXC]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vfp_gdb_set_sysreg(CPUARMState *env, uint8_t *buf, int reg)
|
||||
{
|
||||
switch (reg) {
|
||||
case 0:
|
||||
env->vfp.xregs[ARM_VFP_FPSID] = ldl_p(buf);
|
||||
return 4;
|
||||
case 1:
|
||||
vfp_set_fpscr(env, ldl_p(buf));
|
||||
return 4;
|
||||
case 2:
|
||||
env->vfp.xregs[ARM_VFP_FPEXC] = ldl_p(buf) & (1 << 30);
|
||||
return 4;
|
||||
}
|
||||
@ -434,15 +448,25 @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
|
||||
34, "aarch64-fpu.xml", 0);
|
||||
}
|
||||
#endif
|
||||
} else if (arm_feature(env, ARM_FEATURE_NEON)) {
|
||||
gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
|
||||
51, "arm-neon.xml", 0);
|
||||
} else if (cpu_isar_feature(aa32_simd_r32, cpu)) {
|
||||
gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
|
||||
35, "arm-vfp3.xml", 0);
|
||||
} else if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
|
||||
gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
|
||||
19, "arm-vfp.xml", 0);
|
||||
} else {
|
||||
if (arm_feature(env, ARM_FEATURE_NEON)) {
|
||||
gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
|
||||
49, "arm-neon.xml", 0);
|
||||
} else if (cpu_isar_feature(aa32_simd_r32, cpu)) {
|
||||
gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
|
||||
33, "arm-vfp3.xml", 0);
|
||||
} else if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
|
||||
gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
|
||||
17, "arm-vfp.xml", 0);
|
||||
}
|
||||
if (!arm_feature(env, ARM_FEATURE_M)) {
|
||||
/*
|
||||
* A and R profile have FP sysregs FPEXC and FPSID that we
|
||||
* expose to gdb.
|
||||
*/
|
||||
gdb_register_coprocessor(cs, vfp_gdb_get_sysreg, vfp_gdb_set_sysreg,
|
||||
2, "arm-vfp-sysregs.xml", 0);
|
||||
}
|
||||
}
|
||||
gdb_register_coprocessor(cs, arm_gdb_get_sysreg, arm_gdb_set_sysreg,
|
||||
arm_gen_dynamic_sysreg_xml(cs, cs->gdb_num_regs),
|
||||
|
Loading…
Reference in New Issue
Block a user