]> git.baikalelectronics.ru Git - kernel.git/commit
x86: handle BIOSes which terminate e820 with CF=1 and no SMAP
authorH. Peter Anvin <hpa@zytor.com>
Wed, 13 Feb 2008 19:16:46 +0000 (11:16 -0800)
committerIngo Molnar <mingo@elte.hu>
Tue, 26 Feb 2008 11:55:52 +0000 (12:55 +0100)
commitc85319066ccfed1faf25e6f28498a281761017e4
tree75f4744449a9a06dd1186215cb2d6d5ab7235798
parentbf487e540ab91abe5e2c16d21161bc5154c5e9c8
x86: handle BIOSes which terminate e820 with CF=1 and no SMAP

The proper way to terminate the e820 chain is with %ebx == 0 on the
last legitimate memory block.  However, several BIOSes don't do that
and instead return error (CF = 1) when trying to read off the end of
the list.  For this error return, %eax doesn't necessarily return the
SMAP signature -- correctly so, since %ah should contain an error code
in this case.

To deal with some particularly broken BIOSes, we clear the entire e820
chain if the SMAP signature is missing in the middle, indicating a
plain insane e820 implementation.  However, we need to make the test
for CF = 1 before the SMAP check.

This fixes at least one HP laptop (nc6400) for which none of the
memory-probing methods (e820, e801, 88) functioned fully according to
spec.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/boot/memory.c