Replace the forwarding wrapper with direct cpu_raise_excp() calls in Xtensa C helpers. Use gen_helper_raise_excp() for translated EXCP_YIELD, while preserving exception_cause helpers for architectural state updates.
Signed-off-by: Yonggang Luo <[email protected]> --- target/xtensa/exc_helper.c | 14 +++----------- target/xtensa/helper.h | 1 - target/xtensa/translate.c | 2 +- target/xtensa/win_helper.c | 13 +++++++------ 4 files changed, 11 insertions(+), 19 deletions(-) diff --git a/target/xtensa/exc_helper.c b/target/xtensa/exc_helper.c index 793761a698f..d49cc5558ad 100644 --- a/target/xtensa/exc_helper.c +++ b/target/xtensa/exc_helper.c @@ -35,14 +35,6 @@ #include "qemu/atomic.h" #include "qemu/plugin.h" -void HELPER(exception)(CPUXtensaState *env, uint32_t excp) -{ - CPUState *cs = env_cpu(env); - - cs->exception_index = excp; - cpu_loop_exit(cs); -} - void HELPER(exception_cause)(CPUXtensaState *env, uint32_t pc, uint32_t cause) { uint32_t vector; @@ -63,7 +55,7 @@ void HELPER(exception_cause)(CPUXtensaState *env, uint32_t pc, uint32_t cause) env->sregs[EXCCAUSE] = cause; env->sregs[PS] |= PS_EXCM; - HELPER(exception)(env, vector); + cpu_raise_excp(env_cpu(env), vector); } void HELPER(exception_cause_vaddr)(CPUXtensaState *env, @@ -90,7 +82,7 @@ void HELPER(debug_exception)(CPUXtensaState *env, uint32_t pc, uint32_t cause) env->sregs[EPS2 + level - 2] = env->sregs[PS]; env->sregs[PS] = (env->sregs[PS] & ~PS_INTLEVEL) | PS_EXCM | (level << PS_INTLEVEL_SHIFT); - HELPER(exception)(env, EXC_DEBUG); + cpu_raise_excp(env_cpu(env), EXC_DEBUG); } #ifndef CONFIG_USER_ONLY @@ -113,7 +105,7 @@ void HELPER(waiti)(CPUXtensaState *env, uint32_t pc, uint32_t intlevel) } cpu->halted = 1; - HELPER(exception)(env, EXCP_HLT); + cpu_raise_excp(env_cpu(env), EXCP_HLT); } void HELPER(check_interrupts)(CPUXtensaState *env) diff --git a/target/xtensa/helper.h b/target/xtensa/helper.h index ae938ceedb8..4640d0da59a 100644 --- a/target/xtensa/helper.h +++ b/target/xtensa/helper.h @@ -1,4 +1,3 @@ -DEF_HELPER_2(exception, noreturn, env, i32) DEF_HELPER_3(exception_cause, noreturn, env, i32, i32) DEF_HELPER_4(exception_cause_vaddr, noreturn, env, i32, i32, i32) DEF_HELPER_3(debug_exception, noreturn, env, i32, i32) diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c index db48f0c562a..05c73bef99d 100644 --- a/target/xtensa/translate.c +++ b/target/xtensa/translate.c @@ -307,7 +307,7 @@ static void gen_yield(DisasContext *dc) { tcg_gen_st_i32(tcg_constant_i32(0), tcg_env, offsetof(CPUXtensaState, yield_needed)); - gen_helper_exception(tcg_env, tcg_constant_i32(EXCP_YIELD)); + gen_helper_raise_excp(tcg_env, tcg_constant_i32(EXCP_YIELD)); } static void gen_exception_cause(DisasContext *dc, uint32_t cause) diff --git a/target/xtensa/win_helper.c b/target/xtensa/win_helper.c index 4b25f8f4de7..b86a05d6203 100644 --- a/target/xtensa/win_helper.c +++ b/target/xtensa/win_helper.c @@ -27,6 +27,7 @@ #include "qemu/osdep.h" #include "qemu/log.h" +#include "accel/tcg/cpu-loop.h" #include "cpu.h" #include "exec/helper-proto.h" #include "qemu/host-utils.h" @@ -125,13 +126,13 @@ void HELPER(window_check)(CPUXtensaState *env, uint32_t pc, uint32_t w) switch (ctz32(windowstart >> n)) { case 0: - HELPER(exception)(env, EXC_WINDOW_OVERFLOW4); + cpu_raise_excp(env_cpu(env), EXC_WINDOW_OVERFLOW4); break; case 1: - HELPER(exception)(env, EXC_WINDOW_OVERFLOW8); + cpu_raise_excp(env_cpu(env), EXC_WINDOW_OVERFLOW8); break; default: - HELPER(exception)(env, EXC_WINDOW_OVERFLOW12); + cpu_raise_excp(env_cpu(env), EXC_WINDOW_OVERFLOW12); break; } } @@ -174,11 +175,11 @@ void HELPER(test_underflow_retw)(CPUXtensaState *env, uint32_t pc) env->sregs[EPC1] = env->pc = pc; if (n == 1) { - HELPER(exception)(env, EXC_WINDOW_UNDERFLOW4); + cpu_raise_excp(env_cpu(env), EXC_WINDOW_UNDERFLOW4); } else if (n == 2) { - HELPER(exception)(env, EXC_WINDOW_UNDERFLOW8); + cpu_raise_excp(env_cpu(env), EXC_WINDOW_UNDERFLOW8); } else if (n == 3) { - HELPER(exception)(env, EXC_WINDOW_UNDERFLOW12); + cpu_raise_excp(env_cpu(env), EXC_WINDOW_UNDERFLOW12); } } } -- 2.52.0.windows.1
