target/arm: Allow explicit writes to CONTROL.SPSEL in Handler mode
In ARMv7M the CPU ignores explicit writes to CONTROL.SPSEL in Handler mode. In v8M the behaviour is slightly different: writes to the bit are permitted but will have no effect. We've already done the hard work to handle the value in CONTROL.SPSEL being out of sync with what stack pointer is actually in use, so all we need to do to fix this last loose end is to update the condition we use to guard whether we call write_v7m_control_spsel() on the register write. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 1512153879-5291-3-git-send-email-peter.maydell@linaro.org
This commit is contained in:
parent
1169d3aa5b
commit
83d7f86d3d
|
@ -10091,8 +10091,11 @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
|
|||
* thread mode; other bits can be updated by any privileged code.
|
||||
* write_v7m_control_spsel() deals with updating the SPSEL bit in
|
||||
* env->v7m.control, so we only need update the others.
|
||||
* For v7M, we must just ignore explicit writes to SPSEL in handler
|
||||
* mode; for v8M the write is permitted but will have no effect.
|
||||
*/
|
||||
if (!arm_v7m_is_handler_mode(env)) {
|
||||
if (arm_feature(env, ARM_FEATURE_V8) ||
|
||||
!arm_v7m_is_handler_mode(env)) {
|
||||
write_v7m_control_spsel(env, (val & R_V7M_CONTROL_SPSEL_MASK) != 0);
|
||||
}
|
||||
env->v7m.control[env->v7m.secure] &= ~R_V7M_CONTROL_NPRIV_MASK;
|
||||
|
|
Loading…
Reference in a new issue