FreeBSD panics with 64GiB of RAM

Dimitry Andric dimitry at andric.com
Fri Jan 16 08:52:54 PST 2009


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. ;)


More information about the freebsd-current mailing list