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

2018-06-13 Thread Mark Kettenis
> From: Alexander Graf 
> Date: Tue, 12 Jun 2018 22:32:38 +0200
> 
> On 12.06.18 22:17, Mark Kettenis wrote:
> >> From: Alexander Graf 
> >> 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 
> >>
> >> 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.
> 
> Well, the question is whether it's secure or non-secure memory. Usually
> the DRAM controller can be configured to have a window of RAM only
> available to secure and I'd certainly hope that at least the U-Boot
> parts that are preserved in EL3 live in such a secured area :)

The U-Boot PSCI implementation ends up in a special memory region and
uses a separate stack in that same region.  Whether that memory region
is marked as secure in hardware depends on board-specific code.  On
the i.MX7D board I'm playing with it ends up in on on-chip RAM but I'm
not sure the current U-Boot code actually marks that region as secure.
In principle the PSCI code is all that is preserved for MON/EL3.  My
diffs really don't change how that works.  The code is already there
and it already works (I assume) when booting Linux kernels in
non-secure mode the traditional (non-EFI) way.
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


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

2018-06-12 Thread Alexander Graf


On 12.06.18 22:17, Mark Kettenis wrote:
>> From: Alexander Graf 
>> 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 
>>
>> 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.

Well, the question is whether it's secure or non-secure memory. Usually
the DRAM controller can be configured to have a window of RAM only
available to secure and I'd certainly hope that at least the U-Boot
parts that are preserved in EL3 live in such a secured area :)


Alex
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


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

2018-06-12 Thread Mark Kettenis
> From: Alexander Graf 
> 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 
> 
> 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)
> >  
> > 
> 
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


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

2018-06-12 Thread Alexander Graf


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 

Can we be sure that the stack in MON is usable from HYP?

Alex

> ---
>  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)
>  
> 
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


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

2018-06-12 Thread Mark Kettenis
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 
---
 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)
 
-- 
2.16.2

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot