summaryrefslogtreecommitdiff
path: root/usr/src/uts
diff options
context:
space:
mode:
authorKit Chow <Kit.Chow@Sun.COM>2010-02-19 15:27:06 -0800
committerKit Chow <Kit.Chow@Sun.COM>2010-02-19 15:27:06 -0800
commit6c8c89ea15a4d8ea00231060a86659cb037f3566 (patch)
treebd11ef8151ce0ae6ca296990cbce2a8b3eedec8d /usr/src/uts
parent5109e3feb6ddd3a42752ef75689e774397813d0c (diff)
downloadillumos-gate-6c8c89ea15a4d8ea00231060a86659cb037f3566.tar.gz
6900136 Solaris crashes during boot on systems with 1TB memory
Diffstat (limited to 'usr/src/uts')
-rw-r--r--usr/src/uts/i86pc/os/startup.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/usr/src/uts/i86pc/os/startup.c b/usr/src/uts/i86pc/os/startup.c
index cba2e793ad..094e743f8f 100644
--- a/usr/src/uts/i86pc/os/startup.c
+++ b/usr/src/uts/i86pc/os/startup.c
@@ -1136,15 +1136,14 @@ startup_memlist(void)
/*
* 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 @@ startup_memlist(void)
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 */