target/arm: explicitly encode regnum in our XML
This is described as optional but I'm not convinced of the numbering when multiple target fragments are sent. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20200316172155.971-17-alex.bennee@linaro.org>
This commit is contained in:
parent
448d4d146b
commit
32d6e32afa
|
@ -980,7 +980,7 @@ int arm_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
||||||
/* Dynamically generates for gdb stub an XML description of the sysregs from
|
/* Dynamically generates for gdb stub an XML description of the sysregs from
|
||||||
* the cp_regs hashtable. Returns the registered sysregs number.
|
* the cp_regs hashtable. Returns the registered sysregs number.
|
||||||
*/
|
*/
|
||||||
int arm_gen_dynamic_sysreg_xml(CPUState *cpu);
|
int arm_gen_dynamic_sysreg_xml(CPUState *cpu, int base_reg);
|
||||||
|
|
||||||
/* Returns the dynamically generated XML for the gdb stub.
|
/* Returns the dynamically generated XML for the gdb stub.
|
||||||
* Returns a pointer to the XML contents for the specified XML file or NULL
|
* Returns a pointer to the XML contents for the specified XML file or NULL
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
typedef struct RegisterSysregXmlParam {
|
typedef struct RegisterSysregXmlParam {
|
||||||
CPUState *cs;
|
CPUState *cs;
|
||||||
GString *s;
|
GString *s;
|
||||||
|
int n;
|
||||||
} RegisterSysregXmlParam;
|
} RegisterSysregXmlParam;
|
||||||
|
|
||||||
/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
|
/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
|
||||||
|
@ -108,10 +109,11 @@ int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
|
||||||
|
|
||||||
static void arm_gen_one_xml_sysreg_tag(GString *s, DynamicGDBXMLInfo *dyn_xml,
|
static void arm_gen_one_xml_sysreg_tag(GString *s, DynamicGDBXMLInfo *dyn_xml,
|
||||||
ARMCPRegInfo *ri, uint32_t ri_key,
|
ARMCPRegInfo *ri, uint32_t ri_key,
|
||||||
int bitsize)
|
int bitsize, int regnum)
|
||||||
{
|
{
|
||||||
g_string_append_printf(s, "<reg name=\"%s\"", ri->name);
|
g_string_append_printf(s, "<reg name=\"%s\"", ri->name);
|
||||||
g_string_append_printf(s, " bitsize=\"%d\"", bitsize);
|
g_string_append_printf(s, " bitsize=\"%d\"", bitsize);
|
||||||
|
g_string_append_printf(s, " regnum=\"%d\"", regnum);
|
||||||
g_string_append_printf(s, " group=\"cp_regs\"/>");
|
g_string_append_printf(s, " group=\"cp_regs\"/>");
|
||||||
dyn_xml->data.cpregs.keys[dyn_xml->num] = ri_key;
|
dyn_xml->data.cpregs.keys[dyn_xml->num] = ri_key;
|
||||||
dyn_xml->num++;
|
dyn_xml->num++;
|
||||||
|
@ -131,7 +133,8 @@ static void arm_register_sysreg_for_xml(gpointer key, gpointer value,
|
||||||
if (!(ri->type & (ARM_CP_NO_RAW | ARM_CP_NO_GDB))) {
|
if (!(ri->type & (ARM_CP_NO_RAW | ARM_CP_NO_GDB))) {
|
||||||
if (arm_feature(env, ARM_FEATURE_AARCH64)) {
|
if (arm_feature(env, ARM_FEATURE_AARCH64)) {
|
||||||
if (ri->state == ARM_CP_STATE_AA64) {
|
if (ri->state == ARM_CP_STATE_AA64) {
|
||||||
arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64);
|
arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64,
|
||||||
|
param->n++);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (ri->state == ARM_CP_STATE_AA32) {
|
if (ri->state == ARM_CP_STATE_AA32) {
|
||||||
|
@ -140,20 +143,22 @@ static void arm_register_sysreg_for_xml(gpointer key, gpointer value,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (ri->type & ARM_CP_64BIT) {
|
if (ri->type & ARM_CP_64BIT) {
|
||||||
arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64);
|
arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64,
|
||||||
|
param->n++);
|
||||||
} else {
|
} else {
|
||||||
arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 32);
|
arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 32,
|
||||||
|
param->n++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int arm_gen_dynamic_sysreg_xml(CPUState *cs)
|
int arm_gen_dynamic_sysreg_xml(CPUState *cs, int base_reg)
|
||||||
{
|
{
|
||||||
ARMCPU *cpu = ARM_CPU(cs);
|
ARMCPU *cpu = ARM_CPU(cs);
|
||||||
GString *s = g_string_new(NULL);
|
GString *s = g_string_new(NULL);
|
||||||
RegisterSysregXmlParam param = {cs, s};
|
RegisterSysregXmlParam param = {cs, s, base_reg};
|
||||||
|
|
||||||
cpu->dyn_sysreg_xml.num = 0;
|
cpu->dyn_sysreg_xml.num = 0;
|
||||||
cpu->dyn_sysreg_xml.data.cpregs.keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs));
|
cpu->dyn_sysreg_xml.data.cpregs.keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs));
|
||||||
|
|
|
@ -7973,7 +7973,7 @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
|
||||||
19, "arm-vfp.xml", 0);
|
19, "arm-vfp.xml", 0);
|
||||||
}
|
}
|
||||||
gdb_register_coprocessor(cs, arm_gdb_get_sysreg, arm_gdb_set_sysreg,
|
gdb_register_coprocessor(cs, arm_gdb_get_sysreg, arm_gdb_set_sysreg,
|
||||||
arm_gen_dynamic_sysreg_xml(cs),
|
arm_gen_dynamic_sysreg_xml(cs, cs->gdb_num_regs),
|
||||||
"system-registers.xml", 0);
|
"system-registers.xml", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue