Ensure that empty e820 regions are skipped even at the end of the
authorMichael Brown <mcb30@etherboot.org>
Wed, 10 Oct 2007 19:12:25 +0000 (20:12 +0100)
committerMichael Brown <mcb30@etherboot.org>
Wed, 10 Oct 2007 19:13:34 +0000 (20:13 +0100)
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.

src/arch/i386/firmware/pcbios/e820mangler.S

index 21d1bb9..e932804 100644 (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