On 11/6/2017 2:17 PM, Tom Lendacky wrote: > 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. > > Reported-by: Tomeu Vizoso <to...@tomeuvizoso.net> > Signed-off-by: Tom Lendacky <thomas.lenda...@amd.com>
I forgot to add a Fixes tag. If the patch is acceptable as is, let me know if you would prefer another version with the Fixes tag or if you can add it when merged: Fixes: 5997efb96756 ("x86/boot: Use memremap() to map the MPF and MPC data") Thanks, Tom > --- > arch/x86/kernel/mpparse.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c > index 5cbb317..c3d3094 100644 > --- a/arch/x86/kernel/mpparse.c > +++ b/arch/x86/kernel/mpparse.c > @@ -430,6 +430,7 @@ static inline void __init > construct_default_ISA_mptable(int mpc_default_type) > } > > static unsigned long mpf_base; > +static bool mpf_found; > > static unsigned long __init get_mpc_size(unsigned long physptr) > { > @@ -503,7 +504,7 @@ void __init default_get_smp_config(unsigned int early) > if (!smp_found_config) > return; > > - if (!mpf_base) > + if (!mpf_found) > return; > > if (acpi_lapic && early) > @@ -592,6 +593,7 @@ static int __init smp_scan_config(unsigned long base, > unsigned long length) > 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); > @@ -857,7 +859,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)); >