target/arm: Introduce helper_exception_with_syndrome
With the helper we can use exception_target_el at runtime, instead of default_exception_el at translate time. While we're at it, remove the DisasContext parameter from gen_exception, as it is no longer used. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20220609202901.1177572-20-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
d6d7f818a9
commit
eeaf596022
@ -45,6 +45,7 @@ DEF_HELPER_FLAGS_2(usad8, TCG_CALL_NO_RWG_SE, i32, i32, i32)
|
|||||||
DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_NO_RWG_SE,
|
DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_NO_RWG_SE,
|
||||||
i32, i32, i32, i32)
|
i32, i32, i32, i32)
|
||||||
DEF_HELPER_2(exception_internal, noreturn, env, 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_4(exception_with_syndrome_el, noreturn, env, i32, i32, i32)
|
||||||
DEF_HELPER_2(exception_bkpt_insn, noreturn, env, i32)
|
DEF_HELPER_2(exception_bkpt_insn, noreturn, env, i32)
|
||||||
DEF_HELPER_2(exception_swstep, noreturn, env, i32)
|
DEF_HELPER_2(exception_swstep, noreturn, env, i32)
|
||||||
|
@ -399,6 +399,16 @@ void HELPER(exception_with_syndrome_el)(CPUARMState *env, uint32_t excp,
|
|||||||
raise_exception(env, excp, syndrome, target_el);
|
raise_exception(env, excp, syndrome, target_el);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Raise an exception with the specified syndrome register value
|
||||||
|
* to the default target el.
|
||||||
|
*/
|
||||||
|
void HELPER(exception_with_syndrome)(CPUARMState *env, uint32_t excp,
|
||||||
|
uint32_t syndrome)
|
||||||
|
{
|
||||||
|
raise_exception(env, excp, syndrome, exception_target_el(env));
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t HELPER(cpsr_read)(CPUARMState *env)
|
uint32_t HELPER(cpsr_read)(CPUARMState *env)
|
||||||
{
|
{
|
||||||
return cpsr_read(env) & ~CPSR_EXEC;
|
return cpsr_read(env) & ~CPSR_EXEC;
|
||||||
|
@ -1097,9 +1097,10 @@ static void gen_exception_el(int excp, uint32_t syndrome, uint32_t target_el)
|
|||||||
gen_exception_el_v(excp, syndrome, tcg_constant_i32(target_el));
|
gen_exception_el_v(excp, syndrome, tcg_constant_i32(target_el));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gen_exception(DisasContext *s, int excp, uint32_t syndrome)
|
static void gen_exception(int excp, uint32_t syndrome)
|
||||||
{
|
{
|
||||||
gen_exception_el(excp, syndrome, default_exception_el(s));
|
gen_helper_exception_with_syndrome(cpu_env, tcg_constant_i32(excp),
|
||||||
|
tcg_constant_i32(syndrome));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gen_exception_insn_el_v(DisasContext *s, uint64_t pc, int excp,
|
static void gen_exception_insn_el_v(DisasContext *s, uint64_t pc, int excp,
|
||||||
@ -1123,7 +1124,14 @@ void gen_exception_insn_el(DisasContext *s, uint64_t pc, int excp,
|
|||||||
|
|
||||||
void gen_exception_insn(DisasContext *s, uint64_t pc, int excp, uint32_t syn)
|
void gen_exception_insn(DisasContext *s, uint64_t pc, int excp, uint32_t syn)
|
||||||
{
|
{
|
||||||
gen_exception_insn_el(s, pc, excp, syn, default_exception_el(s));
|
if (s->aarch64) {
|
||||||
|
gen_a64_set_pc_im(pc);
|
||||||
|
} else {
|
||||||
|
gen_set_condexec(s);
|
||||||
|
gen_set_pc_im(s, pc);
|
||||||
|
}
|
||||||
|
gen_exception(excp, syn);
|
||||||
|
s->base.is_jmp = DISAS_NORETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syn)
|
static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syn)
|
||||||
@ -9766,7 +9774,7 @@ static void arm_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||||||
switch (dc->base.is_jmp) {
|
switch (dc->base.is_jmp) {
|
||||||
case DISAS_SWI:
|
case DISAS_SWI:
|
||||||
gen_ss_advance(dc);
|
gen_ss_advance(dc);
|
||||||
gen_exception(dc, EXCP_SWI, syn_aa32_svc(dc->svc_imm, dc->thumb));
|
gen_exception(EXCP_SWI, syn_aa32_svc(dc->svc_imm, dc->thumb));
|
||||||
break;
|
break;
|
||||||
case DISAS_HVC:
|
case DISAS_HVC:
|
||||||
gen_ss_advance(dc);
|
gen_ss_advance(dc);
|
||||||
@ -9835,7 +9843,7 @@ static void arm_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||||||
gen_helper_yield(cpu_env);
|
gen_helper_yield(cpu_env);
|
||||||
break;
|
break;
|
||||||
case DISAS_SWI:
|
case DISAS_SWI:
|
||||||
gen_exception(dc, EXCP_SWI, syn_aa32_svc(dc->svc_imm, dc->thumb));
|
gen_exception(EXCP_SWI, syn_aa32_svc(dc->svc_imm, dc->thumb));
|
||||||
break;
|
break;
|
||||||
case DISAS_HVC:
|
case DISAS_HVC:
|
||||||
gen_exception_el(EXCP_HVC, syn_aa32_hvc(dc->svc_imm), 2);
|
gen_exception_el(EXCP_HVC, syn_aa32_hvc(dc->svc_imm), 2);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user