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(-)

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);
-- 
2.54.0


Reply via email to