Browse Source

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.
tags/v0.9.3
Michael Brown 16 years ago
parent
commit
e445c2c07c
1 changed files with 18 additions and 11 deletions
  1. 18
    11
      src/arch/i386/firmware/pcbios/e820mangler.S

+ 18
- 11
src/arch/i386/firmware/pcbios/e820mangler.S View File

361
 	pushl	%edx	
361
 	pushl	%edx	
362
 	call	split_e820
362
 	call	split_e820
363
 	pushfw
363
 	pushfw
364
-	/* Skip empty region checking if we've reached the end of the
365
-	 * map or hit an error, to avoid a potential endless loop.
366
-	 */
367
-	jc	1f
368
-	testl	%ebx, %ebx
369
-	jz	1f
370
-	/* Check for an empty region */
364
+	/* If we've hit an error, exit immediately */
365
+	jc	99f
366
+	/* If region is non-empty, return this region */
371
 	pushl	%eax
367
 	pushl	%eax
372
 	movl	%es:8(%di), %eax
368
 	movl	%es:8(%di), %eax
373
 	orl	%es:12(%di), %eax
369
 	orl	%es:12(%di), %eax
374
 	popl	%eax
370
 	popl	%eax
375
-	jnz	1f
376
-	/* Strip empty regions out of the returned map */
371
+	jnz	99f
372
+	/* Region is empty.  If this is not the end of the map,
373
+	 * skip over this region.
374
+	 */
375
+	testl	%ebx, %ebx
376
+	jz	1f
377
 	popfw
377
 	popfw
378
 	popl	%edx
378
 	popl	%edx
379
 	popl	%ecx
379
 	popl	%ecx
380
 	popl	%eax
380
 	popl	%eax
381
 	jmp	int15_e820
381
 	jmp	int15_e820
382
-	/* Restore flags from original INT 15,e820 call and return */
383
-1:	popfw
382
+1:	/* Region is empty and this is the end of the map.  Return
383
+	 * with CF set to avoid placing an empty region at the end of
384
+	 * the map.
385
+	 */
386
+	popfw
387
+	stc
388
+	pushfw
389
+99:	/* Restore flags from original INT 15,e820 call and return */
390
+	popfw
384
 	addr32 leal	12(%esp), %esp /* avoid changing flags */
391
 	addr32 leal	12(%esp), %esp /* avoid changing flags */
385
 	lret	$2
392
 	lret	$2
386
 	.size int15_e820, . - int15_e820
393
 	.size int15_e820, . - int15_e820

Loading…
Cancel
Save