Browse Source

basememsize() updates the BIOS FBMS counter at 40:13.

tags/v0.9.3
Michael Brown 19 years ago
parent
commit
fd95189c4d
1 changed files with 16 additions and 7 deletions
  1. 16
    7
      src/arch/i386/firmware/pcbios/memsizes.c

+ 16
- 7
src/arch/i386/firmware/pcbios/memsizes.c View File

@@ -2,14 +2,11 @@
2 2
 #include "stddef.h"
3 3
 #include "realmode.h"
4 4
 #include "init.h"
5
+#include "etherboot.h"
5 6
 #include "memsizes.h"
6 7
 
7 8
 #define CF ( 1 << 0 )
8 9
 
9
-#ifndef MEMSIZES_DEBUG 
10
-#define MEMSIZES_DEBUG 0
11
-#endif
12
-
13 10
 /* by Eric Biederman */
14 11
 
15 12
 struct meminfo meminfo;
@@ -19,10 +16,18 @@ BASEMEMSIZE - Get size of the conventional (base) memory
19 16
 **************************************************************************/
20 17
 static unsigned short basememsize ( void ) {
21 18
 	uint16_t int12_basememsize, fbms_basememsize;
19
+	uint16_t basememsize;
22 20
 
23 21
 	/* There are two methods for retrieving the base memory size:
24 22
 	 * INT 12 and the BIOS FBMS counter at 40:13.  We read both
25 23
 	 * and use the smaller value, to be paranoid.
24
+	 * 
25
+	 * We then store the smaller value in the BIOS FBMS counter so
26
+	 * that other code (e.g. basemem.c) can rely on it and not
27
+	 * have to use INT 12.  This is especially important because
28
+	 * basemem.c functions can be called in a context in which
29
+	 * there is no real-mode stack (e.g. when trying to allocate
30
+	 * memory for a real-mode stack...)
26 31
 	 */
27 32
 
28 33
 	REAL_EXEC ( rm_basememsize,
@@ -34,8 +39,12 @@ static unsigned short basememsize ( void ) {
34 39
 
35 40
 	get_real ( fbms_basememsize, 0x40, 0x13 );
36 41
 
37
-	return ( int12_basememsize < fbms_basememsize ?
38
-		 int12_basememsize : fbms_basememsize );
42
+	basememsize = ( int12_basememsize < fbms_basememsize ?
43
+			int12_basememsize : fbms_basememsize );
44
+
45
+	put_real ( basememsize, 0x40, 0x13 );
46
+
47
+	return basememsize;
39 48
 }
40 49
 
41 50
 /**************************************************************************
@@ -204,7 +213,7 @@ void get_memsizes ( void ) {
204 213
 		}
205 214
 	}
206 215
 
207
-#if MEMSIZES_DEBUG
216
+#ifdef DEBUG_MEMSIZES
208 217
 	printf ( "basememsize %d\n", meminfo.basememsize );
209 218
 	printf ( "memsize %d\n",     meminfo.memsize );
210 219
 	printf ( "Memory regions(%d):\n", meminfo.map_count );

Loading…
Cancel
Save