Now that all targets have been converted to use the debug_excp_handler, and no longer clear watchpoint_hit themselves, we can clear BP_WATCHPOINT_HIT after the single usage. This avoids a loop over all watchpoints.
Signed-off-by: Richard Henderson <[email protected]> --- accel/tcg/cpu-exec.c | 23 ++++------------------- gdbstub/system.c | 2 ++ 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c index a4eb1f1c31..68d434fff4 100644 --- a/accel/tcg/cpu-exec.c +++ b/accel/tcg/cpu-exec.c @@ -685,27 +685,12 @@ static inline bool cpu_handle_halt(CPUState *cpu) static inline void cpu_handle_debug_exception(CPUState *cpu) { - CPUBreakpoint *hit = cpu->watchpoint_hit; + CPUBreakpoint *hit = cpu->watchpoint_hit ? : cpu->breakpoint_hit; - if (hit) { - IntervalTreeNode *n; - - for (n = interval_tree_iter_first(&cpu->watchpoints, 0, -1); n; - n = interval_tree_iter_next(n, 0, -1)) { - CPUBreakpoint *wp = container_of(n, CPUBreakpoint, itree); - if (wp != hit) { - wp->flags &= ~BP_WATCHPOINT_HIT; - } - } - } else { - hit = cpu->breakpoint_hit; - if (!hit) { - return; - } - } - - if (hit->flags & BP_CPU) { + if (hit && hit->flags & BP_CPU) { cpu->cc->tcg_ops->debug_excp_handler(cpu, hit); + + hit->flags &= ~BP_WATCHPOINT_HIT; cpu->watchpoint_hit = NULL; cpu->breakpoint_hit = NULL; } diff --git a/gdbstub/system.c b/gdbstub/system.c index b36e957b95..c78fb330c4 100644 --- a/gdbstub/system.c +++ b/gdbstub/system.c @@ -170,6 +170,8 @@ static void gdb_vm_state_change(void *opaque, bool running, RunState state) g_string_printf(buf, "T%02xthread:%s;%swatch:%" VADDR_PRIx ";", GDB_SIGNAL_TRAP, tid->str, type, cpu->watchpoint_hit->hitaddr); + + cpu->watchpoint_hit->flags &= ~BP_WATCHPOINT_HIT; cpu->watchpoint_hit = NULL; goto send_packet; } else { -- 2.43.0
