target/arm: Hyp mode R14 is shared with User and System
commit593cfa2b637b92d37eef949653840dc065cdb960
authorPeter Maydell <peter.maydell@linaro.org>
Tue, 13 Nov 2018 10:47:59 +0000 (13 10:47 +0000)
committerPeter Maydell <peter.maydell@linaro.org>
Tue, 13 Nov 2018 10:47:59 +0000 (13 10:47 +0000)
tree9285153a8e81dcc7ff3de6bc97bc7e5936650129
parent89430fc6f80a5aef1d4cbd6fc26b40c30793786c
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
target/arm/helper.c
target/arm/internals.h
target/arm/kvm32.c
target/arm/op_helper.c