@@ -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)
@@ -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)
@@ -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)
@@ -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);
}
}
}
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 <luoyonggang@gmail.com> --- 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(-)