[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 12/12] gdbstub: Replace gdb_regs with an array
From: |
Akihiko Odaki |
Subject: |
[PATCH v3 12/12] gdbstub: Replace gdb_regs with an array |
Date: |
Wed, 13 Sep 2023 07:41:01 +0900 |
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>
---
include/hw/core/cpu.h | 2 +-
gdbstub/gdbstub.c | 34 ++++++++++++++++++++--------------
2 files changed, 21 insertions(+), 15 deletions(-)
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index 4f5c7eb04e..c84c631242 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -375,7 +375,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;
diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c
index 177dce9ba2..9810d15278 100644
--- a/gdbstub/gdbstub.c
+++ b/gdbstub/gdbstub.c
@@ -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,22 @@ void gdb_register_coprocessor(CPUState *cpu,
int num_regs, const char *xml, int g_pos)
{
GDBRegisterState *s;
- GDBRegisterState **p;
-
- p = &cpu->gdb_regs;
- while (*p) {
- /* Check for duplicates. */
- if (strcmp((*p)->xml, xml) == 0)
- return;
- p = &(*p)->next;
+ guint i;
+
+ 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 +487,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', "
--
2.42.0
- Re: [PATCH v3 03/12] plugins: Check if vCPU is realized, (continued)
- [PATCH v3 04/12] contrib/plugins: Use GRWLock in execlog, Akihiko Odaki, 2023/09/12
- [PATCH v3 05/12] gdbstub: Introduce GDBFeature structure, Akihiko Odaki, 2023/09/12
- [PATCH v3 06/12] target/arm: Move the reference to arm-core.xml, Akihiko Odaki, 2023/09/12
- [PATCH v3 07/12] hw/core/cpu: Return static value with gdb_arch_name(), Akihiko Odaki, 2023/09/12
- [PATCH v3 08/12] gdbstub: Use g_markup_printf_escaped(), Akihiko Odaki, 2023/09/12
- [PATCH v3 09/12] target/arm: Remove references to gdb_has_xml, Akihiko Odaki, 2023/09/12
- [PATCH v3 10/12] target/ppc: Remove references to gdb_has_xml, Akihiko Odaki, 2023/09/12
- [PATCH v3 11/12] gdbstub: Remove gdb_has_xml variable, Akihiko Odaki, 2023/09/12
- [PATCH v3 12/12] gdbstub: Replace gdb_regs with an array,
Akihiko Odaki <=
- Re: [PATCH v3 00/12] gdbstub and TCG plugin improvements, Alex Bennée, 2023/09/14