Skip to content

Commit

Permalink
gdbstub: Add members to identify registers to GDBFeature
Browse files Browse the repository at this point in the history
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: <20240103173349.398526-36-alex.bennee@linaro.org>
Message-Id: <20231213-gdb-v17-10-777047380591@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
  • Loading branch information
akihikodaki authored and stsquad committed Jan 15, 2024
1 parent 59944d3 commit e13a50e
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 7 deletions.
12 changes: 9 additions & 3 deletions gdbstub/gdbstub.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions include/exec/gdbstub.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
14 changes: 13 additions & 1 deletion scripts/feature_to_c.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@ def writeliteral(indent, bytes):
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:
Expand All @@ -67,6 +69,7 @@ def writeliteral(indent, bytes):
if 'regnum' in element.attrib:
regnum = int(element.attrib['regnum'])

regnames.append(element.attrib['name'])
regnums.append(regnum)
regnum += 1

Expand All @@ -85,6 +88,15 @@ def writeliteral(indent, bytes):
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')
4 changes: 1 addition & 3 deletions target/riscv/gdbstub.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit e13a50e

Please sign in to comment.