@@ -45,7 +45,6 @@ DEF_HELPER_FLAGS_2(usad8, TCG_CALL_NO_RWG_SE, i32, i32, i32)
DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_NO_RWG_SE,
i32, i32, i32, i32)
-DEF_HELPER_2(exception_internal, noreturn, env, i32)
DEF_HELPER_3(exception_with_syndrome, noreturn, env, i32, i32)
DEF_HELPER_4(exception_with_syndrome_el, noreturn, env, i32, i32, i32)
DEF_HELPER_2(exception_bkpt_insn, noreturn, env, i32)
@@ -18,6 +18,7 @@
#include "exec/page-protection.h"
#ifdef CONFIG_TCG
#include "accel/tcg/cpu-ldst-common.h"
+#include "accel/tcg/cpu-loop.h"
#include "semihosting/common-semi.h"
#endif
#if !defined(CONFIG_USER_ONLY)
@@ -575,7 +576,7 @@ void HELPER(v7m_bxns)(CPUARMState *env, uint32_t dest)
*/
env->regs[15] = dest & ~1;
env->thumb = dest & 1;
- HELPER(exception_internal)(env, EXCP_EXCEPTION_EXIT);
+ cpu_loop_exit_excp(env_cpu(env), EXCP_EXCEPTION_EXIT, 0);
/* notreached */
}
@@ -64,10 +64,9 @@ void raise_exception(CPUARMState *env, uint32_t excp,
}
assert(!excp_is_internal(excp));
- cs->exception_index = excp;
env->exception.syndrome = syndrome;
env->exception.target_el = target_el;
- cpu_loop_exit(cs);
+ cpu_loop_exit_excp(cs, excp, 0);
}
void raise_exception_ra(CPUARMState *env, uint32_t excp, uint64_t syndrome,
@@ -399,9 +398,8 @@ void HELPER(wfi)(CPUARMState *env, uint32_t insn_len)
}
qatomic_set(&env->halt_reason, HALT_WFI);
- cs->exception_index = EXCP_HLT;
cs->halted = 1;
- cpu_loop_exit(cs);
+ cpu_loop_exit_excp(cs, EXCP_HLT, 0);
#endif
}
@@ -461,9 +459,8 @@ void HELPER(wfit)(CPUARMState *env, uint32_t rd)
timer_mod(cpu->wfxt_timer, nexttick);
}
qatomic_set(&env->halt_reason, HALT_WFI);
- cs->exception_index = EXCP_HLT;
cs->halted = 1;
- cpu_loop_exit(cs);
+ cpu_loop_exit_excp(cs, EXCP_HLT, 0);
#endif
}
@@ -630,9 +627,8 @@ void HELPER(wfe)(CPUARMState *env, uint32_t insn_len)
}
qatomic_set(&env->halt_reason, HALT_WFE);
- cs->exception_index = EXCP_HLT;
cs->halted = 1;
- cpu_loop_exit(cs);
+ cpu_loop_exit_excp(cs, EXCP_HLT, 0);
#endif
}
@@ -724,9 +720,8 @@ void HELPER(wfet)(CPUARMState *env, uint32_t rd)
}
qatomic_set(&env->halt_reason, HALT_WFE);
- cs->exception_index = EXCP_HLT;
cs->halted = 1;
- cpu_loop_exit(cs);
+ cpu_loop_exit_excp(cs, EXCP_HLT, 0);
#endif
}
@@ -738,23 +733,7 @@ void HELPER(yield)(CPUARMState *env)
* that the guest is currently busy-looping. Yield control back to the
* top level loop so that a more deserving VCPU has a chance to run.
*/
- cs->exception_index = EXCP_YIELD;
- cpu_loop_exit(cs);
-}
-
-/* Raise an internal-to-QEMU exception. This is limited to only
- * those EXCP values which are special cases for QEMU to interrupt
- * execution and not to be used for exceptions which are passed to
- * the guest (those must all have syndrome information and thus should
- * use exception_with_syndrome*).
- */
-void HELPER(exception_internal)(CPUARMState *env, uint32_t excp)
-{
- CPUState *cs = env_cpu(env);
-
- assert(excp_is_internal(excp));
- cs->exception_index = excp;
- cpu_loop_exit(cs);
+ cpu_loop_exit_excp(cs, EXCP_YIELD, 0);
}
/* Raise an exception with the specified syndrome register value */
@@ -379,7 +379,7 @@ static void gen_rebuild_hflags(DisasContext *s, bool new_el)
void gen_exception_internal(int excp)
{
assert(excp_is_internal(excp));
- gen_helper_exception_internal(tcg_env, tcg_constant_i32(excp));
+ gen_helper_raise_excp(tcg_env, tcg_constant_i32(excp));
}
static void gen_singlestep_exception(DisasContext *s)
Switch gen_exception_internal to raise_excp, and drop TCG exception_internal. Keep syndrome helpers. Fold leftover C exits into cpu_loop_exit_excp. Keep arm_raise_exception_ra via restore then arm_raise_exception. Signed-off-by: Yonggang Luo <luoyonggang@gmail.com> --- target/arm/tcg/helper-defs.h | 1 - target/arm/tcg/m_helper.c | 3 ++- target/arm/tcg/op_helper.c | 33 ++++++--------------------------- target/arm/tcg/translate.c | 2 +- 4 files changed, 9 insertions(+), 30 deletions(-)