All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y
@ 2018-06-12 17:27 Mark Kettenis
  2018-06-12 17:27 ` [U-Boot] [PATCH 1/3] ARM: HYP/non-sec: save and restore stack Mark Kettenis
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Mark Kettenis @ 2018-06-12 17:27 UTC (permalink / raw)
  To: u-boot

This series makes it possible to run EFI applications in non-secure
mode.  It allows me to run OpenBSD on the imx7d-pico-pi board while
using the PSCI implementation provided by U-Boot.

Mark Kettenis (3):
  ARM: HYP/non-sec: save and restore stack
  efi_loader: ARM: run EFI payloads non-secure
  Revert "efi_loader: no support for ARMV7_NONSEC=y"

 arch/arm/cpu/armv7/nonsec_virt.S |  6 ++++--
 cmd/bootefi.c                    | 32 ++++++++++++++++++++++++++++++++
 doc/README.uefi                  |  2 --
 lib/efi_loader/Kconfig           |  2 --
 4 files changed, 36 insertions(+), 6 deletions(-)

-- 
2.16.2

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH 1/3] ARM: HYP/non-sec: save and restore stack
  2018-06-12 17:27 [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y Mark Kettenis
@ 2018-06-12 17:27 ` Mark Kettenis
  2018-06-12 18:46   ` Alexander Graf
  2018-06-12 17:27 ` [U-Boot] [PATCH 2/3] efi_loader: ARM: run EFI payloads non-secure Mark Kettenis
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 12+ messages in thread
From: Mark Kettenis @ 2018-06-12 17:27 UTC (permalink / raw)
  To: u-boot

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>
---
 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

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH 2/3] efi_loader: ARM: run EFI payloads non-secure
  2018-06-12 17:27 [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y Mark Kettenis
  2018-06-12 17:27 ` [U-Boot] [PATCH 1/3] ARM: HYP/non-sec: save and restore stack Mark Kettenis
@ 2018-06-12 17:27 ` Mark Kettenis
  2018-06-12 18:49   ` Alexander Graf
  2018-06-12 17:27 ` [U-Boot] [PATCH 3/3] Revert "efi_loader: no support for ARMV7_NONSEC=y" Mark Kettenis
  2018-06-12 18:00 ` [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y Heinrich Schuchardt
  3 siblings, 1 reply; 12+ messages in thread
From: Mark Kettenis @ 2018-06-12 17:27 UTC (permalink / raw)
  To: u-boot

If desired (and possible) switch into HYP mode or non-secure SVC mode
before calling the entry point of an EFI application.  This allows
U-Boot to provide a usable PSCI implementation and makes it possible
to boot kernels into hypervisor mode using an EFI bootloader.

Based on diffs from Heinrich Schuchardt and Alexander Graf.

Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
---
 cmd/bootefi.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index 707d159bac..a5d144d9a4 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -20,6 +20,11 @@
 #include <asm-generic/unaligned.h>
 #include <linux/linkage.h>
 
+#ifdef CONFIG_ARM
+#include <asm/armv7.h>
+#include <asm/secure.h>
+#endif
+
 DECLARE_GLOBAL_DATA_PTR;
 
 #define OBJ_LIST_NOT_INITIALIZED 1
@@ -189,6 +194,18 @@ static efi_status_t efi_run_in_el2(EFIAPI efi_status_t (*entry)(
 }
 #endif
 
+#ifdef CONFIG_ARMV7_NONSEC
+static efi_status_t efi_run_in_hyp(EFIAPI efi_status_t (*entry)(
+			efi_handle_t image_handle, struct efi_system_table *st),
+			efi_handle_t image_handle, struct efi_system_table *st)
+{
+	/* Enable caches again */
+	dcache_enable();
+
+	return efi_do_enter(image_handle, st, entry);
+}
+#endif
+
 /* Carve out DT reserved memory ranges */
 static efi_status_t efi_carve_out_dt_rsv(void *fdt)
 {
@@ -338,6 +355,21 @@ static efi_status_t do_bootefi_exec(void *efi,
 	}
 #endif
 
+#ifdef CONFIG_ARMV7_NONSEC
+	if (armv7_boot_nonsec()) {
+		dcache_disable();	/* flush cache before switch to HYP */
+
+		armv7_init_nonsec();
+		secure_ram_addr(_do_nonsec_entry)(efi_run_in_hyp,
+				(uintptr_t)entry,
+				(uintptr_t)loaded_image_info_obj.handle,
+				(uintptr_t)&systab);
+
+		/* Should never reach here, efi exits with longjmp */
+		while (1) { }
+	}
+#endif
+
 	ret = efi_do_enter(loaded_image_info_obj.handle, &systab, entry);
 
 exit:
-- 
2.16.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH 3/3] Revert "efi_loader: no support for ARMV7_NONSEC=y"
  2018-06-12 17:27 [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y Mark Kettenis
  2018-06-12 17:27 ` [U-Boot] [PATCH 1/3] ARM: HYP/non-sec: save and restore stack Mark Kettenis
  2018-06-12 17:27 ` [U-Boot] [PATCH 2/3] efi_loader: ARM: run EFI payloads non-secure Mark Kettenis
@ 2018-06-12 17:27 ` Mark Kettenis
  2018-06-12 18:00 ` [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y Heinrich Schuchardt
  3 siblings, 0 replies; 12+ messages in thread
From: Mark Kettenis @ 2018-06-12 17:27 UTC (permalink / raw)
  To: u-boot

This reverts commit c524997acb3d322e1bbd36c06ad02ef589705e7c.

Booting ARMv7 in non-secure mode using bootefi works now.

Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
---
 doc/README.uefi        | 2 --
 lib/efi_loader/Kconfig | 2 --
 2 files changed, 4 deletions(-)

diff --git a/doc/README.uefi b/doc/README.uefi
index d4031ef8e8..6b9759cfed 100644
--- a/doc/README.uefi
+++ b/doc/README.uefi
@@ -329,8 +329,6 @@ This driver is only available if U-Boot is configured with
   * persistence
   * runtime support
 
-* support bootefi booting ARMv7 in non-secure mode (CONFIG_ARMV7_NONSEC=y)
-
 ## Links
 
 * [1](http://uefi.org/specifications)
diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig
index df58e633d1..ce6a09f0b4 100644
--- a/lib/efi_loader/Kconfig
+++ b/lib/efi_loader/Kconfig
@@ -1,8 +1,6 @@
 config EFI_LOADER
 	bool "Support running EFI Applications in U-Boot"
 	depends on (ARM || X86 || RISCV) && OF_LIBFDT
-	# We do not support bootefi booting ARMv7 in non-secure mode
-	depends on !ARMV7_NONSEC
 	# We need EFI_STUB_64BIT to be set on x86_64 with EFI_STUB
 	depends on !EFI_STUB || !X86_64 || EFI_STUB_64BIT
 	# We need EFI_STUB_32BIT to be set on x86_32 with EFI_STUB
-- 
2.16.2

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y
  2018-06-12 17:27 [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y Mark Kettenis
                   ` (2 preceding siblings ...)
  2018-06-12 17:27 ` [U-Boot] [PATCH 3/3] Revert "efi_loader: no support for ARMV7_NONSEC=y" Mark Kettenis
@ 2018-06-12 18:00 ` Heinrich Schuchardt
  2018-06-12 20:36   ` Mark Kettenis
  2018-06-13 22:20   ` Mark Kettenis
  3 siblings, 2 replies; 12+ messages in thread
From: Heinrich Schuchardt @ 2018-06-12 18:00 UTC (permalink / raw)
  To: u-boot

On 06/12/2018 07:27 PM, Mark Kettenis wrote:
> This series makes it possible to run EFI applications in non-secure
> mode.  It allows me to run OpenBSD on the imx7d-pico-pi board while
> using the PSCI implementation provided by U-Boot.
> 
> Mark Kettenis (3):
>   ARM: HYP/non-sec: save and restore stack
>   efi_loader: ARM: run EFI payloads non-secure
>   Revert "efi_loader: no support for ARMV7_NONSEC=y"
> 
>  arch/arm/cpu/armv7/nonsec_virt.S |  6 ++++--
>  cmd/bootefi.c                    | 32 ++++++++++++++++++++++++++++++++
>  doc/README.uefi                  |  2 --
>  lib/efi_loader/Kconfig           |  2 --
>  4 files changed, 36 insertions(+), 6 deletions(-)
> 

This is the output I got with your patches when trying to boot my BananaPi:

=> bootefi hello
Scanning disk mmc at 01c0f000.blk...
Found 3 disks
WARNING: booting without device tree
## Starting EFI application at 42000000 ...
WARNING: using memory device/image path, this may confuse some payloads!

U-Boot SPL 2018.07-rc1-D001-00104-g5b859da7ca8 (Jun 12 2018 - 19:52:34
+0200)
DRAM:

Where able to run bootefi hello on your board?
Which board are you on?

Best regards

Heinrich

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH 1/3] ARM: HYP/non-sec: save and restore stack
  2018-06-12 17:27 ` [U-Boot] [PATCH 1/3] ARM: HYP/non-sec: save and restore stack Mark Kettenis
@ 2018-06-12 18:46   ` Alexander Graf
  2018-06-12 20:17     ` Mark Kettenis
  0 siblings, 1 reply; 12+ messages in thread
From: Alexander Graf @ 2018-06-12 18:46 UTC (permalink / raw)
  To: u-boot



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?

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)
>  
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH 2/3] efi_loader: ARM: run EFI payloads non-secure
  2018-06-12 17:27 ` [U-Boot] [PATCH 2/3] efi_loader: ARM: run EFI payloads non-secure Mark Kettenis
