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


    From: Tom Lendacky <>

    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 <>
    Signed-off-by: Tom Lendacky <>
    Signed-off-by: Thomas Gleixner <>
    Cc: Peter Zijlstra <>
    Cc: Borislav Petkov <>
    Signed-off-by: Greg Kroah-Hartman <>

    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)

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

    if (acpi_lapic && early)
    @@ -593,6 +594,7 @@ static int __init smp_scan_config(unsign
    smp_found_config = 1;
    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