lkml.org 
[lkml]   [2017]   [Nov]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 013/193] x86/boot: Fix boot failure when SMP MP-table is based at 0
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Tom Lendacky <thomas.lendacky@amd.com>

    commit ac5292e9a294618cecb31109d1ba265e3d027ba2 upstream.

    When crosvm is used to boot a kernel as a VM, the SMP MP-table is found
    at physical address 0x0. This causes mpf_base to be set to 0 and a
    subsequent "if (!mpf_base)" check in default_get_smp_config() results in
    the MP-table not being parsed. Further into the boot this results in an
    oops when attempting a read_apic_id().

    Add a boolean variable that is set to true when the MP-table is found.
    Use this variable for testing if the MP-table was found so that even a
    value of 0 for mpf_base will result in continued parsing of the MP-table.

    Fixes: 5997efb96756 ("x86/boot: Use memremap() to map the MPF and MPC data")
    Reported-by: Tomeu Vizoso <tomeu@tomeuvizoso.net>
    Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: regression@leemhuis.info
    Link: https://lkml.kernel.org/r/20171106201753.23059.86674.stgit@tlendack-t1.amdoffice.net
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/x86/kernel/mpparse.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    --- a/arch/x86/kernel/mpparse.c
    +++ b/arch/x86/kernel/mpparse.c
    @@ -431,6 +431,7 @@ static inline void __init construct_defa
    }

    static unsigned long mpf_base;
    +static bool mpf_found;

    static unsigned long __init get_mpc_size(unsigned long physptr)
    {
    @@ -504,7 +505,7 @@ void __init default_get_smp_config(unsig
    if (!smp_found_config)
    return;

    - if (!mpf_base)
    + if (!mpf_found)
    return;

    if (acpi_lapic && early)
    @@ -593,6 +594,7 @@ static int __init smp_scan_config(unsign
    smp_found_config = 1;
    #endif
    mpf_base = base;
    + mpf_found = true;

    pr_info("found SMP MP-table at [mem %#010lx-%#010lx] mapped at [%p]\n",
    base, base + sizeof(*mpf) - 1, mpf);
    @@ -858,7 +860,7 @@ static int __init update_mp_table(void)
    if (!enable_update_mptable)
    return 0;

    - if (!mpf_base)
    + if (!mpf_found)
    return 0;

    mpf = early_memremap(mpf_base, sizeof(*mpf));

    \
     
     \ /
      Last update: 2017-11-28 12:42    [W:4.059 / U:0.256 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site