target/arm: Rebuild hflags for M-profile
Continue setting, but not relying upon, env->hflags. Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20191023150057.25731-21-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
2e5dcf3628
commit
873be7b69d
@ -494,6 +494,7 @@ void HELPER(v7m_bxns)(CPUARMState *env, uint32_t dest)
|
||||
switch_v7m_security_state(env, dest & 1);
|
||||
env->thumb = 1;
|
||||
env->regs[15] = dest & ~1;
|
||||
arm_rebuild_hflags(env);
|
||||
}
|
||||
|
||||
void HELPER(v7m_blxns)(CPUARMState *env, uint32_t dest)
|
||||
@ -555,6 +556,7 @@ void HELPER(v7m_blxns)(CPUARMState *env, uint32_t dest)
|
||||
switch_v7m_security_state(env, 0);
|
||||
env->thumb = 1;
|
||||
env->regs[15] = dest;
|
||||
arm_rebuild_hflags(env);
|
||||
}
|
||||
|
||||
static uint32_t *get_v7m_sp_ptr(CPUARMState *env, bool secure, bool threadmode,
|
||||
@ -895,6 +897,7 @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr, bool dotailchain,
|
||||
env->regs[14] = lr;
|
||||
env->regs[15] = addr & 0xfffffffe;
|
||||
env->thumb = addr & 1;
|
||||
arm_rebuild_hflags(env);
|
||||
}
|
||||
|
||||
static void v7m_update_fpccr(CPUARMState *env, uint32_t frameptr,
|
||||
@ -1765,6 +1768,7 @@ static void do_v7m_exception_exit(ARMCPU *cpu)
|
||||
|
||||
/* Otherwise, we have a successful exception exit. */
|
||||
arm_clear_exclusive(env);
|
||||
arm_rebuild_hflags(env);
|
||||
qemu_log_mask(CPU_LOG_INT, "...successful exception return\n");
|
||||
}
|
||||
|
||||
@ -1837,6 +1841,7 @@ static bool do_v7m_function_return(ARMCPU *cpu)
|
||||
xpsr_write(env, 0, XPSR_IT);
|
||||
env->thumb = newpc & 1;
|
||||
env->regs[15] = newpc & ~1;
|
||||
arm_rebuild_hflags(env);
|
||||
|
||||
qemu_log_mask(CPU_LOG_INT, "...function return successful\n");
|
||||
return true;
|
||||
@ -1959,6 +1964,7 @@ static bool v7m_handle_execute_nsc(ARMCPU *cpu)
|
||||
switch_v7m_security_state(env, true);
|
||||
xpsr_write(env, 0, XPSR_IT);
|
||||
env->regs[15] += 4;
|
||||
arm_rebuild_hflags(env);
|
||||
return true;
|
||||
|
||||
gen_invep:
|
||||
|
@ -8327,7 +8327,7 @@ static bool trans_MRS_v7m(DisasContext *s, arg_MRS_v7m *a)
|
||||
|
||||
static bool trans_MSR_v7m(DisasContext *s, arg_MSR_v7m *a)
|
||||
{
|
||||
TCGv_i32 addr, reg;
|
||||
TCGv_i32 addr, reg, el;
|
||||
|
||||
if (!arm_dc_feature(s, ARM_FEATURE_M)) {
|
||||
return false;
|
||||
@ -8337,6 +8337,9 @@ static bool trans_MSR_v7m(DisasContext *s, arg_MSR_v7m *a)
|
||||
gen_helper_v7m_msr(cpu_env, addr, reg);
|
||||
tcg_temp_free_i32(addr);
|
||||
tcg_temp_free_i32(reg);
|
||||
el = tcg_const_i32(s->current_el);
|
||||
gen_helper_rebuild_hflags_m32(cpu_env, el);
|
||||
tcg_temp_free_i32(el);
|
||||
gen_lookup_tb(s);
|
||||
return true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user