ARM: virt: allow the kernel to be entered in HYP mode
This patch does two things: * Ensure that asynchronous aborts are masked at kernel entry. The bootloader should be masking these anyway, but this reduces the damage window just in case it doesn't. * Enter svc mode via exception return to ensure that CPU state is properly serialised. This does not matter when switching from an ordinary privileged mode ("PL1" modes in ARMv7-AR rev C parlance), but it potentially does matter when switching from a another privileged mode such as hyp mode. This should allow the kernel to boot safely either from svc mode or hyp mode, even if no support for use of the ARM Virtualization Extensions is built into the kernel. Signed-off-by: Dave Martin <dave.martin@linaro.org> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
This commit is contained in:

committed by
Marc Zyngier

parent
b9a348cb12
commit
80c59dafb1
@@ -22,6 +22,7 @@
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/domain.h>
|
||||
#include <asm/opcodes-virt.h>
|
||||
|
||||
#define IOMEM(x) (x)
|
||||
|
||||
@@ -239,6 +240,33 @@
|
||||
.endm
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Helper macro to enter SVC mode cleanly and mask interrupts. reg is
|
||||
* a scratch register for the macro to overwrite.
|
||||
*
|
||||
* This macro is intended for forcing the CPU into SVC mode at boot time.
|
||||
* you cannot return to the original mode.
|
||||
*
|
||||
* Beware, it also clobers LR.
|
||||
*/
|
||||
.macro safe_svcmode_maskall reg:req
|
||||
mrs \reg , cpsr
|
||||
mov lr , \reg
|
||||
and lr , lr , #MODE_MASK
|
||||
cmp lr , #HYP_MODE
|
||||
orr \reg , \reg , #PSR_A_BIT | PSR_I_BIT | PSR_F_BIT
|
||||
bic \reg , \reg , #MODE_MASK
|
||||
orr \reg , \reg , #SVC_MODE
|
||||
THUMB( orr \reg , \reg , #PSR_T_BIT )
|
||||
msr spsr_cxsf, \reg
|
||||
adr lr, BSYM(2f)
|
||||
bne 1f
|
||||
__MSR_ELR_HYP(14)
|
||||
__ERET
|
||||
1: movs pc, lr
|
||||
2:
|
||||
.endm
|
||||
|
||||
/*
|
||||
* STRT/LDRT access macros with ARM and Thumb-2 variants
|
||||
*/
|
||||
|
Reference in New Issue
Block a user