efi/arm*: Drop writable mapping of the UEFI System table
[cascardo/linux.git] / drivers / firmware / efi / arm-runtime.c
index 6ae21e4..771750d 100644 (file)
@@ -42,10 +42,12 @@ static struct mm_struct efi_mm = {
 static bool __init efi_virtmap_init(void)
 {
        efi_memory_desc_t *md;
+       bool systab_found;
 
        efi_mm.pgd = pgd_alloc(&efi_mm);
        init_new_context(NULL, &efi_mm);
 
+       systab_found = false;
        for_each_efi_memory_desc(&memmap, md) {
                phys_addr_t phys = md->phys_addr;
                int ret;
@@ -64,8 +66,20 @@ static bool __init efi_virtmap_init(void)
                                &phys, ret);
                        return false;
                }
+               /*
+                * If this entry covers the address of the UEFI system table,
+                * calculate and record its virtual address.
+                */
+               if (efi_system_table >= phys &&
+                   efi_system_table < phys + (md->num_pages * EFI_PAGE_SIZE)) {
+                       efi.systab = (void *)(unsigned long)(efi_system_table -
+                                                            phys + md->virt_addr);
+                       systab_found = true;
+               }
        }
-       return true;
+       if (!systab_found)
+               pr_err("No virtual mapping found for the UEFI System Table\n");
+       return systab_found;
 }
 
 /*
@@ -99,16 +113,8 @@ static int __init arm_enable_runtime_services(void)
        memmap.map_end = memmap.map + mapsize;
        efi.memmap = &memmap;
 
-       efi.systab = (__force void *)ioremap_cache(efi_system_table,
-                                                  sizeof(efi_system_table_t));
-       if (!efi.systab) {
-               pr_err("Failed to remap EFI System Table\n");
-               return -ENOMEM;
-       }
-       set_bit(EFI_SYSTEM_TABLES, &efi.flags);
-
        if (!efi_virtmap_init()) {
-               pr_err("No UEFI virtual mapping was installed -- runtime services will not be available\n");
+               pr_err("UEFI virtual mapping missing or invalid -- runtime services will not be available\n");
                return -ENOMEM;
        }
 
@@ -116,8 +122,6 @@ static int __init arm_enable_runtime_services(void)
        efi_native_runtime_setup();
        set_bit(EFI_RUNTIME_SERVICES, &efi.flags);
 
-       efi.runtime_version = efi.systab->hdr.revision;
-
        return 0;
 }
 early_initcall(arm_enable_runtime_services);