diff options
| -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 | } |
