[U-Boot] [PATCH 1/3] ARM: HYP/non-sec: save and restore stack

Mark Kettenis mark.kettenis at xs4all.nl
Tue Jun 12 20:17:27 UTC 2018


> From: Alexander Graf <agraf at 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 at 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)
> >  
> > 
> 


More information about the U-Boot mailing list