Commit a07921bc authored by Linus Torvalds's avatar Linus Torvalds

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
parents f7f847b0 2efa33f8
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
static int detect_memory_e820(void) static int detect_memory_e820(void)
{ {
int count = 0;
u32 next = 0; u32 next = 0;
u32 size, id; u32 size, id;
u8 err; u8 err;
...@@ -33,14 +34,24 @@ static int detect_memory_e820(void) ...@@ -33,14 +34,24 @@ static int detect_memory_e820(void)
"=m" (*desc) "=m" (*desc)
: "D" (desc), "a" (0xe820)); : "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; break;
}
boot_params.e820_entries++; if (err)
break;
count++;
desc++; 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) static int detect_memory_e801(void)
...@@ -89,11 +100,16 @@ static int detect_memory_88(void) ...@@ -89,11 +100,16 @@ static int detect_memory_88(void)
int detect_memory(void) int detect_memory(void)
{ {
int err = -1;
if (detect_memory_e820() > 0) if (detect_memory_e820() > 0)
return 0; err = 0;
if (!detect_memory_e801()) if (!detect_memory_e801())
return 0; err = 0;
if (!detect_memory_88())
err = 0;
return detect_memory_88(); return err;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment