Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Jan 2009 12:06:24 -0800
From:      Maxim Sobolev <sobomax@FreeBSD.org>
To:        Dimitry Andric <dimitry@andric.com>
Cc:        Attila Nagy <bra@fsn.hu>, freebsd-current@FreeBSD.org
Subject:   Re: FreeBSD panics with 64GiB of RAM
Message-ID:  <4970E8C0.1080005@FreeBSD.org>
In-Reply-To: <4970BB63.7030601@andric.com>
References:  <496B115F.1000105@fsn.hu> <4970BB63.7030601@andric.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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)
@@ -1089,7 +1091,13 @@
                 }
         }
         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@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org"
> 




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4970E8C0.1080005>