mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
target/arm: Hyp mode R14 is shared with User and System
Hyp mode is an exception to the general rule that each AArch32 mode has its own r13, r14 and SPSR -- it has a banked r13 and SPSR but shares its r14 with User and System mode. We were incorrectly implementing it as banked, which meant that on entry to Hyp mode r14 was 0 rather than the USR/SYS r14. We provide a new function r14_bank_number() which is like the existing bank_number() but provides the index into env->banked_r14[]; bank_number() provides the index to use for env->banked_r13[] and env->banked_cpsr[]. All the points in the code that were using bank_number() to index into env->banked_r14[] are updated for consintency: * switch_mode() -- this is the only place where we fix an actual bug * aarch64_sync_32_to_64() and aarch64_sync_64_to_32(): no behavioural change as we already special-cased Hyp R14 * kvm32.c: no behavioural change since the guest can't ever be in Hyp mode, but conceptually the right thing to do * msr_banked()/mrs_banked(): we can never get to the case that accesses banked_r14[] with tgtmode == ARM_CPU_MODE_HYP, so no behavioural change Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Message-id: 20181109173553.22341-2-peter.maydell@linaro.org
This commit is contained in:
parent
89430fc6f8
commit
593cfa2b63
4 changed files with 35 additions and 18 deletions
|
@ -145,6 +145,22 @@ static inline int bank_number(int mode)
|
|||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
/**
|
||||
* r14_bank_number: Map CPU mode onto register bank for r14
|
||||
*
|
||||
* Given an AArch32 CPU mode, return the index into the saved register
|
||||
* banks to use for the R14 (LR) in that mode. This is the same as
|
||||
* bank_number(), except for the special case of Hyp mode, where
|
||||
* R14 is shared with USR and SYS, unlike its R13 and SPSR.
|
||||
* This should be used as the index into env->banked_r14[], and
|
||||
* bank_number() used for the index into env->banked_r13[] and
|
||||
* env->banked_spsr[].
|
||||
*/
|
||||
static inline int r14_bank_number(int mode)
|
||||
{
|
||||
return (mode == ARM_CPU_MODE_HYP) ? BANK_USRSYS : bank_number(mode);
|
||||
}
|
||||
|
||||
void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu);
|
||||
void arm_translate_init(void);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue