target/ppc: Use GDBFeature for dynamic XML
In preparation for a change to use GDBFeature as a parameter of gdb_register_coprocessor(), convert the internal representation of dynamic feature from plain XML to GDBFeature. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20231213-gdb-v17-2-777047380591@daynix.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20240227144335.1196131-7-alex.bennee@linaro.org>
This commit is contained in:
parent
690bd97b5b
commit
1b53948ff8
@ -20,6 +20,7 @@
|
|||||||
#ifndef QEMU_PPC_CPU_QOM_H
|
#ifndef QEMU_PPC_CPU_QOM_H
|
||||||
#define QEMU_PPC_CPU_QOM_H
|
#define QEMU_PPC_CPU_QOM_H
|
||||||
|
|
||||||
|
#include "exec/gdbstub.h"
|
||||||
#include "hw/core/cpu.h"
|
#include "hw/core/cpu.h"
|
||||||
|
|
||||||
#ifdef TARGET_PPC64
|
#ifdef TARGET_PPC64
|
||||||
|
@ -1492,8 +1492,7 @@ struct PowerPCCPUClass {
|
|||||||
int bfd_mach;
|
int bfd_mach;
|
||||||
uint32_t l1_dcache_size, l1_icache_size;
|
uint32_t l1_dcache_size, l1_icache_size;
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
unsigned int gdb_num_sprs;
|
GDBFeature gdb_spr;
|
||||||
const char *gdb_spr_xml;
|
|
||||||
#endif
|
#endif
|
||||||
const PPCHash64Options *hash64_opts;
|
const PPCHash64Options *hash64_opts;
|
||||||
struct ppc_radix_page_info *radix_page_info;
|
struct ppc_radix_page_info *radix_page_info;
|
||||||
@ -1546,7 +1545,6 @@ int ppc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
|
|||||||
int ppc_cpu_gdb_write_register_apple(CPUState *cpu, uint8_t *buf, int reg);
|
int ppc_cpu_gdb_write_register_apple(CPUState *cpu, uint8_t *buf, int reg);
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
hwaddr ppc_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
hwaddr ppc_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||||
void ppc_gdb_gen_spr_xml(PowerPCCPU *cpu);
|
|
||||||
const char *ppc_gdb_get_dynamic_xml(CPUState *cs, const char *xml_name);
|
const char *ppc_gdb_get_dynamic_xml(CPUState *cs, const char *xml_name);
|
||||||
#endif
|
#endif
|
||||||
int ppc64_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
int ppc64_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
|
||||||
|
@ -6682,10 +6682,6 @@ static void init_ppc_proc(PowerPCCPU *cpu)
|
|||||||
/* PowerPC implementation specific initialisations (SPRs, timers, ...) */
|
/* PowerPC implementation specific initialisations (SPRs, timers, ...) */
|
||||||
(*pcc->init_proc)(env);
|
(*pcc->init_proc)(env);
|
||||||
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
|
||||||
ppc_gdb_gen_spr_xml(cpu);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* MSR bits & flags consistency checks */
|
/* MSR bits & flags consistency checks */
|
||||||
if (env->msr_mask & (1 << 25)) {
|
if (env->msr_mask & (1 << 25)) {
|
||||||
switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
|
switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
|
||||||
|
@ -300,15 +300,23 @@ int ppc_cpu_gdb_write_register_apple(CPUState *cs, uint8_t *mem_buf, int n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
void ppc_gdb_gen_spr_xml(PowerPCCPU *cpu)
|
static void gdb_gen_spr_feature(CPUState *cs)
|
||||||
{
|
{
|
||||||
PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
|
PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
|
||||||
|
PowerPCCPU *cpu = POWERPC_CPU(cs);
|
||||||
CPUPPCState *env = &cpu->env;
|
CPUPPCState *env = &cpu->env;
|
||||||
GString *xml;
|
GDBFeatureBuilder builder;
|
||||||
char *spr_name;
|
|
||||||
unsigned int num_regs = 0;
|
unsigned int num_regs = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (pcc->gdb_spr.xml) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gdb_feature_builder_init(&builder, &pcc->gdb_spr,
|
||||||
|
"org.qemu.power.spr", "power-spr.xml",
|
||||||
|
cs->gdb_num_regs);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
|
for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
|
||||||
ppc_spr_t *spr = &env->spr_cb[i];
|
ppc_spr_t *spr = &env->spr_cb[i];
|
||||||
|
|
||||||
@ -326,35 +334,13 @@ void ppc_gdb_gen_spr_xml(PowerPCCPU *cpu)
|
|||||||
*/
|
*/
|
||||||
spr->gdb_id = num_regs;
|
spr->gdb_id = num_regs;
|
||||||
num_regs++;
|
num_regs++;
|
||||||
|
|
||||||
|
gdb_feature_builder_append_reg(&builder, g_ascii_strdown(spr->name, -1),
|
||||||
|
TARGET_LONG_BITS, num_regs,
|
||||||
|
"int", "spr");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pcc->gdb_spr_xml) {
|
gdb_feature_builder_end(&builder);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
xml = g_string_new("<?xml version=\"1.0\"?>");
|
|
||||||
g_string_append(xml, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
|
|
||||||
g_string_append(xml, "<feature name=\"org.qemu.power.spr\">");
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
|
|
||||||
ppc_spr_t *spr = &env->spr_cb[i];
|
|
||||||
|
|
||||||
if (!spr->name) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
spr_name = g_ascii_strdown(spr->name, -1);
|
|
||||||
g_string_append_printf(xml, "<reg name=\"%s\"", spr_name);
|
|
||||||
g_free(spr_name);
|
|
||||||
|
|
||||||
g_string_append_printf(xml, " bitsize=\"%d\"", TARGET_LONG_BITS);
|
|
||||||
g_string_append(xml, " group=\"spr\"/>");
|
|
||||||
}
|
|
||||||
|
|
||||||
g_string_append(xml, "</feature>");
|
|
||||||
|
|
||||||
pcc->gdb_num_sprs = num_regs;
|
|
||||||
pcc->gdb_spr_xml = g_string_free(xml, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *ppc_gdb_get_dynamic_xml(CPUState *cs, const char *xml_name)
|
const char *ppc_gdb_get_dynamic_xml(CPUState *cs, const char *xml_name)
|
||||||
@ -362,7 +348,7 @@ const char *ppc_gdb_get_dynamic_xml(CPUState *cs, const char *xml_name)
|
|||||||
PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
|
PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
|
||||||
|
|
||||||
if (strcmp(xml_name, "power-spr.xml") == 0) {
|
if (strcmp(xml_name, "power-spr.xml") == 0) {
|
||||||
return pcc->gdb_spr_xml;
|
return pcc->gdb_spr.xml;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -635,7 +621,8 @@ void ppc_gdb_init(CPUState *cs, PowerPCCPUClass *pcc)
|
|||||||
32, "power-vsx.xml", 0);
|
32, "power-vsx.xml", 0);
|
||||||
}
|
}
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
gdb_gen_spr_feature(cs);
|
||||||
gdb_register_coprocessor(cs, gdb_get_spr_reg, gdb_set_spr_reg,
|
gdb_register_coprocessor(cs, gdb_get_spr_reg, gdb_set_spr_reg,
|
||||||
pcc->gdb_num_sprs, "power-spr.xml", 0);
|
pcc->gdb_spr.num_regs, "power-spr.xml", 0);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user