lkml.org 
[lkml]   [2018]   [Mar]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 153/281] x86/efi: Disable runtime services on kexec kernel if booted with efi=old_map
    Date
    From: Sai Praneeth <sai.praneeth.prakhya@intel.com>

    [ Upstream commit 4e52797d2efefac3271abdc54439a3435abd77b9 ]

    Booting kexec kernel with "efi=old_map" in kernel command line hits
    kernel panic as shown below.

    BUG: unable to handle kernel paging request at ffff88007fe78070
    IP: virt_efi_set_variable.part.7+0x63/0x1b0
    PGD 7ea28067
    PUD 7ea2b067
    PMD 7ea2d067
    PTE 0
    [...]
    Call Trace:
    virt_efi_set_variable()
    efi_delete_dummy_variable()
    efi_enter_virtual_mode()
    start_kernel()
    x86_64_start_reservations()
    x86_64_start_kernel()
    start_cpu()

    [ efi=old_map was never intended to work with kexec. The problem with
    using efi=old_map is that the virtual addresses are assigned from the
    memory region used by other kernel mappings; vmalloc() space.
    Potentially there could be collisions when booting kexec if something
    else is mapped at the virtual address we allocated for runtime service
    regions in the initial boot - Matt Fleming ]

    Since kexec was never intended to work with efi=old_map, disable
    runtime services in kexec if booted with efi=old_map, so that we don't
    panic.

    Tested-by: Lee Chun-Yi <jlee@suse.com>
    Signed-off-by: Sai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>
    Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
    Acked-by: Dave Young <dyoung@redhat.com>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Ravi Shankar <ravi.v.shankar@intel.com>
    Cc: Ricardo Neri <ricardo.neri@intel.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-efi@vger.kernel.org
    Link: http://lkml.kernel.org/r/20170526113652.21339-4-matt@codeblueprint.co.uk
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    arch/x86/platform/efi/efi.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
    index 274dfc481849..a0e85f2aff7d 100644
    --- a/arch/x86/platform/efi/efi.c
    +++ b/arch/x86/platform/efi/efi.c
    @@ -832,9 +832,11 @@ static void __init kexec_enter_virtual_mode(void)

    /*
    * We don't do virtual mode, since we don't do runtime services, on
    - * non-native EFI
    + * non-native EFI. With efi=old_map, we don't do runtime services in
    + * kexec kernel because in the initial boot something else might
    + * have been mapped at these virtual addresses.
    */
    - if (!efi_is_native()) {
    + if (!efi_is_native() || efi_enabled(EFI_OLD_MEMMAP)) {
    efi_memmap_unmap();
    clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
    return;
    --
    2.14.1
    \
     
     \ /
      Last update: 2018-03-19 22:03    [W:4.023 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site