|
@@ -502,7 +502,8 @@ void __init efi_enter_virtual_mode(void)
|
|
efi_status_t status;
|
|
efi_status_t status;
|
|
unsigned long size;
|
|
unsigned long size;
|
|
u64 end, systab, addr, npages, end_pfn;
|
|
u64 end, systab, addr, npages, end_pfn;
|
|
- void *p, *va;
|
|
|
|
|
|
+ void *p, *va, *new_memmap = NULL;
|
|
|
|
+ int count = 0;
|
|
|
|
|
|
efi.systab = NULL;
|
|
efi.systab = NULL;
|
|
|
|
|
|
@@ -569,15 +570,21 @@ void __init efi_enter_virtual_mode(void)
|
|
systab += md->virt_addr - md->phys_addr;
|
|
systab += md->virt_addr - md->phys_addr;
|
|
efi.systab = (efi_system_table_t *) (unsigned long) systab;
|
|
efi.systab = (efi_system_table_t *) (unsigned long) systab;
|
|
}
|
|
}
|
|
|
|
+ new_memmap = krealloc(new_memmap,
|
|
|
|
+ (count + 1) * memmap.desc_size,
|
|
|
|
+ GFP_KERNEL);
|
|
|
|
+ memcpy(new_memmap + (count * memmap.desc_size), md,
|
|
|
|
+ memmap.desc_size);
|
|
|
|
+ count++;
|
|
}
|
|
}
|
|
|
|
|
|
BUG_ON(!efi.systab);
|
|
BUG_ON(!efi.systab);
|
|
|
|
|
|
status = phys_efi_set_virtual_address_map(
|
|
status = phys_efi_set_virtual_address_map(
|
|
- memmap.desc_size * memmap.nr_map,
|
|
|
|
|
|
+ memmap.desc_size * count,
|
|
memmap.desc_size,
|
|
memmap.desc_size,
|
|
memmap.desc_version,
|
|
memmap.desc_version,
|
|
- memmap.phys_map);
|
|
|
|
|
|
+ (efi_memory_desc_t *)__pa(new_memmap));
|
|
|
|
|
|
if (status != EFI_SUCCESS) {
|
|
if (status != EFI_SUCCESS) {
|
|
printk(KERN_ALERT "Unable to switch EFI into virtual mode "
|
|
printk(KERN_ALERT "Unable to switch EFI into virtual mode "
|
|
@@ -605,6 +612,7 @@ void __init efi_enter_virtual_mode(void)
|
|
runtime_code_page_mkexec();
|
|
runtime_code_page_mkexec();
|
|
early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);
|
|
early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);
|
|
memmap.map = NULL;
|
|
memmap.map = NULL;
|
|
|
|
+ kfree(new_memmap);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|