mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
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
1 changed files with 22 additions and 1 deletions
|
@ -1031,6 +1031,8 @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
|
||||||
"AArch32 EL%d PC 0x%" PRIx32 "\n",
|
"AArch32 EL%d PC 0x%" PRIx32 "\n",
|
||||||
cur_el, new_el, env->regs[15]);
|
cur_el, new_el, env->regs[15]);
|
||||||
} else {
|
} else {
|
||||||
|
int tbii;
|
||||||
|
|
||||||
env->aarch64 = 1;
|
env->aarch64 = 1;
|
||||||
spsr &= aarch64_pstate_valid_mask(&env_archcpu(env)->isar);
|
spsr &= aarch64_pstate_valid_mask(&env_archcpu(env)->isar);
|
||||||
pstate_write(env, spsr);
|
pstate_write(env, spsr);
|
||||||
|
@ -1038,8 +1040,27 @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
|
||||||
env->pstate &= ~PSTATE_SS;
|
env->pstate &= ~PSTATE_SS;
|
||||||
}
|
}
|
||||||
aarch64_restore_sp(env, new_el);
|
aarch64_restore_sp(env, new_el);
|
||||||
env->pc = new_pc;
|
|
||||||
helper_rebuild_hflags_a64(env, new_el);
|
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 "
|
qemu_log_mask(CPU_LOG_INT, "Exception return from AArch64 EL%d to "
|
||||||
"AArch64 EL%d PC 0x%" PRIx64 "\n",
|
"AArch64 EL%d PC 0x%" PRIx64 "\n",
|
||||||
cur_el, new_el, env->pc);
|
cur_el, new_el, env->pc);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue