No longer need to check BP_CPU. Use hit->id instead of a search over ndbreak. Unify the raising of the exception.
Signed-off-by: Richard Henderson <[email protected]> --- target/xtensa/helper.c | 41 ++++++++++------------------------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/target/xtensa/helper.c b/target/xtensa/helper.c index 7643e97b2c..f66d0bff04 100644 --- a/target/xtensa/helper.c +++ b/target/xtensa/helper.c @@ -207,47 +207,26 @@ void xtensa_register_core(XtensaConfigList *node) } #ifndef CONFIG_USER_ONLY -static uint32_t check_hw_breakpoints(CPUXtensaState *env) -{ - unsigned i; - - for (i = 0; i < env->config->ndbreak; ++i) { - if (env->cpu_watchpoint[i] && - env->cpu_watchpoint[i]->flags & BP_WATCHPOINT_HIT) { - return DEBUGCAUSE_DB | (i << DEBUGCAUSE_DBNUM_SHIFT); - } - } - return 0; -} - void xtensa_cpu_debug_excp_handler(CPUState *cs, CPUBreakpoint *hit) { CPUXtensaState *env = cpu_env(cs); + uint32_t cause; - if (cs->watchpoint_hit) { - if (cs->watchpoint_hit->flags & BP_CPU) { - uint32_t cause; - - cs->watchpoint_hit = NULL; - cause = check_hw_breakpoints(env); - if (cause) { - debug_exception_env(env, cause); - } - cpu_loop_exit_noexc(cs); - } + if (hit->flags & BP_MEM_ACCESS) { + /* watchpoint */ + cause = DEBUGCAUSE_DB | (hit->id << DEBUGCAUSE_DBNUM_SHIFT); } else { - if (cpu_breakpoint_test(cs, env->pc, BP_GDB) - || !cpu_breakpoint_test(cs, env->pc, BP_CPU)) { - return; - } + /* breakpoint */ if (env->sregs[ICOUNT] == 0xffffffff && xtensa_get_cintlevel(env) < env->sregs[ICOUNTLEVEL]) { - debug_exception_env(env, DEBUGCAUSE_IC); + cause = DEBUGCAUSE_IC; } else { - debug_exception_env(env, DEBUGCAUSE_IB); + cause = DEBUGCAUSE_IB; } - cpu_loop_exit_noexc(cs); } + + debug_exception_env(env, cause); + cpu_loop_exit_noexc(cs); } void xtensa_cpu_do_unaligned_access(CPUState *cs, -- 2.43.0
