6900136 Solaris crashes during boot on systems with 1TB memory
authorKit Chow <Kit.Chow@Sun.COM>
Fri, 19 Feb 2010 15:27:06 -0800
changeset 11721 9a1ae66eff5b
parent 11720 c5df7d9d94a8
child 11722 30a0e837513e
6900136 Solaris crashes during boot on systems with 1TB memory
usr/src/uts/i86pc/os/startup.c
--- a/usr/src/uts/i86pc/os/startup.c	Fri Feb 19 15:06:37 2010 -0800
+++ b/usr/src/uts/i86pc/os/startup.c	Fri Feb 19 15:27:06 2010 -0800
@@ -1136,15 +1136,14 @@
 	/*
 	 * The default values of VALLOC_BASE and SEGKPM_BASE should work
 	 * for values of physmax up to 1 Terabyte. They need adjusting when
-	 * memory is at addresses above 1 TB.
+	 * memory is at addresses above 1 TB. When adjusted, segkpm_base must
+	 * be aligned on KERNEL_REDZONE_SIZE boundary (span of top level pte).
 	 */
 	if (physmax + 1 > mmu_btop(TERABYTE)) {
 		uint64_t kpm_resv_amount = mmu_ptob(physmax + 1);
 
-		/* Round to largest possible pagesize for now */
-		kpm_resv_amount = P2ROUNDUP(kpm_resv_amount, ONE_GIG);
-
-		segkpm_base = -(2 * kpm_resv_amount); /* down from top VA */
+		segkpm_base = -(P2ROUNDUP((2 * kpm_resv_amount),
+		    KERNEL_REDZONE_SIZE));	/* down from top VA */
 
 		/* make sure we leave some space for user apps above hole */
 		segkpm_base = MAX(segkpm_base, AMD64_VA_HOLE_END + TERABYTE);
@@ -1152,7 +1151,9 @@
 			segkpm_base = SEGKPM_BASE;
 		PRM_DEBUG(segkpm_base);
 
-		valloc_base = segkpm_base + kpm_resv_amount;
+		valloc_base = segkpm_base + P2ROUNDUP(kpm_resv_amount, ONE_GIG);
+		if (valloc_base < segkpm_base)
+			panic("not enough kernel VA to support memory size");
 		PRM_DEBUG(valloc_base);
 	}
 #else	/* __i386 */