|
@@ -815,6 +815,7 @@ static void __init kexec_enter_virtual_mode(void)
|
|
|
{
|
|
|
#ifdef CONFIG_KEXEC_CORE
|
|
|
efi_memory_desc_t *md;
|
|
|
+ unsigned int num_pages;
|
|
|
void *p;
|
|
|
|
|
|
efi.systab = NULL;
|
|
@@ -829,6 +830,12 @@ static void __init kexec_enter_virtual_mode(void)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ if (efi_alloc_page_tables()) {
|
|
|
+ pr_err("Failed to allocate EFI page tables\n");
|
|
|
+ clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Map efi regions which were passed via setup_data. The virt_addr is a
|
|
|
* fixed addr which was used in first kernel of a kexec boot.
|
|
@@ -843,6 +850,14 @@ static void __init kexec_enter_virtual_mode(void)
|
|
|
|
|
|
BUG_ON(!efi.systab);
|
|
|
|
|
|
+ num_pages = ALIGN(memmap.nr_map * memmap.desc_size, PAGE_SIZE);
|
|
|
+ num_pages >>= PAGE_SHIFT;
|
|
|
+
|
|
|
+ if (efi_setup_page_tables(memmap.phys_map, num_pages)) {
|
|
|
+ clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
efi_sync_low_kernel_mappings();
|
|
|
|
|
|
/*
|