On 6/30/26 10:15, Shivang Upadhyay wrote:
as cpu->breakpoints is migrated to GTree, change the breakpoint
looping from QTAILQ_FOREACH to g_tree_foreach.
---
  target/riscv/debug.c | 71 +++++++++++++++++++++++++-------------------
  1 file changed, 41 insertions(+), 30 deletions(-)

(1) This can't be a separate patch, because the first patch can't compile
(2) You can't use a global variable for bp_found.


r~


diff --git a/target/riscv/debug.c b/target/riscv/debug.c
index 30d39ee5cd..6b2ffd08db 100644
--- a/target/riscv/debug.c
+++ b/target/riscv/debug.c
@@ -939,53 +939,64 @@ void riscv_cpu_debug_excp_handler(CPUState *cs)
      }
  }
-bool riscv_cpu_debug_check_breakpoint(CPUState *cs)
+static bool bp_found;
+
+static gboolean check_breakpoints(gpointer key, gpointer value, gpointer 
cpu_state)
  {
+    CPUState *cs = (CPUState*)cpu_state;
+    CPUBreakpoint *bp = (CPUBreakpoint*)value;
      RISCVCPU *cpu = RISCV_CPU(cs);
      CPURISCVState *env = &cpu->env;
-    CPUBreakpoint *bp;
+    int trigger_type;
      target_ulong ctrl;
      target_ulong pc;
-    int trigger_type;
      int i;
- QTAILQ_FOREACH(bp, &cs->breakpoints, entry) {
-        for (i = 0; i < RV_MAX_TRIGGERS; i++) {
-            trigger_type = get_trigger_type(env, i);
+    for (i = 0; i < RV_MAX_TRIGGERS; i++) {
+        trigger_type = get_trigger_type(env, i);
+
+        if (!trigger_common_match(env, trigger_type, i)) {
+            continue;
+        }
+
+        switch (trigger_type) {
+        case TRIGGER_TYPE_AD_MATCH:
+            ctrl = env->tdata1[i];
+            pc = env->tdata2[i];
- if (!trigger_common_match(env, trigger_type, i)) {
-                continue;
+            if ((ctrl & TYPE2_EXEC) && (bp->pc == pc)) {
+                env->badaddr = pc;
+                bp_found = true;
+                return true;
              }
+            break;
+        case TRIGGER_TYPE_AD_MATCH6:
+            ctrl = env->tdata1[i];
+            pc = env->tdata2[i];
- switch (trigger_type) {
-            case TRIGGER_TYPE_AD_MATCH:
-                ctrl = env->tdata1[i];
-                pc = env->tdata2[i];
-
-                if ((ctrl & TYPE2_EXEC) && (bp->pc == pc)) {
-                    env->badaddr = pc;
-                    return true;
-                }
-                break;
-            case TRIGGER_TYPE_AD_MATCH6:
-                ctrl = env->tdata1[i];
-                pc = env->tdata2[i];
-
-                if ((ctrl & TYPE6_EXEC) && (bp->pc == pc)) {
-                    env->badaddr = pc;
-                    return true;
-                }
-                break;
-            default:
-                /* other trigger types are not supported or irrelevant */
-                break;
+            if ((ctrl & TYPE6_EXEC) && (bp->pc == pc)) {
+                env->badaddr = pc;
+                bp_found = true;
+                return true;
              }
+            break;
+        default:
+            /* other trigger types are not supported or irrelevant */
+            break;
          }
      }
return false;
  }
+bool riscv_cpu_debug_check_breakpoint(CPUState *cs)
+{
+    bp_found = false;
+    g_tree_foreach(cs->breakpoints, check_breakpoints, cs);
+
+    return bp_found;
+}
+
  bool riscv_cpu_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp)
  {
      RISCVCPU *cpu = RISCV_CPU(cs);


Reply via email to