diff options
| author | Kit Chow <Kit.Chow@Sun.COM> | 2010-02-19 15:27:06 -0800 |
|---|---|---|
| committer | Kit Chow <Kit.Chow@Sun.COM> | 2010-02-19 15:27:06 -0800 |
| commit | 6c8c89ea15a4d8ea00231060a86659cb037f3566 (patch) | |
| tree | bd11ef8151ce0ae6ca296990cbce2a8b3eedec8d /usr/src/uts | |
| parent | 5109e3feb6ddd3a42752ef75689e774397813d0c (diff) | |
| download | illumos-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.c | 13 |
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 */ |
