FreeBSD panics with 64GiB of RAM
Attila Nagy
bra at fsn.hu
Sat Jan 17 08:57:38 PST 2009
Hello,
I've already tried something similar. The effect of the patch is this:
http://people.fsn.hu/~bra/freebsd/20090107-freebsd-x4540/Screenshot-70.png
BTW, this:
ftp://ftp.freebsd.org/pub/FreeBSD/snapshots/200812/8.0-CURRENT-200812-amd64-bootonly.iso
boots up fine (to sysinstall).
I haven't installed FreeBSD for years (I'm using netboot), is this i386?
That could explain the situation.
Maxim Sobolev wrote:
> 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