Commit 7a82c3051c8f ("efi_loader: Align runtime section to 64kb")
already aligned the memory region to 64kb, but it does not align the
actual efi runtime code. Thus it is likely, that efi_add_memory_map()
actually adds a larger memory region than the efi runtime code really
is, which is no error I guess. But what actually leads to an error is
that there might be other efi_add_memory_map() calls with regions
overlapping with the already registered efi runtime code section.

Align the actual runtime code to 64kb instead.

Fixes: 7a82c3051c8f ("efi_loader: Align runtime section to 64kb")
Signed-off-by: Michael Walle <mich...@walle.cc>
---
 arch/arm/cpu/armv8/u-boot.lds |  9 ++++++++-
 lib/efi_loader/efi_memory.c   | 15 ++-------------
 2 files changed, 10 insertions(+), 14 deletions(-)

diff --git a/arch/arm/cpu/armv8/u-boot.lds b/arch/arm/cpu/armv8/u-boot.lds
index 2554980595..3bc4675586 100644
--- a/arch/arm/cpu/armv8/u-boot.lds
+++ b/arch/arm/cpu/armv8/u-boot.lds
@@ -27,7 +27,14 @@ SECTIONS
                CPUDIR/start.o (.text*)
        }
 
-       /* This needs to come before *(.text*) */
+       /*
+        * Runtime Services must be 64KiB aligned according to the
+        * "AArch64 Platforms" section in the UEFI spec (2.7+).
+        *
+        * This needs to come before *(.text*)
+        */
+
+       . = ALIGN(65536);
        .efi_runtime : {
                 __efi_runtime_start = .;
                *(.text.efi_runtime*)
diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
index 97d90f069a..fd79178da9 100644
--- a/lib/efi_loader/efi_memory.c
+++ b/lib/efi_loader/efi_memory.c
@@ -12,7 +12,6 @@
 #include <mapmem.h>
 #include <watchdog.h>
 #include <linux/list_sort.h>
-#include <linux/sizes.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -734,7 +733,6 @@ __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;
 
@@ -745,22 +743,13 @@ static void add_u_boot_and_runtime(void)
                       uboot_start + EFI_PAGE_MASK) >> EFI_PAGE_SHIFT;
        efi_add_memory_map(uboot_start, uboot_pages, EFI_LOADER_DATA, false);
 
-#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_start = (ulong)&__efi_runtime_start & ~EFI_PAGE_MASK;
        runtime_end = (ulong)&__efi_runtime_stop;
-       runtime_end = (runtime_end + runtime_mask) & ~runtime_mask;
+       runtime_end = (runtime_end + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;
        runtime_pages = (runtime_end - runtime_start) >> EFI_PAGE_SHIFT;
        efi_add_memory_map(runtime_start, runtime_pages,
                           EFI_RUNTIME_SERVICES_CODE, false);
-- 
2.20.1

Reply via email to