aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2007-09-27 20:17:12 -0400
committerH. Peter Anvin <hpa@zytor.com>2007-09-28 13:12:44 -0400
commit4ee5b10abeb2b5581be10d3022694cd19084e9b0 (patch)
treee269f4bd3570ee41b94b68974891e51ef011a9f6
parentff0ce6845bc18292e80ea40d11c3d3a539a3fc5e (diff)
[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: H. Peter Anvin <hpa@zytor.com>
-rw-r--r--arch/i386/boot/memory.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/i386/boot/memory.c b/arch/i386/boot/memory.c
index bccaa1cf6645..378353956b5d 100644
--- a/arch/i386/boot/memory.c
+++ b/arch/i386/boot/memory.c
@@ -28,11 +28,14 @@ static int detect_memory_e820(void)
28 28
29 do { 29 do {
30 size = sizeof(struct e820entry); 30 size = sizeof(struct e820entry);
31 id = SMAP; 31
32 /* Important: %edx is clobbered by some BIOSes,
33 so it must be either used for the error output
34 or explicitly marked clobbered. */
32 asm("int $0x15; setc %0" 35 asm("int $0x15; setc %0"
33 : "=am" (err), "+b" (next), "+d" (id), "+c" (size), 36 : "=d" (err), "+b" (next), "=a" (id), "+c" (size),
34 "=m" (*desc) 37 "=m" (*desc)
35 : "D" (desc), "a" (0xe820)); 38 : "D" (desc), "d" (SMAP), "a" (0xe820));
36 39
37 /* Some BIOSes stop returning SMAP in the middle of 40 /* Some BIOSes stop returning SMAP in the middle of
38 the search loop. We don't know exactly how the BIOS 41 the search loop. We don't know exactly how the BIOS