arm64/efi: invert UEFI memory region reservation logic
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Mon, 20 Oct 2014 13:31:57 +0000 (15:31 +0200)
committerArd Biesheuvel <ard.biesheuvel@linaro.org>
Wed, 5 Nov 2014 08:03:11 +0000 (09:03 +0100)
Instead of reserving the memory regions based on which types we know
need to be reserved, consider only regions of the following types as
free for general use by the OS:

EFI_LOADER_CODE
EFI_LOADER_DATA
EFI_BOOT_SERVICES_CODE
EFI_BOOT_SERVICES_DATA
EFI_CONVENTIONAL_MEMORY

Note that this also fixes a problem with the original code, which would
misidentify a EFI_RUNTIME_SERVICES_DATA region as not reserved if it
does not have the EFI_MEMORY_RUNTIME attribute set. However, it is
perfectly legal for the firmware not to request a virtual mapping for
EFI_RUNTIME_SERVICES_DATA regions that contain configuration tables, in
which case the EFI_MEMORY_RUNTIME attribute would not be set.

Acked-by: Roy Franz <roy.franz@linaro.org>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
arch/arm64/kernel/efi.c

index 95c49ebc660dd85864981bfdfa13bc1f5066d76f..2e829148fb36ad74a6ea4d33f88535869975b43f 100644 (file)
@@ -125,17 +125,17 @@ out:
  */
 static __init int is_reserve_region(efi_memory_desc_t *md)
 {
-       if (!is_normal_ram(md))
+       switch (md->type) {
+       case EFI_LOADER_CODE:
+       case EFI_LOADER_DATA:
+       case EFI_BOOT_SERVICES_CODE:
+       case EFI_BOOT_SERVICES_DATA:
+       case EFI_CONVENTIONAL_MEMORY:
                return 0;
-
-       if (md->attribute & EFI_MEMORY_RUNTIME)
-               return 1;
-
-       if (md->type == EFI_ACPI_RECLAIM_MEMORY ||
-           md->type == EFI_RESERVED_TYPE)
-               return 1;
-
-       return 0;
+       default:
+               break;
+       }
+       return is_normal_ram(md);
 }
 
 static __init void reserve_regions(void)