From e445c2c07c499edc8ead8cdc40305b5bef5adc56 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 10 Oct 2007 20:12:25 +0100 Subject: [PATCH] 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. --- src/arch/i386/firmware/pcbios/e820mangler.S | 29 +++++++++++++-------- 1 file 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