gdbstub: Add members to identify registers to GDBFeature
These members will be used to help plugins to identify registers. The added members in instances of GDBFeature dynamically generated by CPUs will be filled in later changes. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Message-Id: <20231213-gdb-v17-10-777047380591@daynix.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20240227144335.1196131-15-alex.bennee@linaro.org>
This commit is contained in:
parent
f1a5287fc3
commit
eb37086fb0
@ -419,9 +419,10 @@ void gdb_feature_builder_init(GDBFeatureBuilder *builder, GDBFeature *feature,
|
||||
builder->feature = feature;
|
||||
builder->xml = g_ptr_array_new();
|
||||
g_ptr_array_add(builder->xml, header);
|
||||
builder->regs = g_ptr_array_new();
|
||||
builder->base_reg = base_reg;
|
||||
feature->xmlname = xmlname;
|
||||
feature->num_regs = 0;
|
||||
feature->name = name;
|
||||
}
|
||||
|
||||
void gdb_feature_builder_append_tag(const GDBFeatureBuilder *builder,
|
||||
@ -440,10 +441,12 @@ void gdb_feature_builder_append_reg(const GDBFeatureBuilder *builder,
|
||||
const char *type,
|
||||
const char *group)
|
||||
{
|
||||
if (builder->feature->num_regs < regnum) {
|
||||
builder->feature->num_regs = regnum;
|
||||
if (builder->regs->len <= regnum) {
|
||||
g_ptr_array_set_size(builder->regs, regnum + 1);
|
||||
}
|
||||
|
||||
builder->regs->pdata[regnum] = (gpointer *)name;
|
||||
|
||||
if (group) {
|
||||
gdb_feature_builder_append_tag(
|
||||
builder,
|
||||
@ -469,6 +472,9 @@ void gdb_feature_builder_end(const GDBFeatureBuilder *builder)
|
||||
}
|
||||
|
||||
g_ptr_array_free(builder->xml, TRUE);
|
||||
|
||||
builder->feature->num_regs = builder->regs->len;
|
||||
builder->feature->regs = (void *)g_ptr_array_free(builder->regs, FALSE);
|
||||
}
|
||||
|
||||
const GDBFeature *gdb_find_static_feature(const char *xmlname)
|
||||
|
@ -13,12 +13,15 @@
|
||||
typedef struct GDBFeature {
|
||||
const char *xmlname;
|
||||
const char *xml;
|
||||
const char *name;
|
||||
const char * const *regs;
|
||||
int num_regs;
|
||||
} GDBFeature;
|
||||
|
||||
typedef struct GDBFeatureBuilder {
|
||||
GDBFeature *feature;
|
||||
GPtrArray *xml;
|
||||
GPtrArray *regs;
|
||||
int base_reg;
|
||||
} GDBFeatureBuilder;
|
||||
|
||||
|
@ -50,7 +50,9 @@ for input in sys.argv[1:]:
|
||||
sys.stderr.write(f'unexpected start tag: {element.tag}\n')
|
||||
exit(1)
|
||||
|
||||
feature_name = element.attrib['name']
|
||||
regnum = 0
|
||||
regnames = []
|
||||
regnums = []
|
||||
tags = ['feature']
|
||||
for event, element in events:
|
||||
@ -67,6 +69,7 @@ for input in sys.argv[1:]:
|
||||
if 'regnum' in element.attrib:
|
||||
regnum = int(element.attrib['regnum'])
|
||||
|
||||
regnames.append(element.attrib['name'])
|
||||
regnums.append(regnum)
|
||||
regnum += 1
|
||||
|
||||
@ -85,6 +88,15 @@ for input in sys.argv[1:]:
|
||||
writeliteral(8, bytes(os.path.basename(input), 'utf-8'))
|
||||
sys.stdout.write(',\n')
|
||||
writeliteral(8, read)
|
||||
sys.stdout.write(f',\n {num_regs},\n }},\n')
|
||||
sys.stdout.write(',\n')
|
||||
writeliteral(8, bytes(feature_name, 'utf-8'))
|
||||
sys.stdout.write(',\n (const char * const []) {\n')
|
||||
|
||||
for index, regname in enumerate(regnames):
|
||||
sys.stdout.write(f' [{regnums[index] - base_reg}] =\n')
|
||||
writeliteral(16, bytes(regname, 'utf-8'))
|
||||
sys.stdout.write(',\n')
|
||||
|
||||
sys.stdout.write(f' }},\n {num_regs},\n }},\n')
|
||||
|
||||
sys.stdout.write(' { NULL }\n};\n')
|
||||
|
@ -266,11 +266,9 @@ static GDBFeature *riscv_gen_dynamic_csr_feature(CPUState *cs, int base_reg)
|
||||
}
|
||||
predicate = csr_ops[i].predicate;
|
||||
if (predicate && (predicate(env, i) == RISCV_EXCP_NONE)) {
|
||||
g_autofree char *dynamic_name = NULL;
|
||||
name = csr_ops[i].name;
|
||||
if (!name) {
|
||||
dynamic_name = g_strdup_printf("csr%03x", i);
|
||||
name = dynamic_name;
|
||||
name = g_strdup_printf("csr%03x", i);
|
||||
}
|
||||
|
||||
gdb_feature_builder_append_reg(&builder, name, bitsize, i,
|
||||
|
Loading…
Reference in New Issue
Block a user