mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
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:
commit
a07921bcd5
1 changed files with 23 additions and 7 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue