mirror of
https://github.com/yuzu-emu/unicorn
synced 2024-11-24 19:48:12 +00:00
target/arm: Use correct mmu_idx for exception-return unstacking
For M-profile exception returns, the mmu index to use for exception return unstacking is supposed to be that of wherever we are returning to: * if returning to handler mode, privileged * if returning to thread mode, privileged or unprivileged depending on CONTROL.nPRIV for the destination security state We were passing the wrong thing as the 'priv' argument to arm_v7m_mmu_idx_for_secstate_and_priv(). The effect was that guests which programmed the MPU to behave differently for privileged and unprivileged code could get spurious MemManage Unstack exceptions. Backports commit 2b83714d4ea659899069a4b94aa2dfadc847a013 from qemu
This commit is contained in:
parent
ee24dff90c
commit
55985b40f8
1 changed files with 3 additions and 1 deletions
|
@ -6369,9 +6369,11 @@ static void do_v7m_exception_exit(ARMCPU *cpu)
|
|||
uint32_t frameptr = *frame_sp_p;
|
||||
bool pop_ok = true;
|
||||
ARMMMUIdx mmu_idx;
|
||||
bool return_to_priv = return_to_handler ||
|
||||
!(env->v7m.control[return_to_secure] & R_V7M_CONTROL_NPRIV_MASK);
|
||||
|
||||
mmu_idx = arm_v7m_mmu_idx_for_secstate_and_priv(env, return_to_secure,
|
||||
!return_to_handler);
|
||||
return_to_priv);
|
||||
|
||||
if (!QEMU_IS_ALIGNED(frameptr, 8) &&
|
||||
arm_feature(env, ARM_FEATURE_V8)) {
|
||||
|
|
Loading…
Reference in a new issue