diff options
author | Richard Henderson | 2021-11-03 05:03:51 +0100 |
---|---|---|
committer | Peter Maydell | 2021-12-15 11:35:26 +0100 |
commit | 8dc89f1faa28af0df92d6c63ff249849a3e9c80e (patch) | |
tree | 31565f93d2181652f13eaa63bed0f0fd8e250481 /target/arm | |
parent | target/arm: Assert thumb pc is aligned (diff) | |
download | qemu-8dc89f1faa28af0df92d6c63ff249849a3e9c80e.tar.gz qemu-8dc89f1faa28af0df92d6c63ff249849a3e9c80e.tar.xz qemu-8dc89f1faa28af0df92d6c63ff249849a3e9c80e.zip |
target/arm: Suppress bp for exceptions with more priority
Both single-step and pc alignment faults have priority over
breakpoint exceptions.
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'target/arm')
-rw-r--r-- | target/arm/debug_helper.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/target/arm/debug_helper.c b/target/arm/debug_helper.c index 2983e36dd3..32f3caec23 100644 --- a/target/arm/debug_helper.c +++ b/target/arm/debug_helper.c @@ -220,6 +220,7 @@ bool arm_debug_check_breakpoint(CPUState *cs) { ARMCPU *cpu = ARM_CPU(cs); CPUARMState *env = &cpu->env; + target_ulong pc; int n; /* @@ -231,6 +232,28 @@ bool arm_debug_check_breakpoint(CPUState *cs) return false; } + /* + * Single-step exceptions have priority over breakpoint exceptions. + * If single-step state is active-pending, suppress the bp. + */ + if (arm_singlestep_active(env) && !(env->pstate & PSTATE_SS)) { + return false; + } + + /* + * PC alignment faults have priority over breakpoint exceptions. + */ + pc = is_a64(env) ? env->pc : env->regs[15]; + if ((is_a64(env) || !env->thumb) && (pc & 3) != 0) { + return false; + } + + /* + * Instruction aborts have priority over breakpoint exceptions. + * TODO: We would need to look up the page for PC and verify that + * it is present and executable. + */ + for (n = 0; n < ARRAY_SIZE(env->cpu_breakpoint); n++) { if (bp_wp_matches(cpu, n, false)) { return true; |