lkml.org 
[lkml]   [2020]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 113/186] efi/x86: Don't panic or BUG() on non-critical error conditions
    Date
    From: Ard Biesheuvel <ardb@kernel.org>

    [ Upstream commit e2d68a955e49d61fd0384f23e92058dc9b79be5e ]

    The logic in __efi_enter_virtual_mode() does a number of steps in
    sequence, all of which may fail in one way or the other. In most
    cases, we simply print an error and disable EFI runtime services
    support, but in some cases, we BUG() or panic() and bring down the
    system when encountering conditions that we could easily handle in
    the same way.

    While at it, replace a pointless page-to-virt-phys conversion with
    one that goes straight from struct page to physical.

    Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Cc: Arvind Sankar <nivedita@alum.mit.edu>
    Cc: Matthew Garrett <mjg59@google.com>
    Cc: linux-efi@vger.kernel.org
    Link: https://lkml.kernel.org/r/20200103113953.9571-14-ardb@kernel.org
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/x86/platform/efi/efi.c | 28 ++++++++++++++--------------
    arch/x86/platform/efi/efi_64.c | 9 +++++----
    2 files changed, 19 insertions(+), 18 deletions(-)

    diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
    index 5b0275310070e..e7f19dec16b97 100644
    --- a/arch/x86/platform/efi/efi.c
    +++ b/arch/x86/platform/efi/efi.c
    @@ -930,16 +930,14 @@ static void __init __efi_enter_virtual_mode(void)

    if (efi_alloc_page_tables()) {
    pr_err("Failed to allocate EFI page tables\n");
    - clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
    - return;
    + goto err;
    }

    efi_merge_regions();
    new_memmap = efi_map_regions(&count, &pg_shift);
    if (!new_memmap) {
    pr_err("Error reallocating memory, EFI runtime non-functional!\n");
    - clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
    - return;
    + goto err;
    }

    pa = __pa(new_memmap);
    @@ -953,8 +951,7 @@ static void __init __efi_enter_virtual_mode(void)

    if (efi_memmap_init_late(pa, efi.memmap.desc_size * count)) {
    pr_err("Failed to remap late EFI memory map\n");
    - clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
    - return;
    + goto err;
    }

    if (efi_enabled(EFI_DBG)) {
    @@ -962,12 +959,11 @@ static void __init __efi_enter_virtual_mode(void)
    efi_print_memmap();
    }

    - BUG_ON(!efi.systab);
    + if (WARN_ON(!efi.systab))
    + goto err;

    - if (efi_setup_page_tables(pa, 1 << pg_shift)) {
    - clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
    - return;
    - }
    + if (efi_setup_page_tables(pa, 1 << pg_shift))
    + goto err;

    efi_sync_low_kernel_mappings();

    @@ -987,9 +983,9 @@ static void __init __efi_enter_virtual_mode(void)
    }

    if (status != EFI_SUCCESS) {
    - pr_alert("Unable to switch EFI into virtual mode (status=%lx)!\n",
    - status);
    - panic("EFI call to SetVirtualAddressMap() failed!");
    + pr_err("Unable to switch EFI into virtual mode (status=%lx)!\n",
    + status);
    + goto err;
    }

    /*
    @@ -1016,6 +1012,10 @@ static void __init __efi_enter_virtual_mode(void)

    /* clean DUMMY object */
    efi_delete_dummy_variable();
    + return;
    +
    +err:
    + clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
    }

    void __init efi_enter_virtual_mode(void)
    diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c
    index ae369c2bbc3eb..0ebb7f94fd518 100644
    --- a/arch/x86/platform/efi/efi_64.c
    +++ b/arch/x86/platform/efi/efi_64.c
    @@ -390,11 +390,12 @@ int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages)
    return 0;

    page = alloc_page(GFP_KERNEL|__GFP_DMA32);
    - if (!page)
    - panic("Unable to allocate EFI runtime stack < 4GB\n");
    + if (!page) {
    + pr_err("Unable to allocate EFI runtime stack < 4GB\n");
    + return 1;
    + }

    - efi_scratch.phys_stack = virt_to_phys(page_address(page));
    - efi_scratch.phys_stack += PAGE_SIZE; /* stack grows down */
    + efi_scratch.phys_stack = page_to_phys(page + 1); /* stack grows down */

    npages = (_etext - _text) >> PAGE_SHIFT;
    text = __pa(_text);
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-02-14 17:20    [W:4.088 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site