[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH qom-cpu 52/59] gdbstub: Abstract gdb_breakpoint_{ins
From: |
Andreas Färber |
Subject: |
[Qemu-devel] [PATCH qom-cpu 52/59] gdbstub: Abstract gdb_breakpoint_{insert, remove}() with qemu_for_each_cpu() |
Date: |
Sun, 9 Jun 2013 21:13:19 +0200 |
Signed-off-by: Andreas Färber <address@hidden>
---
gdbstub.c | 106 +++++++++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 77 insertions(+), 29 deletions(-)
diff --git a/gdbstub.c b/gdbstub.c
index e05cd66..eb47068 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -1944,10 +1944,46 @@ static const int xlat_gdb_type[] = {
};
#endif
+typedef struct GDBBreakpointAddRemoveData {
+ target_ulong addr;
+ target_ulong len;
+ int type;
+ int ret;
+} GDBBreakpointAddRemoveData;
+
+static void gdb_breakpoint_insert_one(CPUState *cpu, void *data)
+{
+ GDBBreakpointAddRemoveData *s = data;
+ CPUArchState *env = cpu->env_ptr;
+
+ if (s->ret) {
+ return;
+ }
+ s->ret = cpu_breakpoint_insert(env, s->addr, BP_GDB, NULL);
+}
+
+#ifndef CONFIG_USER_ONLY
+static void gdb_watchpoint_insert_one(CPUState *cpu, void *data)
+{
+ GDBBreakpointAddRemoveData *s = data;
+ CPUArchState *env = cpu->env_ptr;
+
+ if (s->ret) {
+ return;
+ }
+ s->ret = cpu_watchpoint_insert(env, s->addr, s->len,
+ xlat_gdb_type[s->type], NULL);
+}
+#endif
+
static int gdb_breakpoint_insert(target_ulong addr, target_ulong len, int type)
{
- CPUArchState *env;
- int err = 0;
+ GDBBreakpointAddRemoveData s = {
+ .addr = addr,
+ .len = len,
+ .type = type,
+ .ret = 0,
+ };
if (kvm_enabled())
return kvm_insert_breakpoint(gdbserver_state->c_cpu, addr, len, type);
@@ -1955,33 +1991,53 @@ static int gdb_breakpoint_insert(target_ulong addr,
target_ulong len, int type)
switch (type) {
case GDB_BREAKPOINT_SW:
case GDB_BREAKPOINT_HW:
- for (env = first_cpu; env != NULL; env = env->next_cpu) {
- err = cpu_breakpoint_insert(env, addr, BP_GDB, NULL);
- if (err)
- break;
- }
- return err;
+ qemu_for_each_cpu(gdb_breakpoint_insert_one, &s);
+ return s.ret;
#ifndef CONFIG_USER_ONLY
case GDB_WATCHPOINT_WRITE:
case GDB_WATCHPOINT_READ:
case GDB_WATCHPOINT_ACCESS:
- for (env = first_cpu; env != NULL; env = env->next_cpu) {
- err = cpu_watchpoint_insert(env, addr, len, xlat_gdb_type[type],
- NULL);
- if (err)
- break;
- }
- return err;
+ qemu_for_each_cpu(gdb_watchpoint_insert_one, &s);
+ return s.ret;
#endif
default:
return -ENOSYS;
}
}
+static void gdb_breakpoint_remove_one(CPUState *cpu, void *data)
+{
+ GDBBreakpointAddRemoveData *s = data;
+ CPUArchState *env = cpu->env_ptr;
+
+ if (s->ret) {
+ return;
+ }
+ s->ret = cpu_breakpoint_remove(env, s->addr, BP_GDB);
+}
+
+#ifndef CONFIG_USER_ONLY
+static void gdb_watchpoint_remove_one(CPUState *cpu, void *data)
+{
+ GDBBreakpointAddRemoveData *s = data;
+ CPUArchState *env = cpu->env_ptr;
+
+ if (s->ret) {
+ return;
+ }
+ s->ret = cpu_watchpoint_remove(env, s->addr, s->len,
+ xlat_gdb_type[s->type]);
+}
+#endif
+
static int gdb_breakpoint_remove(target_ulong addr, target_ulong len, int type)
{
- CPUArchState *env;
- int err = 0;
+ GDBBreakpointAddRemoveData s = {
+ .addr = addr,
+ .len = len,
+ .type = type,
+ .ret = 0,
+ };
if (kvm_enabled())
return kvm_remove_breakpoint(gdbserver_state->c_cpu, addr, len, type);
@@ -1989,22 +2045,14 @@ static int gdb_breakpoint_remove(target_ulong addr,
target_ulong len, int type)
switch (type) {
case GDB_BREAKPOINT_SW:
case GDB_BREAKPOINT_HW:
- for (env = first_cpu; env != NULL; env = env->next_cpu) {
- err = cpu_breakpoint_remove(env, addr, BP_GDB);
- if (err)
- break;
- }
- return err;
+ qemu_for_each_cpu(gdb_breakpoint_remove_one, &s);
+ return s.ret;
#ifndef CONFIG_USER_ONLY
case GDB_WATCHPOINT_WRITE:
case GDB_WATCHPOINT_READ:
case GDB_WATCHPOINT_ACCESS:
- for (env = first_cpu; env != NULL; env = env->next_cpu) {
- err = cpu_watchpoint_remove(env, addr, len, xlat_gdb_type[type]);
- if (err)
- break;
- }
- return err;
+ qemu_for_each_cpu(gdb_watchpoint_remove_one, &s);
+ return s.ret;
#endif
default:
return -ENOSYS;
--
1.8.1.4
- [Qemu-devel] [PATCH qom-cpu 44/59] kvmvapic: Abstract vapic_enable_tpr_reporting() with qemu_for_each_cpu(), (continued)
- [Qemu-devel] [PATCH qom-cpu 49/59] cpus: Abstract all_vcpus_paused() with qemu_for_each_cpu(), Andreas Färber, 2013/06/09
- [Qemu-devel] [PATCH qom-cpu 50/59] cpus: Abstract qmp_query_cpus() with qemu_for_each_cpu(), Andreas Färber, 2013/06/09
- [Qemu-devel] [PATCH qom-cpu 51/59] exec: Abstract qemu_get_cpu() with qemu_for_each_cpu(), Andreas Färber, 2013/06/09
- [Qemu-devel] [PATCH qom-cpu 52/59] gdbstub: Abstract gdb_breakpoint_{insert, remove}() with qemu_for_each_cpu(),
Andreas Färber <=
- [Qemu-devel] [PATCH qom-cpu 53/59] gdbstub: Abstract gdb_breakpoint_remove_all() with qemu_for_each_cpu(), Andreas Färber, 2013/06/09
- [Qemu-devel] [PATCH qom-cpu 55/59] spapr_rtas: Abstract rtas_query_cpu_stopped_state() with qemu_get_cpu(), Andreas Färber, 2013/06/09
- [Qemu-devel] [PATCH qom-cpu 56/59] spapr_rtas: Abstract rtas_start_cpu() with qemu_get_cpu(), Andreas Färber, 2013/06/09
- [Qemu-devel] [PATCH qom-cpu 54/59] spapr: Abstract spapr_create_fdt_skel() with qemu_for_each_cpu(), Andreas Färber, 2013/06/09
- [Qemu-devel] [PATCH qom-cpu 58/59] linux-user: Change thread_env to CPUState, Andreas Färber, 2013/06/09
- [Qemu-devel] [PATCH qom-cpu 57/59] cpu: Make first_cpu and next_cpu CPUState (WIP), Andreas Färber, 2013/06/09
- [Qemu-devel] [PATCH qom-cpu 59/59] bsd-user: Change thread_env to CPUState, Andreas Färber, 2013/06/09
- Re: [Qemu-devel] [PATCH qom-cpu 00/59] QOM CPUState, part 10: CPU loops, Stefano Stabellini, 2013/06/10