target/arm: Apply TBI to ESR_ELx in helper_exception_return
We missed this case within AArch64.ExceptionReturn. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20200302175829.2183-5-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
20dc67c947
commit
d4564afe14
@ -1031,6 +1031,8 @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
|
||||
"AArch32 EL%d PC 0x%" PRIx32 "\n",
|
||||
cur_el, new_el, env->regs[15]);
|
||||
} else {
|
||||
int tbii;
|
||||
|
||||
env->aarch64 = 1;
|
||||
spsr &= aarch64_pstate_valid_mask(&env_archcpu(env)->isar);
|
||||
pstate_write(env, spsr);
|
||||
@ -1038,8 +1040,27 @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
|
||||
env->pstate &= ~PSTATE_SS;
|
||||
}
|
||||
aarch64_restore_sp(env, new_el);
|
||||
env->pc = new_pc;
|
||||
helper_rebuild_hflags_a64(env, new_el);
|
||||
|
||||
/*
|
||||
* Apply TBI to the exception return address. We had to delay this
|
||||
* until after we selected the new EL, so that we could select the
|
||||
* correct TBI+TBID bits. This is made easier by waiting until after
|
||||
* the hflags rebuild, since we can pull the composite TBII field
|
||||
* from there.
|
||||
*/
|
||||
tbii = FIELD_EX32(env->hflags, TBFLAG_A64, TBII);
|
||||
if ((tbii >> extract64(new_pc, 55, 1)) & 1) {
|
||||
/* TBI is enabled. */
|
||||
int core_mmu_idx = cpu_mmu_index(env, false);
|
||||
if (regime_has_2_ranges(core_to_aa64_mmu_idx(core_mmu_idx))) {
|
||||
new_pc = sextract64(new_pc, 0, 56);
|
||||
} else {
|
||||
new_pc = extract64(new_pc, 0, 56);
|
||||
}
|
||||
}
|
||||
env->pc = new_pc;
|
||||
|
||||
qemu_log_mask(CPU_LOG_INT, "Exception return from AArch64 EL%d to "
|
||||
"AArch64 EL%d PC 0x%" PRIx64 "\n",
|
||||
cur_el, new_el, env->pc);
|
||||
|
Loading…
Reference in New Issue
Block a user