david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

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.
This commit is contained in:
Michael Brown 2007-10-10 20:12:25 +01:00
parent 2303c45d65
commit e445c2c07c
1 changed files with 18 additions and 11 deletions

View File

@ -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