|
@@ -310,14 +310,31 @@ void __init efi_reserve_boot_services(void)
|
|
|
|
|
|
for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
|
|
|
efi_memory_desc_t *md = p;
|
|
|
- unsigned long long start = md->phys_addr;
|
|
|
- unsigned long long size = md->num_pages << EFI_PAGE_SHIFT;
|
|
|
+ u64 start = md->phys_addr;
|
|
|
+ u64 size = md->num_pages << EFI_PAGE_SHIFT;
|
|
|
|
|
|
if (md->type != EFI_BOOT_SERVICES_CODE &&
|
|
|
md->type != EFI_BOOT_SERVICES_DATA)
|
|
|
continue;
|
|
|
-
|
|
|
- memblock_x86_reserve_range(start, start + size, "EFI Boot");
|
|
|
+ /* Only reserve where possible:
|
|
|
+ * - Not within any already allocated areas
|
|
|
+ * - Not over any memory area (really needed, if above?)
|
|
|
+ * - Not within any part of the kernel
|
|
|
+ * - Not the bios reserved area
|
|
|
+ */
|
|
|
+ if ((start+size >= virt_to_phys(_text)
|
|
|
+ && start <= virt_to_phys(_end)) ||
|
|
|
+ !e820_all_mapped(start, start+size, E820_RAM) ||
|
|
|
+ memblock_x86_check_reserved_size(&start, &size,
|
|
|
+ 1<<EFI_PAGE_SHIFT)) {
|
|
|
+ /* Could not reserve, skip it */
|
|
|
+ md->num_pages = 0;
|
|
|
+ memblock_dbg(PFX "Could not reserve boot range "
|
|
|
+ "[0x%010llx-0x%010llx]\n",
|
|
|
+ start, start+size-1);
|
|
|
+ } else
|
|
|
+ memblock_x86_reserve_range(start, start+size,
|
|
|
+ "EFI Boot");
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -334,6 +351,10 @@ static void __init efi_free_boot_services(void)
|
|
|
md->type != EFI_BOOT_SERVICES_DATA)
|
|
|
continue;
|
|
|
|
|
|
+ /* Could not reserve boot area */
|
|
|
+ if (!size)
|
|
|
+ continue;
|
|
|
+
|
|
|
free_bootmem_late(start, size);
|
|
|
}
|
|
|
}
|