x86: check mptable physptr with max_low_pfn on 32bit
Impact: fix early crash on LinuxBIOS systems Kevin O'Connor reported that Coreboot aka LinuxBIOS tries to put mptable somewhere very high, well above max_low_pfn (below which BIOSes generally put the mptable), causing a panic. The BIOS will probably be changed to be compatible with older Linus versions, but nevertheless the MP-spec does not forbid an MP-table in arbitrary system RAM, so make sure it all works even if the table is in an unexpected place. Check physptr with max_low_pfn * PAGE_SIZE. Reported-by: Kevin O'Connor <kevin@koconnor.net> Signed-off-by: Yinghai Lu <yinghai@kernel.org> Cc: Stefan Reinauer <stepan@coresystems.de> Cc: coreboot@coreboot.org Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
8e6dafd6c7
commit
ecda06289f
1 changed files with 12 additions and 3 deletions
|
@ -710,13 +710,22 @@ static int __init smp_scan_config(unsigned long base, unsigned long length,
|
|||
* of physical memory; so that simply reserving
|
||||
* PAGE_SIZE from mpf->physptr yields BUG()
|
||||
* in reserve_bootmem.
|
||||
* also need to make sure physptr is below than
|
||||
* max_low_pfn
|
||||
* we don't need reserve the area above max_low_pfn
|
||||
*/
|
||||
unsigned long end = max_low_pfn * PAGE_SIZE;
|
||||
if (mpf->physptr + size > end)
|
||||
size = end - mpf->physptr;
|
||||
#endif
|
||||
|
||||
if (mpf->physptr < end) {
|
||||
if (mpf->physptr + size > end)
|
||||
size = end - mpf->physptr;
|
||||
reserve_bootmem_generic(mpf->physptr, size,
|
||||
BOOTMEM_DEFAULT);
|
||||
}
|
||||
#else
|
||||
reserve_bootmem_generic(mpf->physptr, size,
|
||||
BOOTMEM_DEFAULT);
|
||||
#endif
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
|
Loading…
Reference in a new issue