@ 2018-06-12 18:49   ` Alexander Graf
  0 siblings, 0 replies; 12+ messages in thread
From: Alexander Graf @ 2018-06-12 18:49 UTC (permalink / raw)
  To: u-boot



On 12.06.18 19:27, Mark Kettenis wrote:
> If desired (and possible) switch into HYP mode or non-secure SVC mode
> before calling the entry point of an EFI application.  This allows
> U-Boot to provide a usable PSCI implementation and makes it possible
> to boot kernels into hypervisor mode using an EFI bootloader.
> 
> Based on diffs from Heinrich Schuchardt and Alexander Graf.
> 
> Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
> ---
>  cmd/bootefi.c | 32 ++++++++++++++++++++++++++++++++
>  1 file changed, 32 insertions(+)
> 
> diff --git a/cmd/bootefi.c b/cmd/bootefi.c
> index 707d159bac..a5d144d9a4 100644
> --- a/cmd/bootefi.c
> +++ b/cmd/bootefi.c
> @@ -20,6 +20,11 @@
>  #include <asm-generic/unaligned.h>
>  #include <linux/linkage.h>
>  
> +#ifdef CONFIG_ARM

Is this the correct guard? CONFIG_ARM is also set for AArch64 for
example. Maybe use CONFIG_ARMV7_NONSEC instead?

> +#include <asm/armv7.h>
> +#include <asm/secure.h>
> +#endif
> +
>  DECLARE_GLOBAL_DATA_PTR;
>  
>  #define OBJ_LIST_NOT_INITIALIZED 1
> @@ -189,6 +194,18 @@ static efi_status_t efi_run_in_el2(EFIAPI efi_status_t (*entry)(
>  }
>  #endif
>  
> +#ifdef CONFIG_ARMV7_NONSEC
> +static efi_status_t efi_run_in_hyp(EFIAPI efi_status_t (*entry)(
> +			efi_handle_t image_handle, struct efi_system_table *st),
> +			efi_handle_t image_handle, struct efi_system_table *st)
> +{
> +	/* Enable caches again */
> +	dcache_enable();

Are you sure the dcache_enable/disable bits do what you want? IIRC the
situation on armv7 wasn't quite as obvious.


Alex

> +
> +	return efi_do_enter(image_handle, st, entry);
> +}
> +#endif
> +
>  /* Carve out DT reserved memory ranges */
>  static efi_status_t efi_carve_out_dt_rsv(void *fdt)
>  {
> @@ -338,6 +355,21 @@ static efi_status_t do_bootefi_exec(void *efi,
>  	}
>  #endif
>  
> +#ifdef CONFIG_ARMV7_NONSEC
> +	if (armv7_boot_nonsec()) {
> +		dcache_disable();	/* flush cache before switch to HYP */
> +
> +		armv7_init_nonsec();
> +		secure_ram_addr(_do_nonsec_entry)(efi_run_in_hyp,
> +				(uintptr_t)entry,
> +				(uintptr_t)loaded_image_info_obj.handle,
> +				(uintptr_t)&systab);
> +
> +		/* Should never reach here, efi exits with longjmp */
> +		while (1) { }
> +	}
> +#endif
> +
>  	ret = efi_do_enter(loaded_image_info_obj.handle, &systab, entry);
>  
>  exit:
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH 1/3] ARM: HYP/non-sec: save and restore stack
  2018-06-12 18:46   ` Alexander Graf
