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
This commit is contained in:
Linus Torvalds 2007-09-26 15:43:55 -07:00
commit a07921bcd5
1 changed files with 23 additions and 7 deletions

View File

@ -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;
}
if (err)
break;
boot_params.e820_entries++;
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;
return detect_memory_88();
if (!detect_memory_88())
err = 0;
return err;
}