diff mbox series

raspberrypi: reserve first two pages in efi memory map

Message ID 20200226140357.27649-1-kevans@FreeBSD.org
State Not Applicable
Delegated to: Matthias Brugger
Headers show
Series raspberrypi: reserve first two pages in efi memory map | expand

Commit Message

Kyle Evans Feb. 26, 2020, 2:03 p.m. UTC
From: Kyle Evans <kevans@FreeBSD.org>

The psci stub provided by Raspberry Pi is around 5k in size, thus residing
in the first two pages of memory. Without this reservation, the next stage
or OS assume they're free to use the second page and may get catastrophic
results from clobbering it.

Signed-off-by: Kyle Evans <kevans@FreeBSD.org>
Cc: Matthias Brugger <mbrugger@suse.com>
---
 board/raspberrypi/rpi/rpi.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Matthias Brugger Feb. 26, 2020, 6:06 p.m. UTC | #1
On 26/02/2020 15:03, kevans@FreeBSD.org wrote:
> From: Kyle Evans <kevans@FreeBSD.org>
> 
> The psci stub provided by Raspberry Pi is around 5k in size, thus residing
> in the first two pages of memory. Without this reservation, the next stage
> or OS assume they're free to use the second page and may get catastrophic
> results from clobbering it.
> 
> Signed-off-by: Kyle Evans <kevans@FreeBSD.org>
> Cc: Matthias Brugger <mbrugger@suse.com>
> ---
>  board/raspberrypi/rpi/rpi.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> index e367ba3092..d3f9bd16ac 100644
> --- a/board/raspberrypi/rpi/rpi.c
> +++ b/board/raspberrypi/rpi/rpi.c
> @@ -488,8 +488,8 @@ int ft_board_setup(void *blob, bd_t *bd)
>  	lcd_dt_simplefb_add_node(blob);
>  
>  #ifdef CONFIG_EFI_LOADER
> -	/* Reserve the spin table */
> -	efi_add_memory_map(0, 1, EFI_RESERVED_MEMORY_TYPE, 0);
> +	/* Reserve the first two pages for spin table/psci stub. */
> +	efi_add_memory_map(0, 2, EFI_RESERVED_MEMORY_TYPE, 0);

Is this that changed recently or was the memory reservation wrong from the
beginning?

Reagrds,
Matthias

>  #endif
>  
>  	return 0;
>
Kyle Evans Feb. 26, 2020, 6:26 p.m. UTC | #2
On Wed, Feb 26, 2020 at 12:06 PM Matthias Brugger <mbrugger@suse.com> wrote:
>
>
>
> On 26/02/2020 15:03, kevans@FreeBSD.org wrote:
> > From: Kyle Evans <kevans@FreeBSD.org>
> >
> > The psci stub provided by Raspberry Pi is around 5k in size, thus residing
> > in the first two pages of memory. Without this reservation, the next stage
> > or OS assume they're free to use the second page and may get catastrophic
> > results from clobbering it.
> >
> > Signed-off-by: Kyle Evans <kevans@FreeBSD.org>
> > Cc: Matthias Brugger <mbrugger@suse.com>
> > ---
> >  board/raspberrypi/rpi/rpi.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> > index e367ba3092..d3f9bd16ac 100644
> > --- a/board/raspberrypi/rpi/rpi.c
> > +++ b/board/raspberrypi/rpi/rpi.c
> > @@ -488,8 +488,8 @@ int ft_board_setup(void *blob, bd_t *bd)
> >       lcd_dt_simplefb_add_node(blob);
> >
> >  #ifdef CONFIG_EFI_LOADER
> > -     /* Reserve the spin table */
> > -     efi_add_memory_map(0, 1, EFI_RESERVED_MEMORY_TYPE, 0);
> > +     /* Reserve the first two pages for spin table/psci stub. */
> > +     efi_add_memory_map(0, 2, EFI_RESERVED_MEMORY_TYPE, 0);
>
> Is this that changed recently or was the memory reservation wrong from the
> beginning?
>

