Use the matched watchpoint instead of looping over all.
Signed-off-by: Richard Henderson <[email protected]>
---
target/arm/tcg/debug.c | 35 ++++++-----------------------------
1 file changed, 6 insertions(+), 29 deletions(-)
diff --git a/target/arm/tcg/debug.c b/target/arm/tcg/debug.c
index 2389830b2a..daad2ac440 100644
--- a/target/arm/tcg/debug.c
+++ b/target/arm/tcg/debug.c
@@ -365,7 +365,7 @@ bool arm_debug_check_breakpoint(CPUState *cs, CPUBreakpoint
*bp)
return bp_wp_matches(cpu, env->cp15.dbgbcr[bp->id], arm_current_el(env));
}
-bool arm_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *ignore)
+bool arm_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp)
{
/*
* Called by core code when a CPU watchpoint fires; need to check if this
@@ -373,37 +373,14 @@ bool arm_debug_check_watchpoint(CPUState *cs,
CPUWatchpoint *ignore)
*/
ARMCPU *cpu = ARM_CPU(cs);
CPUARMState *env = &cpu->env;
- int n;
-
/*
- * If watchpoints are disabled globally or we can't take debug
- * exceptions here then watchpoint firings are ignored.
+ * The LDRT/STRT/LDT/STT "unprivileged access" instructions should
+ * match watchpoints as if they were accesses done at EL0, even if
+ * the CPU is at EL1 or higher.
*/
- if (extract32(env->cp15.mdscr_el1, 15, 1) == 0
- || !arm_generate_debug_exceptions(env)) {
- return false;
- }
+ int access_el = wp->hitattrs.user ? 0 : arm_current_el(env);
- for (n = 0; n < ARRAY_SIZE(env->cpu_watchpoint); n++) {
- CPUWatchpoint *wp = env->cpu_watchpoint[n];
- int access_el;
-
- if (!wp || !(wp->flags & BP_WATCHPOINT_HIT)) {
- continue;
- }
-
- /*
- * The LDRT/STRT/LDT/STT "unprivileged access" instructions should
- * match watchpoints as if they were accesses done at EL0, even if
- * the CPU is at EL1 or higher.
- */
- access_el = (wp->hitattrs.user ? 0 : arm_current_el(env));
-
- if (bp_wp_matches(cpu, env->cp15.dbgwcr[n], access_el)) {
- return true;
- }
- }
- return false;
+ return bp_wp_matches(cpu, env->cp15.dbgwcr[wp->id], access_el);
}
/*
--
2.43.0