FreeBSD panics with 64GiB of RAM
Maxim Sobolev
sobomax at FreeBSD.org
Fri Jan 16 12:07:02 PST 2009
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 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"
>
More information about the freebsd-current
mailing list