diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-09-26 18:43:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-09-26 18:43:55 -0400 |
commit | a07921bcd5830c5a1130309977a8ade8a4f7d69b (patch) | |
tree | 9adf0435d35deebe605f94438251f1279ffc563e /arch/i386 | |
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
Diffstat (limited to 'arch/i386')
-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 1a2e62db8bed..bccaa1cf6645 100644 --- a/arch/i386/boot/memory.c +++ b/arch/i386/boot/memory.c | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | static int detect_memory_e820(void) | 21 | static int detect_memory_e820(void) |
22 | { | 22 | { |
23 | int count = 0; | ||
23 | u32 next = 0; | 24 | u32 next = 0; |
24 | u32 size, id; | 25 | u32 size, id; |
25 | u8 err; | 26 | u8 err; |
@@ -33,14 +34,24 @@ static int detect_memory_e820(void) | |||
33 | "=m" (*desc) | 34 | "=m" (*desc) |
34 | : "D" (desc), "a" (0xe820)); | 35 | : "D" (desc), "a" (0xe820)); |
35 | 36 | ||
36 | if (err || id != SMAP) | 37 | /* Some BIOSes stop returning SMAP in the middle of |
38 | the search loop. We don't know exactly how the BIOS | ||
39 | screwed up the map at that point, we might have a | ||
40 | partial map, the full map, or complete garbage, so | ||
41 | just return failure. */ | ||
42 | if (id != SMAP) { | ||
43 | count = 0; | ||
37 | break; | 44 | break; |
45 | } | ||
38 | 46 | ||
39 | boot_params.e820_entries++; | 47 | if (err) |
48 | break; | ||
49 | |||
50 | count++; | ||
40 | desc++; | 51 | desc++; |
41 | } while (next && boot_params.e820_entries < E820MAX); | 52 | } while (next && count < E820MAX); |
42 | 53 | ||
43 | return boot_params.e820_entries; | 54 | return boot_params.e820_entries = count; |
44 | } | 55 | } |
45 | 56 | ||
46 | static int detect_memory_e801(void) | 57 | static int detect_memory_e801(void) |
@@ -89,11 +100,16 @@ static int detect_memory_88(void) | |||
89 | 100 | ||
90 | int detect_memory(void) | 101 | int detect_memory(void) |
91 | { | 102 | { |
103 | int err = -1; | ||
104 | |||
92 | if (detect_memory_e820() > 0) | 105 | if (detect_memory_e820() > 0) |
93 | return 0; | 106 | err = 0; |
94 | 107 | ||
95 | if (!detect_memory_e801()) | 108 | if (!detect_memory_e801()) |
96 | return 0; | 109 | err = 0; |
110 | |||
111 | if (!detect_memory_88()) | ||
112 | err = 0; | ||
97 | 113 | ||
98 | return detect_memory_88(); | 114 | return err; |
99 | } | 115 | } |