Commit 4ee5b10a authored by H. Peter Anvin's avatar H. Peter Anvin

[x86 setup] Correct the SMAP check for INT 0x15, AX=0xe820

The e820 probe code was checking %edx, not %eax, for the SMAP
signature on return.  This worked on *almost* all systems, since %edx
still contained SMAP from the call on entry, but on a handful of
systems it failed -- plus, we would have missed real mismatches.

The error output is "=d" to make sure gcc knows %edx is clobbered
here.
Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
parent ff0ce684
...@@ -28,11 +28,14 @@ static int detect_memory_e820(void) ...@@ -28,11 +28,14 @@ static int detect_memory_e820(void)
do { do {
size = sizeof(struct e820entry); size = sizeof(struct e820entry);
id = SMAP;
/* Important: %edx is clobbered by some BIOSes,
so it must be either used for the error output
or explicitly marked clobbered. */
asm("int $0x15; setc %0" asm("int $0x15; setc %0"
: "=am" (err), "+b" (next), "+d" (id), "+c" (size), : "=d" (err), "+b" (next), "=a" (id), "+c" (size),
"=m" (*desc) "=m" (*desc)
: "D" (desc), "a" (0xe820)); : "D" (desc), "d" (SMAP), "a" (0xe820));
/* Some BIOSes stop returning SMAP in the middle of /* Some BIOSes stop returning SMAP in the middle of
the search loop. We don't know exactly how the BIOS the search loop. We don't know exactly how the BIOS
......
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