From fd95189c4d0ec653e6b400c4d35f08ecc0eb501a Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sat, 9 Apr 2005 14:16:25 +0000 Subject: [PATCH] basememsize() updates the BIOS FBMS counter at 40:13. --- src/arch/i386/firmware/pcbios/memsizes.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/arch/i386/firmware/pcbios/memsizes.c b/src/arch/i386/firmware/pcbios/memsizes.c index 3284e1ef..25e9fb19 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 );