@ 2018-06-12 20:17     ` Mark Kettenis
  2018-06-12 20:32       ` Alexander Graf
  0 siblings, 1 reply; 12+ messages in thread
From: Mark Kettenis @ 2018-06-12 20:17 UTC (permalink / raw)
  To: u-boot

> 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)
> >  
> > 
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH 1/3] ARM: HYP/non-sec: save and restore stack
  2018-06-12 20:17     ` Mark Kettenis
@ 2018-06-12 20:32       ` Alexander Graf
  2018-06-13 14:55         ` Mark Kettenis
  0 siblings, 1 reply; 12+ messages in thread
From: Alexander Graf @ 2018-06-12 20:32 UTC (permalink / raw)
  To: u-boot



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

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

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y
  2018-06-12 18:00 ` [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y Heinrich Schuchardt
@ 2018-06-12 20:36   ` Mark Kettenis
  2018-06-13 22:20   ` Mark Kettenis
  1 sibling, 0 replies; 12+ messages in thread
From: Mark Kettenis @ 2018-06-12 20:36 UTC (permalink / raw)
  To: u-boot

> From: Heinrich Schuchardt <xypron.glpk@gmx.de>
> Date: Tue, 12 Jun 2018 20:00:28 +0200
> 
> On 06/12/2018 07:27 PM, Mark Kettenis wrote:
> > This series makes it possible to run EFI applications in non-secure
> > mode.  It allows me to run OpenBSD on the imx7d-pico-pi board while
> > using the PSCI implementation provided by U-Boot.
> > 
> > Mark Kettenis (3):
> >   ARM: HYP/non-sec: save and restore stack
> >   efi_loader: ARM: run EFI payloads non-secure
> >   Revert "efi_loader: no support for ARMV7_NONSEC=y"
> > 
> >  arch/arm/cpu/armv7/nonsec_virt.S |  6 ++++--
> >  cmd/bootefi.c                    | 32 ++++++++++++++++++++++++++++++++
> >  doc/README.uefi                  |  2 --
> >  lib/efi_loader/Kconfig           |  2 --
> >  4 files changed, 36 insertions(+), 6 deletions(-)
> > 
> 
> This is the output I got with your patches when trying to boot my BananaPi:
> 
> => bootefi hello
> Scanning disk mmc at 01c0f000.blk...
> Found 3 disks
> WARNING: booting without device tree
> ## Starting EFI application at 42000000 ...
> WARNING: using memory device/image path, this may confuse some payloads!
> 
> U-Boot SPL 2018.07-rc1-D001-00104-g5b859da7ca8 (Jun 12 2018 - 19:52:34
> +0200)
> DRAM:
> 
> Where able to run bootefi hello on your board?

I can run helloworld.efi on my board with this diff.

> Which board are you on?

Technexion PICO-PI-IMX7; it's a board with an i.MX7D SoC.

I have a Banana Pi as well, so I'll give that one a go tomorrow.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH 1/3] ARM: HYP/non-sec: save and restore stack
  2018-06-12 20:32       ` Alexander Graf
@ 2018-06-13 14:55         ` Mark Kettenis
  0 siblings, 0 replies; 12+ messages in thread
From: Mark Kettenis @ 2018-06-13 14:55 UTC (permalink / raw)
  To: u-boot

> From: Alexander Graf <agraf@suse.de>
> Date: Tue, 12 Jun 2018 22:32:38 +0200
> 
> On 12.06.18 22:17, Mark Kettenis wrote:
> >> 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.
> 
> 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.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y
  2018-06-12 18:00 ` [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y Heinrich Schuchardt
  2018-06-12 20:36   ` Mark Kettenis
@ 2018-06-13 22:20   ` Mark Kettenis
  1 sibling, 0 replies; 12+ messages in thread
From: Mark Kettenis @ 2018-06-13 22:20 UTC (permalink / raw)
  To: u-boot

> From: Heinrich Schuchardt <xypron.glpk@gmx.de>
> Date: Tue, 12 Jun 2018 20:00:28 +0200
> 
> On 06/12/2018 07:27 PM, Mark Kettenis wrote:
> > This series makes it possible to run EFI applications in non-secure
> > mode.  It allows me to run OpenBSD on the imx7d-pico-pi board while
> > using the PSCI implementation provided by U-Boot.
> > 
> > Mark Kettenis (3):
> >   ARM: HYP/non-sec: save and restore stack
> >   efi_loader: ARM: run EFI payloads non-secure
> >   Revert "efi_loader: no support for ARMV7_NONSEC=y"
> > 
> >  arch/arm/cpu/armv7/nonsec_virt.S |  6 ++++--
> >  cmd/bootefi.c                    | 32 ++++++++++++++++++++++++++++++++
> >  doc/README.uefi                  |  2 --
> >  lib/efi_loader/Kconfig           |  2 --
> >  4 files changed, 36 insertions(+), 6 deletions(-)
> > 
> 
> This is the output I got with your patches when trying to boot my BananaPi:
> 
> => bootefi hello
> Scanning disk mmc at 01c0f000.blk...
> Found 3 disks
> WARNING: booting without device tree
> ## Starting EFI application at 42000000 ...
> WARNING: using memory device/image path, this may confuse some payloads!
> 
> U-Boot SPL 2018.07-rc1-D001-00104-g5b859da7ca8 (Jun 12 2018 - 19:52:34
> +0200)
> DRAM:

I could reproduce that.  For some reason r3 gets clobbered and we
still end up with a broken stack.  Posted v2 that simply migrates
SP_svc to SP_hyp.  That seems to work on both imx7 and sun7i.

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2018-06-13 22:20 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-12 17:27 [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y Mark Kettenis
2018-06-12 17:27 ` [U-Boot] [PATCH 1/3] ARM: HYP/non-sec: save and restore stack Mark Kettenis
2018-06-12 18:46   ` Alexander Graf
2018-06-12 20:17     ` Mark Kettenis
2018-06-12 20:32       ` Alexander Graf
2018-06-13 14:55         ` Mark Kettenis
2018-06-12 17:27 ` [U-Boot] [PATCH 2/3] efi_loader: ARM: run EFI payloads non-secure Mark Kettenis
2018-06-12 18:49   ` Alexander Graf
2018-06-12 17:27 ` [U-Boot] [PATCH 3/3] Revert "efi_loader: no support for ARMV7_NONSEC=y" Mark Kettenis
2018-06-12 18:00 ` [U-Boot] [PATCH 0/3] efi_loader: ARM: add support for ARMV7_NONSEC=y Heinrich Schuchardt
2018-06-12 20:36   ` Mark Kettenis
2018-06-13 22:20   ` Mark Kettenis

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.