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