summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2007-10-10 21:12:25 +0200
committerMichael Brown2007-10-10 21:12:25 +0200
commite445c2c07c499edc8ead8cdc40305b5bef5adc56 (patch)
tree49db28f35384f32f6bcd9c3d2dcc202cf78d7e18
parentForce a netdevice poll in net_tx() before attempting to transmit (diff)
downloadipxe-e445c2c07c499edc8ead8cdc40305b5bef5adc56.tar.gz
ipxe-e445c2c07c499edc8ead8cdc40305b5bef5adc56.tar.xz
ipxe-e445c2c07c499edc8ead8cdc40305b5bef5adc56.zip
Ensure that empty e820 regions are skipped even at the end of the
memory map. (We achieve this by setting CF on the last entry if it is zero-length; this avoids the need to look ahead to see at each entry if the *next* entry would be both the last entry and zero-length). This fixes the "0kB base memory" error message upon starting Windows 2003 on a SunFire X2100.
-rw-r--r--src/arch/i386/firmware/pcbios/e820mangler.S29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/arch/i386/firmware/pcbios/e820mangler.S b/src/arch/i386/firmware/pcbios/e820mangler.S
index 21d1bb9a..e9328041 100644
--- a/src/arch/i386/firmware/pcbios/e820mangler.S
+++ b/src/arch/i386/firmware/pcbios/e820mangler.S
@@ -361,26 +361,33 @@ int15_e820:
pushl %edx
call split_e820
pushfw
- /* Skip empty region checking if we've reached the end of the
- * map or hit an error, to avoid a potential endless loop.
- */
- jc 1f
- testl %ebx, %ebx
- jz 1f
- /* Check for an empty region */
+ /* If we've hit an error, exit immediately */
+ jc 99f
+ /* If region is non-empty, return this region */
pushl %eax
movl %es:8(%di), %eax
orl %es:12(%di), %eax
popl %eax
- jnz 1f
- /* Strip empty regions out of the returned map */
+ jnz 99f
+ /* Region is empty. If this is not the end of the map,
+ * skip over this region.
+ */
+ testl %ebx, %ebx
+ jz 1f
popfw
popl %edx
popl %ecx
popl %eax
jmp int15_e820
- /* Restore flags from original INT 15,e820 call and return */
-1: popfw
+1: /* Region is empty and this is the end of the map. Return
+ * with CF set to avoid placing an empty region at the end of
+ * the map.
+ */
+ popfw
+ stc
+ pushfw
+99: /* Restore flags from original INT 15,e820 call and return */
+ popfw
addr32 leal 12(%esp), %esp /* avoid changing flags */
lret $2
.size int15_e820, . - int15_e820