gdbstub: Replace gdb_regs with an array
An array is a more appropriate data structure than a list for gdb_regs since it is initialized only with append operation and read-only after initialization. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20230912224107.29669-13-akihiko.odaki@daynix.com> [AJB: fixed a checkpatch violation] Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20231009164104.369749-20-alex.bennee@linaro.org>
This commit is contained in:
parent
213316d401
commit
73c392c26b
@ -51,7 +51,6 @@ typedef struct GDBRegisterState {
|
||||
gdb_get_reg_cb get_reg;
|
||||
gdb_set_reg_cb set_reg;
|
||||
const char *xml;
|
||||
struct GDBRegisterState *next;
|
||||
} GDBRegisterState;
|
||||
|
||||
GDBState gdbserver_state;
|
||||
@ -386,7 +385,8 @@ static const char *get_feature_xml(const char *p, const char **newp,
|
||||
xml,
|
||||
g_markup_printf_escaped("<xi:include href=\"%s\"/>",
|
||||
cc->gdb_core_xml_file));
|
||||
for (r = cpu->gdb_regs; r; r = r->next) {
|
||||
for (guint i = 0; i < cpu->gdb_regs->len; i++) {
|
||||
r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
|
||||
g_ptr_array_add(
|
||||
xml,
|
||||
g_markup_printf_escaped("<xi:include href=\"%s\"/>",
|
||||
@ -430,7 +430,8 @@ static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
|
||||
return cc->gdb_read_register(cpu, buf, reg);
|
||||
}
|
||||
|
||||
for (r = cpu->gdb_regs; r; r = r->next) {
|
||||
for (guint i = 0; i < cpu->gdb_regs->len; i++) {
|
||||
r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
|
||||
if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
|
||||
return r->get_reg(env, buf, reg - r->base_reg);
|
||||
}
|
||||
@ -448,7 +449,8 @@ static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
|
||||
return cc->gdb_write_register(cpu, mem_buf, reg);
|
||||
}
|
||||
|
||||
for (r = cpu->gdb_regs; r; r = r->next) {
|
||||
for (guint i = 0; i < cpu->gdb_regs->len; i++) {
|
||||
r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
|
||||
if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
|
||||
return r->set_reg(env, mem_buf, reg - r->base_reg);
|
||||
}
|
||||
@ -461,17 +463,23 @@ void gdb_register_coprocessor(CPUState *cpu,
|
||||
int num_regs, const char *xml, int g_pos)
|
||||
{
|
||||
GDBRegisterState *s;
|
||||
GDBRegisterState **p;
|
||||
guint i;
|
||||
|
||||
p = &cpu->gdb_regs;
|
||||
while (*p) {
|
||||
/* Check for duplicates. */
|
||||
if (strcmp((*p)->xml, xml) == 0)
|
||||
return;
|
||||
p = &(*p)->next;
|
||||
if (cpu->gdb_regs) {
|
||||
for (i = 0; i < cpu->gdb_regs->len; i++) {
|
||||
/* Check for duplicates. */
|
||||
s = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
|
||||
if (strcmp(s->xml, xml) == 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cpu->gdb_regs = g_array_new(false, false, sizeof(GDBRegisterState));
|
||||
i = 0;
|
||||
}
|
||||
|
||||
s = g_new0(GDBRegisterState, 1);
|
||||
g_array_set_size(cpu->gdb_regs, i + 1);
|
||||
s = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
|
||||
s->base_reg = cpu->gdb_num_regs;
|
||||
s->num_regs = num_regs;
|
||||
s->get_reg = get_reg;
|
||||
@ -480,7 +488,6 @@ void gdb_register_coprocessor(CPUState *cpu,
|
||||
|
||||
/* Add to end of list. */
|
||||
cpu->gdb_num_regs += num_regs;
|
||||
*p = s;
|
||||
if (g_pos) {
|
||||
if (g_pos != s->base_reg) {
|
||||
error_report("Error: Bad gdb register numbering for '%s', "
|
||||
|
@ -502,7 +502,7 @@ struct CPUState {
|
||||
|
||||
CPUJumpCache *tb_jmp_cache;
|
||||
|
||||
struct GDBRegisterState *gdb_regs;
|
||||
GArray *gdb_regs;
|
||||
int gdb_num_regs;
|
||||
int gdb_num_g_regs;
|
||||
QTAILQ_ENTRY(CPUState) node;
|
||||
|
Loading…
Reference in New Issue
Block a user