2022-08-19 22:50:03

by Russ Dill

[permalink] [raw]
Subject: [PATCH] x86/boot: Fail gracefully if SMP MP-table early_memremap fails

At least one older motherboard (Micronics W6-LI Pentium Pro) has been
observed to fill in the physptr but not actually populate the mpc when
only one CPU is present. In this specific case, this leads to the size
field being zero which causes early_memremap to fail. This then
causes a NULL pointer exception in smp_read_mpc.

Add a simple return check. Returning -1 here will cause the MP-table to
be ignored and the system to boot in nosmp mode.

Signed-off-by: Russ Dill <[email protected]>
Cc: Tom Lendacky <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Yinghai Lu <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: H. Peter Anvin <[email protected]>
Cc: [email protected]
---
arch/x86/kernel/mpparse.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
index fed721f90116..ca2af4f42cb8 100644
--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -438,6 +438,10 @@ static int __init check_physptr(struct mpf_intel *mpf, unsigned int early)

size = get_mpc_size(mpf->physptr);
mpc = early_memremap(mpf->physptr, size);
+ if (!mpc) {
+ pr_err("MPTABLE: mpc early_memremap() failed\n");
+ return -1;
+ }

/*
* Read the physical hardware table. Anything here will
--
2.36.1


2022-08-20 15:55:09

by Borislav Petkov

[permalink] [raw]
Subject: Re: [PATCH] x86/boot: Fail gracefully if SMP MP-table early_memremap fails

On Fri, Aug 19, 2022 at 03:44:00PM -0700, Russ Dill wrote:
> At least one older motherboard (Micronics W6-LI Pentium Pro) has been
> observed to fill in the physptr but not actually populate the mpc when
> only one CPU is present. In this specific case, this leads to the size
> field being zero which causes early_memremap to fail. This then
> causes a NULL pointer exception in smp_read_mpc.
>
> Add a simple return check. Returning -1 here will cause the MP-table to
> be ignored and the system to boot in nosmp mode.
>
> Signed-off-by: Russ Dill <[email protected]>
> Cc: Tom Lendacky <[email protected]>
> Cc: Ingo Molnar <[email protected]>
> Cc: Thomas Gleixner <[email protected]>
> Cc: Yinghai Lu <[email protected]>
> Cc: Dave Hansen <[email protected]>
> Cc: H. Peter Anvin <[email protected]>
> Cc: [email protected]
> ---
> arch/x86/kernel/mpparse.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
> index fed721f90116..ca2af4f42cb8 100644
> --- a/arch/x86/kernel/mpparse.c
> +++ b/arch/x86/kernel/mpparse.c
> @@ -438,6 +438,10 @@ static int __init check_physptr(struct mpf_intel *mpf, unsigned int early)
>
> size = get_mpc_size(mpf->physptr);

If the size is 0, why aren't you checking size and returning early here
instead of the early_memremap() result which gets called with size=0?

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette