diff options
| author | Michael Brown | 2005-04-09 16:16:25 +0200 |
|---|---|---|
| committer | Michael Brown | 2005-04-09 16:16:25 +0200 |
| commit | fd95189c4d0ec653e6b400c4d35f08ecc0eb501a (patch) | |
| tree | dcf7f4690cca4f6e3ac7d85435d53af9b9942d2b /src/arch | |
| parent | PM function called by prot_call() should be allowed to modifying (diff) | |
| download | ipxe-fd95189c4d0ec653e6b400c4d35f08ecc0eb501a.tar.gz ipxe-fd95189c4d0ec653e6b400c4d35f08ecc0eb501a.tar.xz ipxe-fd95189c4d0ec653e6b400c4d35f08ecc0eb501a.zip | |
basememsize() updates the BIOS FBMS counter at 40:13.
Diffstat (limited to 'src/arch')
| -rw-r--r-- | src/arch/i386/firmware/pcbios/memsizes.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/arch/i386/firmware/pcbios/memsizes.c b/src/arch/i386/firmware/pcbios/memsizes.c index 3284e1efd..25e9fb192 100644 --- a/src/arch/i386/firmware/pcbios/memsizes.c +++ b/src/arch/i386/firmware/pcbios/memsizes.c @@ -2,14 +2,11 @@ #include "stddef.h" #include "realmode.h" #include "init.h" +#include "etherboot.h" #include "memsizes.h" #define CF ( 1 << 0 ) -#ifndef MEMSIZES_DEBUG -#define MEMSIZES_DEBUG 0 -#endif - /* by Eric Biederman */ struct meminfo meminfo; @@ -19,10 +16,18 @@ BASEMEMSIZE - Get size of the conventional (base) memory **************************************************************************/ static unsigned short basememsize ( void ) { uint16_t int12_basememsize, fbms_basememsize; + uint16_t basememsize; /* There are two methods for retrieving the base memory size: * INT 12 and the BIOS FBMS counter at 40:13. We read both * and use the smaller value, to be paranoid. + * + * We then store the smaller value in the BIOS FBMS counter so + * that other code (e.g. basemem.c) can rely on it and not + * have to use INT 12. This is especially important because + * basemem.c functions can be called in a context in which + * there is no real-mode stack (e.g. when trying to allocate + * memory for a real-mode stack...) */ REAL_EXEC ( rm_basememsize, @@ -34,8 +39,12 @@ static unsigned short basememsize ( void ) { get_real ( fbms_basememsize, 0x40, 0x13 ); - return ( int12_basememsize < fbms_basememsize ? - int12_basememsize : fbms_basememsize ); + basememsize = ( int12_basememsize < fbms_basememsize ? + int12_basememsize : fbms_basememsize ); + + put_real ( basememsize, 0x40, 0x13 ); + + return basememsize; } /************************************************************************** @@ -204,7 +213,7 @@ void get_memsizes ( void ) { } } -#if MEMSIZES_DEBUG +#ifdef DEBUG_MEMSIZES printf ( "basememsize %d\n", meminfo.basememsize ); printf ( "memsize %d\n", meminfo.memsize ); printf ( "Memory regions(%d):\n", meminfo.map_count ); |
