On 7/10/26 22:53, Richard Henderson wrote:
Use a balanced binary tree rather than a simple list for watchpoints.
Using an interval tree makes it easy to probe for any overlapping address.

Signed-off-by: Richard Henderson <[email protected]>
---
  include/exec/breakpoint.h |   7 +-
  include/hw/core/cpu.h     |   3 +-
  accel/tcg/cpu-exec.c      |   8 +-
  accel/tcg/watchpoint.c    | 155 +++++++++++++++++++++-----------------
  hw/core/cpu-common.c      |   1 -
  system/watchpoint.c       |  43 ++++++-----
  target/arm/hyp_gdbstub.c  |   3 +-
  7 files changed, 119 insertions(+), 101 deletions(-)

diff --git a/include/exec/breakpoint.h b/include/exec/breakpoint.h
index bb7cbc626d..e0826a1a2d 100644
--- a/include/exec/breakpoint.h
+++ b/include/exec/breakpoint.h
@@ -9,7 +9,6 @@
  #define EXEC_BREAKPOINT_H
#include "qemu/interval-tree.h"
-#include "qemu/queue.h"
  #include "exec/vaddr.h"
  #include "exec/memattrs.h"
@@ -36,13 +35,11 @@ struct CPUBreakpoint {
  };
struct CPUWatchpoint {
-    vaddr vaddr;
-    vaddr len;
+    IntervalTreeNode itree;
      vaddr hitaddr;
      MemTxAttrs hitattrs;
-    int flags; /* BP_* */
+    BreakpointFlags flags;

Should this go into 1/51?

      unsigned id;
-    QTAILQ_ENTRY(CPUWatchpoint) entry;
  };
int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, BreakpointFlags flags,
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index b8a1419860..7e19ea418d 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -525,8 +525,7 @@ struct CPUState {
/* ice debug support */
      IntervalTreeRoot breakpoints;
-
-    QTAILQ_HEAD(, CPUWatchpoint) watchpoints;
+    IntervalTreeRoot watchpoints;
      CPUWatchpoint *watchpoint_hit;
void *opaque;
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index 2762cf6705..ab299387e3 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -682,10 +682,12 @@ static inline bool cpu_handle_halt(CPUState *cpu)
  static inline void cpu_handle_debug_exception(CPUState *cpu)
  {
      const TCGCPUOps *tcg_ops = cpu->cc->tcg_ops;
-    CPUWatchpoint *wp;
+    IntervalTreeNode *n;
- if (!cpu->watchpoint_hit) {

Isn't it reasonable to continue checking for this, or can it never be
NULL if we come here?

[...]

Reviewed-by: Ilya Leoskevich <[email protected]>

Reply via email to