As far as I can tell it just wasn't quite accounted for in the initial
reservation -- Linux presumably uses spin-table as described in the
DTS, where-as FreeBSD opts for PSCI instead since it's available. I
don't have a good intuition for who else may be using PSCI for RPi; we
may be in the minority.

FWIW, /memreserve/ in the upstream (raspberrypi/firmware) DTB also do
not account for PSCI stubs -- I've filed an issue[1] there, as well.

Thanks,

Kyle Evans

[1] https://github.com/raspberrypi/firmware/issues/1340
Kyle Evans Feb. 26, 2020, 6:41 p.m. UTC | #3
On Wed, Feb 26, 2020 at 12:26 PM Kyle Evans <kevans@freebsd.org> wrote:
>
> On Wed, Feb 26, 2020 at 12:06 PM Matthias Brugger <mbrugger@suse.com> wrote:
> >
> >
> >
> > On 26/02/2020 15:03, kevans@FreeBSD.org wrote:
> > > From: Kyle Evans <kevans@FreeBSD.org>
> > >
> > > The psci stub provided by Raspberry Pi is around 5k in size, thus residing
> > > in the first two pages of memory. Without this reservation, the next stage
> > > or OS assume they're free to use the second page and may get catastrophic
> > > results from clobbering it.
> > >
> > > Signed-off-by: Kyle Evans <kevans@FreeBSD.org>
> > > Cc: Matthias Brugger <mbrugger@suse.com>
> > > ---
> > >  board/raspberrypi/rpi/rpi.c | 4 ++--
> > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> > > index e367ba3092..d3f9bd16ac 100644
> > > --- a/board/raspberrypi/rpi/rpi.c
> > > +++ b/board/raspberrypi/rpi/rpi.c
> > > @@ -488,8 +488,8 @@ int ft_board_setup(void *blob, bd_t *bd)
> > >       lcd_dt_simplefb_add_node(blob);
> > >
> > >  #ifdef CONFIG_EFI_LOADER
> > > -     /* Reserve the spin table */
> > > -     efi_add_memory_map(0, 1, EFI_RESERVED_MEMORY_TYPE, 0);
> > > +     /* Reserve the first two pages for spin table/psci stub. */
> > > +     efi_add_memory_map(0, 2, EFI_RESERVED_MEMORY_TYPE, 0);
> >
> > Is this that changed recently or was the memory reservation wrong from the
> > beginning?
> >
>
> As far as I can tell it just wasn't quite accounted for in the initial
> reservation -- Linux presumably uses spin-table as described in the
> DTS, where-as FreeBSD opts for PSCI instead since it's available. I
> don't have a good intuition for who else may be using PSCI for RPi; we
> may be in the minority.
>
> FWIW, /memreserve/ in the upstream (raspberrypi/firmware) DTB also do
> not account for PSCI stubs -- I've filed an issue[1] there, as well.
>
> Thanks,
>
> Kyle Evans
>
> [1] https://github.com/raspberrypi/firmware/issues/1340

Upon further examination, it looks like I've managed to confuse myself
and we're using our own stub derived from the upstream spintable
stuff... let's disregard this patch, I'll look into rolling up a new
one as both upstream implementation and ours should pass the required
reservation size through to U-Boot via x1.
diff mbox series

Patch

diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
index e367ba3092..d3f9bd16ac 100644
--- a/board/raspberrypi/rpi/rpi.c
+++ b/board/raspberrypi/rpi/rpi.c
@@ -488,8 +488,8 @@  int ft_board_setup(void *blob, bd_t *bd)
 	lcd_dt_simplefb_add_node(blob);
 
 #ifdef CONFIG_EFI_LOADER
-	/* Reserve the spin table */
-	efi_add_memory_map(0, 1, EFI_RESERVED_MEMORY_TYPE, 0);
+	/* Reserve the first two pages for spin table/psci stub. */
+	efi_add_memory_map(0, 2, EFI_RESERVED_MEMORY_TYPE, 0);
 #endif
 
 	return 0;