[U-Boot] [BUG] Odroid-C2 does not boot with U-Boot master anymore

Heinrich Schuchardt xypron.glpk at gmx.de
Sat Dec 8 13:16:13 UTC 2018


Hello Alex,

the patch 7a82c3051c8f ("efi_loader: Align runtime section to 64kb")
currently breaks booting Linux on the Odroid-C2.

Output stops for kernel 4.18 after earlycon is replaced:
[    0.012518] console [tty0] enabled
[    0.015923] bootconsole [meson0] disabled
Without your patch it continues.

The calculation introduced by the patch does what is expected:
ram_start = 0x0000000000000000
ram_end = 0x0000000080000000
__efi_runtime_start = 0x000000007ff67118
~runtime_mask = 0xffffffffffff0000
runtime_start = 0x000000007ff60000
runtime_end = 0x000000007ff70000

These two memory reservation do not conflict with addresses in question:
arch/arm/mach-meson/board-common.c(60) meson_board_add_reserved_memory:
0x0000000000000000-0x0000000001000000
arch/arm/mach-meson/board-common.c(60) meson_board_add_reserved_memory:
0x0000000010000000-0x0000000010200000

Regards

Heinrich

On 9/17/18 1:54 PM, Alexander Graf wrote:
> The UEFI spec mandates that runtime sections are 64kb aligned to enable
> support for 64kb page size OSs.
> 
> This patch ensures that we extend the runtime section to 64kb to be spec
> compliant.
> 
> Signed-off-by: Alexander Graf <agraf at suse.de>
> 
> ---
> 
> v1 -> v2:
> 
>   - rename kb to KiB in accordance to the spec
>   - add reference to spec section for alignment requirement
>   - only use 64KiB alignment on aarch64
> ---
>  lib/efi_loader/efi_memory.c | 20 +++++++++++++++++---
>  1 file changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
> index 5bd4f4d7fc..b4cb543275 100644
> --- a/lib/efi_loader/efi_memory.c
> +++ b/lib/efi_loader/efi_memory.c
> @@ -11,6 +11,7 @@
>  #include <mapmem.h>
>  #include <watchdog.h>
>  #include <linux/list_sort.h>
> +#include <linux/sizes.h>
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> @@ -563,6 +564,7 @@ __weak void efi_add_known_memory(void)
>  static void add_u_boot_and_runtime(void)
>  {
>  	unsigned long runtime_start, runtime_end, runtime_pages;
> +	unsigned long runtime_mask = EFI_PAGE_MASK;
>  	unsigned long uboot_start, uboot_pages;
>  	unsigned long uboot_stack_size = 16 * 1024 * 1024;
>  
> @@ -571,10 +573,22 @@ static void add_u_boot_and_runtime(void)
>  	uboot_pages = (gd->ram_top - uboot_start) >> EFI_PAGE_SHIFT;
>  	efi_add_memory_map(uboot_start, uboot_pages, EFI_LOADER_DATA, false);
>  
> -	/* Add Runtime Services */
> -	runtime_start = (ulong)&__efi_runtime_start & ~EFI_PAGE_MASK;
> +#if defined(__aarch64__)
> +	/*
> +	 * Runtime Services must be 64KiB aligned according to the
> +	 * "AArch64 Platforms" section in the UEFI spec (2.7+).
> +	 */
> +
> +	runtime_mask = SZ_64K - 1;
> +#endif
> +
> +	/*
> +	 * Add Runtime Services. We mark surrounding boottime code as runtime as
> +	 * well to fulfill the runtime alignment constraints but avoid padding.
> +	 */
> +	runtime_start = (ulong)&__efi_runtime_start & ~runtime_mask;
>  	runtime_end = (ulong)&__efi_runtime_stop;
> -	runtime_end = (runtime_end + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;
> +	runtime_end = (runtime_end + runtime_mask) & ~runtime_mask;
>  	runtime_pages = (runtime_end - runtime_start) >> EFI_PAGE_SHIFT;
>  	efi_add_memory_map(runtime_start, runtime_pages,
>  			   EFI_RUNTIME_SERVICES_CODE, false);
> 



More information about the U-Boot mailing list