Merge branch 'efi-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull EFI updates from Ingo Molnar: "The main changes in this cycle were: - Cleanup of the GOP [graphics output] handling code in the EFI stub - Complete refactoring of the mixed mode handling in the x86 EFI stub - Overhaul of the x86 EFI boot/runtime code - Increase robustness for mixed mode code - Add the ability to disable DMA at the root port level in the EFI stub - Get rid of RWX mappings in the EFI memory map and page tables, where possible - Move the support code for the old EFI memory mapping style into its only user, the SGI UV1+ support code. - plus misc fixes, updates, smaller cleanups. ... and due to interactions with the RWX changes, another round of PAT cleanups make a guest appearance via the EFI tree - with no side effects intended" * 'efi-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (75 commits) efi/x86: Disable instrumentation in the EFI runtime handling code efi/libstub/x86: Fix EFI server boot failure efi/x86: Disallow efi=old_map in mixed mode x86/boot/compressed: Relax sed symbol type regex for LLVM ld.lld efi/x86: avoid KASAN false positives when accessing the 1: 1 mapping efi: Fix handling of multiple efi_fake_mem= entries efi: Fix efi_memmap_alloc() leaks efi: Add tracking for dynamically allocated memmaps efi: Add a flags parameter to efi_memory_map efi: Fix comment for efi_mem_type() wrt absent physical addresses efi/arm: Defer probe of PCIe backed efifb on DT systems efi/x86: Limit EFI old memory map to SGI UV machines efi/x86: Avoid RWX mappings for all of DRAM efi/x86: Don't map the entire kernel text RW for mixed mode x86/mm: Fix NX bit clearing issue in kernel_map_pages_in_pgd efi/libstub/x86: Fix unused-variable warning efi/libstub/x86: Use mandatory 16-byte stack alignment in mixed mode efi/libstub/x86: Use const attribute for efi_is_64bit() efi: Allow disabling PCI busmastering on bridges during boot efi/x86: Allow translating 64-bit arguments for mixed mode calls ...
This commit is contained in:
@@ -244,7 +244,7 @@ EXPORT_SYMBOL_GPL(efi_query_variable_store);
|
||||
*/
|
||||
void __init efi_arch_mem_reserve(phys_addr_t addr, u64 size)
|
||||
{
|
||||
phys_addr_t new_phys, new_size;
|
||||
struct efi_memory_map_data data = { 0 };
|
||||
struct efi_mem_range mr;
|
||||
efi_memory_desc_t md;
|
||||
int num_entries;
|
||||
@@ -272,24 +272,21 @@ void __init efi_arch_mem_reserve(phys_addr_t addr, u64 size)
|
||||
num_entries = efi_memmap_split_count(&md, &mr.range);
|
||||
num_entries += efi.memmap.nr_map;
|
||||
|
||||
new_size = efi.memmap.desc_size * num_entries;
|
||||
|
||||
new_phys = efi_memmap_alloc(num_entries);
|
||||
if (!new_phys) {
|
||||
if (efi_memmap_alloc(num_entries, &data) != 0) {
|
||||
pr_err("Could not allocate boot services memmap\n");
|
||||
return;
|
||||
}
|
||||
|
||||
new = early_memremap(new_phys, new_size);
|
||||
new = early_memremap(data.phys_map, data.size);
|
||||
if (!new) {
|
||||
pr_err("Failed to map new boot services memmap\n");
|
||||
return;
|
||||
}
|
||||
|
||||
efi_memmap_insert(&efi.memmap, new, &mr);
|
||||
early_memunmap(new, new_size);
|
||||
early_memunmap(new, data.size);
|
||||
|
||||
efi_memmap_install(new_phys, num_entries);
|
||||
efi_memmap_install(&data);
|
||||
e820__range_update(addr, size, E820_TYPE_RAM, E820_TYPE_RESERVED);
|
||||
e820__update_table(e820_table);
|
||||
}
|
||||
@@ -385,10 +382,10 @@ static void __init efi_unmap_pages(efi_memory_desc_t *md)
|
||||
|
||||
/*
|
||||
* To Do: Remove this check after adding functionality to unmap EFI boot
|
||||
* services code/data regions from direct mapping area because
|
||||
* "efi=old_map" maps EFI regions in swapper_pg_dir.
|
||||
* services code/data regions from direct mapping area because the UV1
|
||||
* memory map maps EFI regions in swapper_pg_dir.
|
||||
*/
|
||||
if (efi_enabled(EFI_OLD_MEMMAP))
|
||||
if (efi_have_uv1_memmap())
|
||||
return;
|
||||
|
||||
/*
|
||||
@@ -396,7 +393,7 @@ static void __init efi_unmap_pages(efi_memory_desc_t *md)
|
||||
* EFI runtime calls, hence don't unmap EFI boot services code/data
|
||||
* regions.
|
||||
*/
|
||||
if (!efi_is_native())
|
||||
if (efi_is_mixed())
|
||||
return;
|
||||
|
||||
if (kernel_unmap_pages_in_pgd(pgd, pa, md->num_pages))
|
||||
@@ -408,7 +405,7 @@ static void __init efi_unmap_pages(efi_memory_desc_t *md)
|
||||
|
||||
void __init efi_free_boot_services(void)
|
||||
{
|
||||
phys_addr_t new_phys, new_size;
|
||||
struct efi_memory_map_data data = { 0 };
|
||||
efi_memory_desc_t *md;
|
||||
int num_entries = 0;
|
||||
void *new, *new_md;
|
||||
@@ -463,14 +460,12 @@ void __init efi_free_boot_services(void)
|
||||
if (!num_entries)
|
||||
return;
|
||||
|
||||
new_size = efi.memmap.desc_size * num_entries;
|
||||
new_phys = efi_memmap_alloc(num_entries);
|
||||
if (!new_phys) {
|
||||
if (efi_memmap_alloc(num_entries, &data) != 0) {
|
||||
pr_err("Failed to allocate new EFI memmap\n");
|
||||
return;
|
||||
}
|
||||
|
||||
new = memremap(new_phys, new_size, MEMREMAP_WB);
|
||||
new = memremap(data.phys_map, data.size, MEMREMAP_WB);
|
||||
if (!new) {
|
||||
pr_err("Failed to map new EFI memmap\n");
|
||||
return;
|
||||
@@ -494,7 +489,7 @@ void __init efi_free_boot_services(void)
|
||||
|
||||
memunmap(new);
|
||||
|
||||
if (efi_memmap_install(new_phys, num_entries)) {
|
||||
if (efi_memmap_install(&data) != 0) {
|
||||
pr_err("Could not install new EFI memmap\n");
|
||||
return;
|
||||
}
|
||||
@@ -559,7 +554,7 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct dmi_system_id sgi_uv1_dmi[] = {
|
||||
static const struct dmi_system_id sgi_uv1_dmi[] __initconst = {
|
||||
{ NULL, "SGI UV1",
|
||||
{ DMI_MATCH(DMI_PRODUCT_NAME, "Stoutland Platform"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"),
|
||||
@@ -582,8 +577,15 @@ void __init efi_apply_memmap_quirks(void)
|
||||
}
|
||||
|
||||
/* UV2+ BIOS has a fix for this issue. UV1 still needs the quirk. */
|
||||
if (dmi_check_system(sgi_uv1_dmi))
|
||||
set_bit(EFI_OLD_MEMMAP, &efi.flags);
|
||||
if (dmi_check_system(sgi_uv1_dmi)) {
|
||||
if (IS_ENABLED(CONFIG_X86_UV)) {
|
||||
set_bit(EFI_UV1_MEMMAP, &efi.flags);
|
||||
} else {
|
||||
pr_warn("EFI runtime disabled, needs CONFIG_X86_UV=y on UV1\n");
|
||||
clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
||||
efi_memmap_unmap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -721,7 +723,7 @@ void efi_recover_from_page_fault(unsigned long phys_addr)
|
||||
/*
|
||||
* Make sure that an efi runtime service caused the page fault.
|
||||
* "efi_mm" cannot be used to check if the page fault had occurred
|
||||
* in the firmware context because efi=old_map doesn't use efi_pgd.
|
||||
* in the firmware context because the UV1 memmap doesn't use efi_pgd.
|
||||
*/
|
||||
if (efi_rts_work.efi_rts_id == EFI_NONE)
|
||||
return;
|
||||
|
Reference in New Issue
Block a user