|
@@ -498,13 +498,41 @@ static void __init runtime_code_page_mkexec(void)
|
|
|
*/
|
|
|
void __init efi_enter_virtual_mode(void)
|
|
|
{
|
|
|
- efi_memory_desc_t *md;
|
|
|
+ efi_memory_desc_t *md, *prev_md = NULL;
|
|
|
efi_status_t status;
|
|
|
unsigned long size;
|
|
|
u64 end, systab, addr, npages, end_pfn;
|
|
|
void *p, *va;
|
|
|
|
|
|
efi.systab = NULL;
|
|
|
+
|
|
|
+ /* Merge contiguous regions of the same type and attribute */
|
|
|
+ for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
|
|
|
+ u64 prev_size;
|
|
|
+ md = p;
|
|
|
+
|
|
|
+ if (!prev_md) {
|
|
|
+ prev_md = md;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (prev_md->type != md->type ||
|
|
|
+ prev_md->attribute != md->attribute) {
|
|
|
+ prev_md = md;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ prev_size = prev_md->num_pages << EFI_PAGE_SHIFT;
|
|
|
+
|
|
|
+ if (md->phys_addr == (prev_md->phys_addr + prev_size)) {
|
|
|
+ prev_md->num_pages += md->num_pages;
|
|
|
+ md->type = EFI_RESERVED_TYPE;
|
|
|
+ md->attribute = 0;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ prev_md = md;
|
|
|
+ }
|
|
|
+
|
|
|
for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
|
|
|
md = p;
|
|
|
if (!(md->attribute & EFI_MEMORY_RUNTIME))
|