|
@@ -37,6 +37,12 @@ static int detect_memory_e820(void)
|
|
"=m" (*desc)
|
|
"=m" (*desc)
|
|
: "D" (desc), "d" (SMAP), "a" (0xe820));
|
|
: "D" (desc), "d" (SMAP), "a" (0xe820));
|
|
|
|
|
|
|
|
+ /* BIOSes which terminate the chain with CF = 1 as opposed
|
|
|
|
+ to %ebx = 0 don't always report the SMAP signature on
|
|
|
|
+ the final, failing, probe. */
|
|
|
|
+ if (err)
|
|
|
|
+ break;
|
|
|
|
+
|
|
/* 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
|
|
screwed up the map at that point, we might have a
|
|
screwed up the map at that point, we might have a
|
|
@@ -47,9 +53,6 @@ static int detect_memory_e820(void)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- if (err)
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
count++;
|
|
count++;
|
|
desc++;
|
|
desc++;
|
|
} while (next && count < E820MAX);
|
|
} while (next && count < E820MAX);
|