|
@@ -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,15 +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;
|
|
|
- }
|
|
|
-
|
|
|
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;
|
|
|
}
|
|
|
|
|
@@ -115,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);
|