[PATCH] raspberrypi: reserve first two pages in efi memory map

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); #endif
return 0;

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;

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

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
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.
participants (3)
-
kevans@FreeBSD.org
-
Kyle Evans
-
Matthias Brugger