diff options
author | Michael Brown | 2007-10-10 21:12:25 +0200 |
---|---|---|
committer | Michael Brown | 2007-10-10 21:12:25 +0200 |
commit | e445c2c07c499edc8ead8cdc40305b5bef5adc56 (patch) | |
tree | 49db28f35384f32f6bcd9c3d2dcc202cf78d7e18 | |
parent | Force a netdevice poll in net_tx() before attempting to transmit (diff) | |
download | ipxe-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.S | 29 |
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 |