diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-09-26 15:43:55 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-09-26 15:43:55 -0700 |
commit | a07921bcd5830c5a1130309977a8ade8a4f7d69b (patch) | |
tree | 9adf0435d35deebe605f94438251f1279ffc563e | |
parent | f7f847b01571e86044dc77e03d92f43699652f8d (diff) | |
parent | 2efa33f81ef56e7700c09a3d8a881c96692149e5 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hpa/linux-2.6-x86setup:
[x86 setup] Handle case of improperly terminated E820 chain
-rw-r--r-- | arch/i386/boot/memory.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/arch/i386/boot/memory.c b/arch/i386/boot/memory.c index 1a2e62db8be..bccaa1cf664 100644 --- a/arch/i386/boot/memory.c +++ b/arch/i386/boot/memory.c @@ -20,6 +20,7 @@ static int detect_memory_e820(void) { + int count = 0; u32 next = 0; u32 size, id; u8 err; @@ -33,14 +34,24 @@ static int detect_memory_e820(void) "=m" (*desc) : "D" (desc), "a" (0xe820)); - if (err || id != SMAP) + /* Some BIOSes stop returning SMAP in the middle of + the search loop. We don't know exactly how the BIOS + screwed up the map at that point, we might have a + partial map, the full map, or complete garbage, so + just return failure. */ + if (id != SMAP) { + count = 0; break; + } - boot_params.e820_entries++; + if (err) + break; + + count++; desc++; - } while (next && boot_params.e820_entries < E820MAX); + } while (next && count < E820MAX); - return boot_params.e820_entries; + return boot_params.e820_entries = count; } static int detect_memory_e801(void) @@ -89,11 +100,16 @@ static int detect_memory_88(void) int detect_memory(void) { + int err = -1; + if (detect_memory_e820() > 0) - return 0; + err = 0; if (!detect_memory_e801()) - return 0; + err = 0; + + if (!detect_memory_88()) + err = 0; - return detect_memory_88(); + return err; } |