|
@@ -172,7 +172,9 @@ static void __init do_add_efi_memmap(void)
|
|
int __init efi_memblock_x86_reserve_range(void)
|
|
int __init efi_memblock_x86_reserve_range(void)
|
|
{
|
|
{
|
|
struct efi_info *e = &boot_params.efi_info;
|
|
struct efi_info *e = &boot_params.efi_info;
|
|
|
|
+ struct efi_memory_map_data data;
|
|
phys_addr_t pmap;
|
|
phys_addr_t pmap;
|
|
|
|
+ int rv;
|
|
|
|
|
|
if (efi_enabled(EFI_PARAVIRT))
|
|
if (efi_enabled(EFI_PARAVIRT))
|
|
return 0;
|
|
return 0;
|
|
@@ -187,11 +189,17 @@ int __init efi_memblock_x86_reserve_range(void)
|
|
#else
|
|
#else
|
|
pmap = (e->efi_memmap | ((__u64)e->efi_memmap_hi << 32));
|
|
pmap = (e->efi_memmap | ((__u64)e->efi_memmap_hi << 32));
|
|
#endif
|
|
#endif
|
|
- efi.memmap.phys_map = pmap;
|
|
|
|
- efi.memmap.nr_map = e->efi_memmap_size /
|
|
|
|
- e->efi_memdesc_size;
|
|
|
|
- efi.memmap.desc_size = e->efi_memdesc_size;
|
|
|
|
- efi.memmap.desc_version = e->efi_memdesc_version;
|
|
|
|
|
|
+ data.phys_map = pmap;
|
|
|
|
+ data.size = e->efi_memmap_size;
|
|
|
|
+ data.desc_size = e->efi_memdesc_size;
|
|
|
|
+ data.desc_version = e->efi_memdesc_version;
|
|
|
|
+
|
|
|
|
+ rv = efi_memmap_init_early(&data);
|
|
|
|
+ if (rv)
|
|
|
|
+ return rv;
|
|
|
|
+
|
|
|
|
+ if (add_efi_memmap)
|
|
|
|
+ do_add_efi_memmap();
|
|
|
|
|
|
WARN(efi.memmap.desc_version != 1,
|
|
WARN(efi.memmap.desc_version != 1,
|
|
"Unexpected EFI_MEMORY_DESCRIPTOR version %ld",
|
|
"Unexpected EFI_MEMORY_DESCRIPTOR version %ld",
|
|
@@ -218,19 +226,6 @@ void __init efi_print_memmap(void)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void __init efi_unmap_memmap(void)
|
|
|
|
-{
|
|
|
|
- unsigned long size;
|
|
|
|
-
|
|
|
|
- clear_bit(EFI_MEMMAP, &efi.flags);
|
|
|
|
-
|
|
|
|
- size = efi.memmap.nr_map * efi.memmap.desc_size;
|
|
|
|
- if (efi.memmap.map) {
|
|
|
|
- early_memunmap(efi.memmap.map, size);
|
|
|
|
- efi.memmap.map = NULL;
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static int __init efi_systab_init(void *phys)
|
|
static int __init efi_systab_init(void *phys)
|
|
{
|
|
{
|
|
if (efi_enabled(EFI_64BIT)) {
|
|
if (efi_enabled(EFI_64BIT)) {
|
|
@@ -414,33 +409,6 @@ static int __init efi_runtime_init(void)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static int __init efi_memmap_init(void)
|
|
|
|
-{
|
|
|
|
- unsigned long addr, size;
|
|
|
|
-
|
|
|
|
- if (efi_enabled(EFI_PARAVIRT))
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
- /* Map the EFI memory map */
|
|
|
|
- size = efi.memmap.nr_map * efi.memmap.desc_size;
|
|
|
|
- addr = (unsigned long)efi.memmap.phys_map;
|
|
|
|
-
|
|
|
|
- efi.memmap.map = early_memremap(addr, size);
|
|
|
|
- if (efi.memmap.map == NULL) {
|
|
|
|
- pr_err("Could not map the memory map!\n");
|
|
|
|
- return -ENOMEM;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- efi.memmap.map_end = efi.memmap.map + size;
|
|
|
|
-
|
|
|
|
- if (add_efi_memmap)
|
|
|
|
- do_add_efi_memmap();
|
|
|
|
-
|
|
|
|
- set_bit(EFI_MEMMAP, &efi.flags);
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
void __init efi_init(void)
|
|
void __init efi_init(void)
|
|
{
|
|
{
|
|
efi_char16_t *c16;
|
|
efi_char16_t *c16;
|
|
@@ -498,11 +466,11 @@ void __init efi_init(void)
|
|
if (!efi_runtime_supported())
|
|
if (!efi_runtime_supported())
|
|
pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n");
|
|
pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n");
|
|
else {
|
|
else {
|
|
- if (efi_runtime_disabled() || efi_runtime_init())
|
|
|
|
|
|
+ if (efi_runtime_disabled() || efi_runtime_init()) {
|
|
|
|
+ efi_memmap_unmap();
|
|
return;
|
|
return;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- if (efi_memmap_init())
|
|
|
|
- return;
|
|
|
|
|
|
|
|
if (efi_enabled(EFI_DBG))
|
|
if (efi_enabled(EFI_DBG))
|
|
efi_print_memmap();
|
|
efi_print_memmap();
|
|
@@ -839,7 +807,7 @@ static void __init kexec_enter_virtual_mode(void)
|
|
* non-native EFI
|
|
* non-native EFI
|
|
*/
|
|
*/
|
|
if (!efi_is_native()) {
|
|
if (!efi_is_native()) {
|
|
- efi_unmap_memmap();
|
|
|
|
|
|
+ efi_memmap_unmap();
|
|
clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
|
clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
|
return;
|
|
return;
|
|
}
|
|
}
|