[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 20/25] gdbstub: Expose functions to read registers
From: |
Akihiko Odaki |
Subject: |
[PATCH v3 20/25] gdbstub: Expose functions to read registers |
Date: |
Wed, 16 Aug 2023 22:39:30 +0900 |
gdb_foreach_feature() enumerates features that are useful to identify
registers. gdb_read_register() actually reads registers.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
include/exec/gdbstub.h | 6 ++++++
gdbstub/gdbstub.c | 38 ++++++++++++++++++++++++++++++--------
2 files changed, 36 insertions(+), 8 deletions(-)
diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h
index 5cba2933d2..151e9e81c6 100644
--- a/include/exec/gdbstub.h
+++ b/include/exec/gdbstub.h
@@ -59,6 +59,12 @@ void gdb_feature_builder_end(const GDBFeatureBuilder
*builder);
const GDBFeature *gdb_find_static_feature(const char *xmlname);
+void gdb_foreach_feature(CPUState *cpu,
+ void (* callback)(void *, const GDBFeature *, int),
+ void *opaque);
+
+int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg, bool has_xml);
+
void gdb_set_stop_cpu(CPUState *cpu);
/* in gdbstub-xml.c, generated by scripts/feature_to_c.py */
diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c
index 5974af7c8f..e395a58db4 100644
--- a/gdbstub/gdbstub.c
+++ b/gdbstub/gdbstub.c
@@ -483,14 +483,32 @@ const GDBFeature *gdb_find_static_feature(const char
*xmlname)
abort();
}
-static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
+void gdb_foreach_feature(CPUState *cpu,
+ void (* callback)(void *, const GDBFeature *, int),
+ void *opaque)
+{
+ CPUClass *cc = CPU_GET_CLASS(cpu);
+ GDBRegisterState *r;
+
+ if (!cc->gdb_core_feature) {
+ return;
+ }
+
+ callback(opaque, cc->gdb_core_feature, 0);
+
+ for (r = cpu->gdb_regs; r; r = r->next) {
+ callback(opaque, r->feature, r->base_reg);
+ }
+}
+
+int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg, bool has_xml)
{
CPUClass *cc = CPU_GET_CLASS(cpu);
CPUArchState *env = cpu->env_ptr;
GDBRegisterState *r;
if (reg < cc->gdb_num_core_regs) {
- return cc->gdb_read_register(cpu, buf, reg, gdb_has_xml);
+ return cc->gdb_read_register(cpu, buf, reg, has_xml);
}
for (r = cpu->gdb_regs; r; r = r->next) {
@@ -501,14 +519,15 @@ static int gdb_read_register(CPUState *cpu, GByteArray
*buf, int reg)
return 0;
}
-static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
+static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg,
+ bool has_xml)
{
CPUClass *cc = CPU_GET_CLASS(cpu);
CPUArchState *env = cpu->env_ptr;
GDBRegisterState *r;
if (reg < cc->gdb_num_core_regs) {
- return cc->gdb_write_register(cpu, mem_buf, reg, gdb_has_xml);
+ return cc->gdb_write_register(cpu, mem_buf, reg, has_xml);
}
for (r = cpu->gdb_regs; r; r = r->next) {
@@ -1134,7 +1153,7 @@ static void handle_set_reg(GArray *params, void *user_ctx)
reg_size = strlen(get_param(params, 1)->data) / 2;
gdb_hextomem(gdbserver_state.mem_buf, get_param(params, 1)->data,
reg_size);
gdb_write_register(gdbserver_state.g_cpu, gdbserver_state.mem_buf->data,
- get_param(params, 0)->val_ull);
+ get_param(params, 0)->val_ull, gdb_has_xml);
gdb_put_packet("OK");
}
@@ -1154,7 +1173,8 @@ static void handle_get_reg(GArray *params, void *user_ctx)
reg_size = gdb_read_register(gdbserver_state.g_cpu,
gdbserver_state.mem_buf,
- get_param(params, 0)->val_ull);
+ get_param(params, 0)->val_ull,
+ gdb_has_xml);
if (!reg_size) {
gdb_put_packet("E14");
return;
@@ -1241,7 +1261,8 @@ static void handle_write_all_regs(GArray *params, void
*user_ctx)
for (reg_id = 0;
reg_id < gdbserver_state.g_cpu->gdb_num_g_regs && len > 0;
reg_id++) {
- reg_size = gdb_write_register(gdbserver_state.g_cpu, registers,
reg_id);
+ reg_size = gdb_write_register(gdbserver_state.g_cpu, registers, reg_id,
+ gdb_has_xml);
len -= reg_size;
registers += reg_size;
}
@@ -1259,7 +1280,8 @@ static void handle_read_all_regs(GArray *params, void
*user_ctx)
for (reg_id = 0; reg_id < gdbserver_state.g_cpu->gdb_num_g_regs; reg_id++)
{
len += gdb_read_register(gdbserver_state.g_cpu,
gdbserver_state.mem_buf,
- reg_id);
+ reg_id,
+ gdb_has_xml);
}
g_assert(len == gdbserver_state.mem_buf->len);
--
2.41.0
- [PATCH v3 10/25] target/riscv: Use GDBFeature for dynamic XML, (continued)
- [PATCH v3 10/25] target/riscv: Use GDBFeature for dynamic XML, Akihiko Odaki, 2023/08/16
- [PATCH v3 11/25] gdbstub: Use GDBFeature for gdb_register_coprocessor, Akihiko Odaki, 2023/08/16
- [PATCH v3 12/25] gdbstub: Use GDBFeature for GDBRegisterState, Akihiko Odaki, 2023/08/16
- [PATCH v3 13/25] hw/core/cpu: Return static value with gdb_arch_name(), Akihiko Odaki, 2023/08/16
- [PATCH v3 14/25] gdbstub: Dynamically allocate target.xml buffer, Akihiko Odaki, 2023/08/16
- [PATCH v3 15/25] gdbstub: Simplify XML lookup, Akihiko Odaki, 2023/08/16
- [PATCH v3 16/25] hw/core/cpu: Remove gdb_get_dynamic_xml member, Akihiko Odaki, 2023/08/16
- [PATCH v3 17/25] gdbstub: Add members to identify registers to GDBFeature, Akihiko Odaki, 2023/08/16
- [PATCH v3 18/25] hw/core/cpu: Add a parameter to gdb_read_register/gdb_write_register, Akihiko Odaki, 2023/08/16
- [PATCH v3 19/25] gdbstub: Hide gdb_has_xml, Akihiko Odaki, 2023/08/16
- [PATCH v3 20/25] gdbstub: Expose functions to read registers,
Akihiko Odaki <=
- [PATCH v3 21/25] cpu: Call plugin hooks only when ready, Akihiko Odaki, 2023/08/16
- [PATCH v3 22/25] plugins: Allow to read registers, Akihiko Odaki, 2023/08/16
- [PATCH v3 23/25] contrib/plugins: Allow to log registers, Akihiko Odaki, 2023/08/16
- [PATCH v3 24/25] plugins: Support C++, Akihiko Odaki, 2023/08/16
- [PATCH v3 25/25] contrib/plugins: Add cc plugin, Akihiko Odaki, 2023/08/16