Re: FreeBSD panics with 64GiB of RAM

From: Maxim Sobolev <sobomax_at_FreeBSD.org>
Date: Fri, 16 Jan 2009 12:06:24 -0800
Atilla,

Try the following patch  (basically replace panic() with basemem = 640 
and let us know:

Index: sys/amd64/amd64/machdep.c
===================================================================
--- sys/amd64/amd64/machdep.c   (revision 185808)
+++ sys/amd64/amd64/machdep.c   (working copy)
_at__at_ -1089,7 +1091,13 _at__at_
                 }
         }
         if (basemem == 0)
-               panic("BIOS smap did not include a basemem segment!");
+               basemem = 640;
+       if (basemem > 640) {
+               printf(
+                   "Preposterous BIOS basemem of %uK, truncating to 
640K\n",
+                   basemem);
+               basemem = 640;
+       }

  #ifdef SMP
         /* make hole for AP bootstrap code */

-Maxim

Dimitry Andric wrote:
> On 2009-01-12 10:46, Attila Nagy wrote:
>> FreeBSD-CURRENT/amd64 panics at initialization with this:
>> http://people.fsn.hu/~bra/freebsd/20090107-freebsd-x4540/Screenshot-55.png
>> on a Sun X4550, equipped with two Opteron CPUs and 64 GiB of RAM.
> 
> Looks like a BIOS problem, the memory map doesn't include any segment
> that starts at 0.  This memory map seems to be provided by the loader,
> as stated in /usr/src/sys/amd64/amd64/machdep.c:
> 
> 	static void
> 	getmemsize(caddr_t kmdp, u_int64_t first)
> 	{
> 		[...]
> 		/*
> 		 * get memory map from INT 15:E820, kindly supplied by the loader.
> 		[...]
> 		/*
> 		 * Find the 'base memory' segment for SMP
> 		 */
> 		basemem = 0;
> 		for (i = 0; i <= physmap_idx; i += 2) {
> 			if (physmap[i] == 0x00000000) {
> 				basemem = physmap[i + 1] / 1024;
> 				break;
> 			}
> 		}
> 		if (basemem == 0)
> 			panic("BIOS smap did not include a basemem segment!");
> 		[...]
> 
> Funny though, the i386 equivalent has:
> 
> 	static void
> 	getmemsize(int first)
> 	{
> 		[...]
> 		/*
> 		 * Perform "base memory" related probes & setup based on SMAP
> 		 */
> 		if (basemem == 0) {
> 			for (i = 0; i <= physmap_idx; i += 2) {
> 				if (physmap[i] == 0x00000000) {
> 					basemem = physmap[i + 1] / 1024;
> 					break;
> 				}
> 			}
> 
> 			/*
> 			 * XXX this function is horribly organized and has to the same
> 			 * things that it does above here.
> 			 */
> 			if (basemem == 0)
> 				basemem = 640;
> 			if (basemem > 640) {
> 				printf(
> 			    "Preposterous BIOS basemem of %uK, truncating to 640K\n",
> 				    basemem);
> 				basemem = 640;
> 			}
> 
> E.g. if it can't find the SMAP segment required, it just assumes 640k...
> should be enough for everone. ;)
> _______________________________________________
> freebsd-current_at_freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org"
> 
Received on Fri Jan 16 2009 - 19:07:01 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:40 UTC