Patch "x86/efi: Update e820 with reserved EFI boot services data to fix kexec breakage" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    x86/efi: Update e820 with reserved EFI boot services data to fix kexec breakage

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     x86-efi-update-e820-with-reserved-efi-boot-services-.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 4510647113d28a977286c7c6faf24f814c2bb098
Author: Dave Young <dyoung@xxxxxxxxxx>
Date:   Wed Dec 4 15:52:33 2019 +0800

    x86/efi: Update e820 with reserved EFI boot services data to fix kexec breakage
    
    [ Upstream commit af164898482817a1d487964b68f3c21bae7a1beb ]
    
    Michael Weiser reported that he got this error during a kexec rebooting:
    
      esrt: Unsupported ESRT version 2904149718861218184.
    
    The ESRT memory stays in EFI boot services data, and it was reserved
    in kernel via efi_mem_reserve().  The initial purpose of the reservation
    is to reuse the EFI boot services data across kexec reboot. For example
    the BGRT image data and some ESRT memory like Michael reported.
    
    But although the memory is reserved it is not updated in the X86 E820 table,
    and kexec_file_load() iterates system RAM in the IO resource list to find places
    for kernel, initramfs and other stuff. In Michael's case the kexec loaded
    initramfs overwrote the ESRT memory and then the failure happened.
    
    Since kexec_file_load() depends on the E820 table being updated, just fix this
    by updating the reserved EFI boot services memory as reserved type in E820.
    
    Originally any memory descriptors with EFI_MEMORY_RUNTIME attribute are
    bypassed in the reservation code path because they are assumed as reserved.
    
    But the reservation is still needed for multiple kexec reboots,
    and it is the only possible case we come here thus just drop the code
    chunk, then everything works without side effects.
    
    On my machine the ESRT memory sits in an EFI runtime data range, it does
    not trigger the problem, but I successfully tested with BGRT instead.
    both kexec_load() and kexec_file_load() work and kdump works as well.
    
    [ mingo: Edited the changelog. ]
    
    Reported-by: Michael Weiser <michael@xxxxxxxxxxxxxxxxxxx>
    Tested-by: Michael Weiser <michael@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Dave Young <dyoung@xxxxxxxxxx>
    Cc: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx>
    Cc: Borislav Petkov <bp@xxxxxxxxx>
    Cc: Eric W. Biederman <ebiederm@xxxxxxxxxxxx>
    Cc: H. Peter Anvin <hpa@xxxxxxxxx>
    Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
    Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
    Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
    Cc: kexec@xxxxxxxxxxxxxxxxxxx
    Cc: linux-efi@xxxxxxxxxxxxxxx
    Link: https://lkml.kernel.org/r/20191204075233.GA10520@xxxxxxxxxxxxxxxxxxxxxxxxxx
    Signed-off-by: Ingo Molnar <mingo@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/x86/platform/efi/quirks.c b/arch/x86/platform/efi/quirks.c
index 3b9fd679cea9..aefe845dff59 100644
--- a/arch/x86/platform/efi/quirks.c
+++ b/arch/x86/platform/efi/quirks.c
@@ -260,10 +260,6 @@ void __init efi_arch_mem_reserve(phys_addr_t addr, u64 size)
 		return;
 	}
 
-	/* No need to reserve regions that will never be freed. */
-	if (md.attribute & EFI_MEMORY_RUNTIME)
-		return;
-
 	size += addr % EFI_PAGE_SIZE;
 	size = round_up(size, EFI_PAGE_SIZE);
 	addr = round_down(addr, EFI_PAGE_SIZE);
@@ -293,6 +289,8 @@ void __init efi_arch_mem_reserve(phys_addr_t addr, u64 size)
 	early_memunmap(new, new_size);
 
 	efi_memmap_install(new_phys, num_entries);
+	e820__range_update(addr, size, E820_TYPE_RAM, E820_TYPE_RESERVED);
+	e820__update_table(e820_table);
 }
 
 /*



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux