[PATCH v3 00/17] efi/x86: Avoid the need to mangle the EFI memory map
Ard Biesheuvel <[email protected]>
| Newsgroups | org.kernel.vger.linux-efi,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
From: Ard Biesheuvel <[email protected]> At boot, x86 uses E820 tables (3 different versions!), memblock tables and the EFI memory map to reason about which parts of system RAM are available to the OS, and which are reserved. While other EFI architectures treat the EFI memory map as immutable, the x86 boot code modifies it to keep track of memory reservations of boot services data regions, in order to distinguish which parts have been memblock_reserve()'d permanently, and which ones have been reserved only temporarily to work around buggy implementations of the EFI runtime service [SetVirtualAddressMap()] that reconfigures the VA space of the runtime services themselves. This method is mostly fine for marking entire regions as reserved, but it gets complicated when the code decides to split EFI memory map entries in order to mark some of it permanently reserved, and the rest of it temporarily reserved. Let's clean this up, by - marking permanent reservations of EFI boot services data memory as MEMBLOCK_RSRV_KERN - taking this marking into account when deciding whether or not a EFI boot services data region can be freed - dropping all of the EFI memory map insertion/splitting logic and the allocation/freeing logic, all of which have become redundant. Changes since v2: - Avoid relying on memblock tables after those may have been freed already (spotted by Sashiko). Instead, tweak the ranges_to_free code added recently by Mike so that the array can grow arbitrarily, and carry multiple entries per EFI boot services data region. - Fix use of the memory attributes table after kexec too, which is now feasible given that memblock_reserve()'ing EFI boot services memory is no longer broken - this supersedes [0] - Drop memblock changes that were merged into 7.1-rc0 (formerly #1-#2) Changes since v1: - Also get rid of all reallocation logic, and just reuse the initial allocation throughout, and keep track of the number of valid entries - Drop abuse of the EFI_MEMORY_RUNTIME flag - Add acks from Mike to #1-#2 [0] https://lore.kernel.org/all/[email protected]/ Cc: Mike Rapoport (Microsoft) <[email protected]> Cc: Benjamin Herrenschmidt <[email protected]> Cc: Dave Young <[email protected]> Cc: Gregory Price <[email protected]> Ard Biesheuvel (17): x86/efi: Omit redundant kernel image overlap check x86/efi: Drop redundant EFI_PARAVIRT check x86/efi: Only merge EFI memory map entries on 32-bit systems x86/efi: Defer sub-1M check from unmap to free stage x86/efi: Simplify real mode trampoline allocation quirk x86/efi: Unmap kernel-reserved boot regions from EFI page tables x86/efi: Drop EFI_MEMORY_RUNTIME check from __ioremap_check_other() x86/efi: Allow ranges_to_free array to grow beyond initial size x86/efi: Intersect ranges_to_free with MEMBLOCK_RSRV_KERN regions x86/efi: Do not rely on EFI_MEMORY_RUNTIME bit and avoid entry splitting efi: Use nr_map not map_end to find the last valid memory map entry x86/efi: Clean the memory map using iterator and filter API x86/efi: Update the runtime map in place x86/efi: Reuse memory map instead of reallocating it x86/efi: Merge two traversals of the memory map when freeing boot regions x86/efi: Avoid EFI_MEMORY_RUNTIME for early EFI boot memory reservations x86/efi: Drop kexec quirk for the EFI memory attributes table arch/x86/include/asm/efi.h | 15 +- arch/x86/mm/ioremap.c | 8 +- arch/x86/platform/efi/Makefile | 2 +- arch/x86/platform/efi/efi.c | 167 +++-------- arch/x86/platform/efi/efi_32.c | 31 +++ arch/x86/platform/efi/memmap.c | 247 ----------------- arch/x86/platform/efi/quirks.c | 291 +++++++------------- arch/x86/platform/efi/runtime-map.c | 4 +- drivers/firmware/efi/arm-runtime.c | 2 +- drivers/firmware/efi/memmap.c | 8 +- drivers/firmware/efi/riscv-runtime.c | 2 +- include/linux/efi.h | 13 +- 12 files changed, 197 insertions(+), 593 deletions(-) delete mode 100644 arch/x86/platform/efi/memmap.c base-commit: 2e68039281932e6dc37718a1ea7cbb8e2cda42e6 -- 2.54.0.rc2.544.gc7ae2d5bb8-goog