
From: Alexander Graf agraf@suse.de Date: Tue, 12 Jun 2018 20:46:02 +0200
On 12.06.18 19:27, Mark Kettenis wrote:
The current code that switches into HYP mode doesn't bother to set up a stack for HYP mode. This doesn't work for EFI applications as they expect a usable stack. Fix this by saving the stack pointer before switching and use it to set SP_hyp from monitor. This restores the stack pointer when we drop into HYP mode.
Signed-off-by: Mark Kettenis kettenis@openbsd.org
Can we be sure that the stack in MON is usable from HYP?
I think so. It is the stack that U-Boot sets up for itself in normal memory. As far as I can tell arm64 re-uses this stack when dropping down into EL2 as well.
arch/arm/cpu/armv7/nonsec_virt.S | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/arch/arm/cpu/armv7/nonsec_virt.S b/arch/arm/cpu/armv7/nonsec_virt.S index 56bdba1d38..246d817340 100644 --- a/arch/arm/cpu/armv7/nonsec_virt.S +++ b/arch/arm/cpu/armv7/nonsec_virt.S @@ -52,9 +52,9 @@ _secure_monitor: bl psci_stack_setup
@ Configure the PSCI backend
- push {r0, r1, r2, ip}
- push {r0, r1, r2, r3, ip} bl psci_arch_init
- pop {r0, r1, r2, ip}
- pop {r0, r1, r2, r3, ip}
#endif
#ifdef CONFIG_ARM_ERRATA_773022 @@ -80,6 +80,7 @@ _secure_monitor: #ifdef CONFIG_ARMV7_VIRT orreq r5, r5, #0x100 @ allow HVC instruction moveq r6, #HYP_MODE @ Enter the kernel as HYP
- msreq sp_hyp, r3 @ restore saved stack
#endif
mcr p15, 0, r5, c1, c1, 0 @ write SCR (with NS bit set) @@ -106,6 +107,7 @@ ENTRY(_do_nonsec_entry) mov r0, r1 mov r1, r2 mov r2, r3
- mov r3, sp smc #0
ENDPROC(_do_nonsec_entry)