[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