Skip to content

Commit

Permalink
Ensure that empty e820 regions are skipped even at the end of the
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Michael Brown committed Oct 10, 2007
1 parent 8069598 commit 35ee7e4
Showing 1 changed file with 18 additions and 11 deletions.
29 changes: 18 additions & 11 deletions src/arch/i386/firmware/pcbios/e820mangler.S
Expand Up @@ -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
Expand Down

0 comments on commit 35ee7e4

Please sign in to comment.