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 <ag...@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); > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot