Use the ID of the breakpoint instead of a loop over all.
Signed-off-by: Richard Henderson <[email protected]>
---
target/riscv/debug.c | 44 ++++++--------------------------------------
1 file changed, 6 insertions(+), 38 deletions(-)
diff --git a/target/riscv/debug.c b/target/riscv/debug.c
index 5c378dd2e8..511a69c28d 100644
--- a/target/riscv/debug.c
+++ b/target/riscv/debug.c
@@ -941,48 +941,16 @@ void riscv_cpu_debug_excp_handler(CPUState *cs)
}
}
-bool riscv_cpu_debug_check_breakpoint(CPUState *cs, CPUBreakpoint *ignore)
+bool riscv_cpu_debug_check_breakpoint(CPUState *cs, CPUBreakpoint *bp)
{
RISCVCPU *cpu = RISCV_CPU(cs);
CPURISCVState *env = &cpu->env;
- CPUBreakpoint *bp;
- target_ulong ctrl;
- target_ulong pc;
- int trigger_type;
- int i;
+ int i = bp->id;
+ trigger_type_t trigger_type = get_trigger_type(env, i);
- QTAILQ_FOREACH(bp, &cs->breakpoints, entry) {
- for (i = 0; i < env->num_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 ((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 (trigger_common_match(env, trigger_type, i)) {
+ env->badaddr = env->tdata2[i];
+ return true;
}
return false;
--
2.43.0