efi/arm: preserve early mapping of UEFI memory map longer for BGRT
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Mon, 23 Jul 2018 01:57:30 +0000 (10:57 +0900)
committerWill Deacon <will.deacon@arm.com>
Mon, 23 Jul 2018 14:33:18 +0000 (15:33 +0100)
The BGRT code validates the contents of the table against the UEFI
memory map, and so it expects it to be mapped when the code runs.

On ARM, this is currently not the case, since we tear down the early
mapping after efi_init() completes, and only create the permanent
mapping in arm_enable_runtime_services(), which executes as an early
initcall, but still leaves a window where the UEFI memory map is not
mapped.

So move the call to efi_memmap_unmap() from efi_init() to
arm_enable_runtime_services().

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
[will: fold in EFI_MEMMAP attribute check from Ard]
Signed-off-by: Will Deacon <will.deacon@arm.com>
drivers/firmware/efi/arm-init.c
drivers/firmware/efi/arm-runtime.c

index b5214c143feedac6f0bd81f4abbe4e60554648dc..388a929baf95d1e1107ab4b0ab20516dea3cfdf7 100644 (file)
@@ -259,7 +259,6 @@ void __init efi_init(void)
 
        reserve_regions();
        efi_esrt_init();
-       efi_memmap_unmap();
 
        memblock_reserve(params.mmap & PAGE_MASK,
                         PAGE_ALIGN(params.mmap_size +
index 5889cbea60b84d5ffbb6e09a62e73a0f98be3852..4712445c32130d9647cac56671db99c3d7f97823 100644 (file)
@@ -110,11 +110,13 @@ static int __init arm_enable_runtime_services(void)
 {
        u64 mapsize;
 
-       if (!efi_enabled(EFI_BOOT)) {
+       if (!efi_enabled(EFI_BOOT) || !efi_enabled(EFI_MEMMAP)) {
                pr_info("EFI services will not be available.\n");
                return 0;
        }
 
+       efi_memmap_unmap();
+
        if (efi_runtime_disabled()) {
                pr_info("EFI runtime services will be disabled.\n");
                return 0;