diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/os/mmapobj.c | 33 | ||||
-rw-r--r-- | usr/src/uts/i86pc/vm/vm_machdep.c | 6 | ||||
-rw-r--r-- | usr/src/uts/sun4u/vm/mach_vm_dep.c | 9 | ||||
-rw-r--r-- | usr/src/uts/sun4v/vm/mach_vm_dep.c | 5 |
4 files changed, 33 insertions, 20 deletions
diff --git a/usr/src/uts/common/os/mmapobj.c b/usr/src/uts/common/os/mmapobj.c index d4482fcc00..1c6bbb80a2 100644 --- a/usr/src/uts/common/os/mmapobj.c +++ b/usr/src/uts/common/os/mmapobj.c @@ -197,6 +197,24 @@ struct mobj_stats { #define MOBJ_STAT_ADD(stat) #endif +/* + * Check if addr is at or above the address space reserved for the stack. + * The stack is at the top of the address space for all sparc processes + * and 64 bit x86 processes. For 32 bit x86, the stack is not at the top + * of the address space and thus this check wil always return false for + * 32 bit x86 processes. + */ +#if defined(__sparc) +#define OVERLAPS_STACK(addr, p) \ + (addr >= (p->p_usrstack - ((p->p_stk_ctl + PAGEOFFSET) & PAGEMASK))) +#elif defined(__amd64) +#define OVERLAPS_STACK(addr, p) \ + ((p->p_model == DATAMODEL_LP64) && \ + (addr >= (p->p_usrstack - ((p->p_stk_ctl + PAGEOFFSET) & PAGEMASK)))) +#elif defined(__i386) +#define OVERLAPS_STACK(addr, p) 0 +#endif + /* lv_flags values - bitmap */ #define LV_ELF32 0x1 /* 32 bit ELF file */ #define LV_ELF64 0x2 /* 64 bit ELF file */ @@ -627,7 +645,8 @@ mmapobj_unmap_exec(mmapobj_result_t *mrp, int num_mapped, caddr_t start_addr) static caddr_t mmapobj_lookup_start_addr(struct lib_va *lvp) { - struct as *as = curproc->p_as; + proc_t *p = curproc; + struct as *as = p->p_as; struct segvn_crargs crargs = SEGVN_ZFOD_ARGS(PROT_USER, PROT_ALL); int error; uint_t ma_flags = _MAP_LOW32; @@ -650,8 +669,7 @@ mmapobj_lookup_start_addr(struct lib_va *lvp) */ if (base == NULL || as_gap(as, len, &base, &len, 0, NULL) || valid_usr_range(base, len, PROT_ALL, as, as->a_userlimit) != - RANGE_OKAY) { - + RANGE_OKAY || OVERLAPS_STACK(base + len, p)) { if (lvp->lv_flags & LV_ELF64) { ma_flags = 0; } @@ -701,7 +719,8 @@ static caddr_t mmapobj_alloc_start_addr(struct lib_va **lvpp, size_t len, int use_lib_va, size_t align, vattr_t *vap) { - struct as *as = curproc->p_as; + proc_t *p = curproc; + struct as *as = p->p_as; struct segvn_crargs crargs = SEGVN_ZFOD_ARGS(PROT_USER, PROT_ALL); int error; model_t model; @@ -756,14 +775,14 @@ mmapobj_alloc_start_addr(struct lib_va **lvpp, size_t len, int use_lib_va, lib_va_start = lib_va_end - lib_va_len; /* - * Need to make sure we avoid the address hole. + * Need to make sure we avoid the address hole. * We know lib_va_end is valid but we need to * make sure lib_va_start is as well. */ if ((lib_va_end > (size_t)hole_end) && (lib_va_start < (size_t)hole_end)) { lib_va_start = P2ROUNDUP( - (size_t)hole_end, PAGESIZE); + (size_t)hole_end, PAGESIZE); lib_va_len = lib_va_end - lib_va_start; } lib_va_64_arena = vmem_create("lib_va_64", @@ -844,7 +863,7 @@ nolibva: */ if (base == NULL || as_gap(as, len, &base, &len, 0, NULL) || valid_usr_range(base, len, PROT_ALL, as, as->a_userlimit) != - RANGE_OKAY) { + RANGE_OKAY || OVERLAPS_STACK(base + len, p)) { MOBJ_STAT_ADD(get_addr); base = (caddr_t)align; map_addr(&base, len, 0, 1, ma_flags); diff --git a/usr/src/uts/i86pc/vm/vm_machdep.c b/usr/src/uts/i86pc/vm/vm_machdep.c index 231ded40be..899a032f0d 100644 --- a/usr/src/uts/i86pc/vm/vm_machdep.c +++ b/usr/src/uts/i86pc/vm/vm_machdep.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -695,9 +695,7 @@ map_addr_proc( * heap, this bit of code might even be correct. */ slen = p->p_usrstack - base - - (((size_t)rctl_enforced_value( - rctlproc_legacy[RLIMIT_STACK], - p->p_rctls, p) + PAGEOFFSET) & PAGEMASK); + ((p->p_stk_ctl + PAGEOFFSET) & PAGEMASK); } } else #endif diff --git a/usr/src/uts/sun4u/vm/mach_vm_dep.c b/usr/src/uts/sun4u/vm/mach_vm_dep.c index 7f2725211c..2976a68100 100644 --- a/usr/src/uts/sun4u/vm/mach_vm_dep.c +++ b/usr/src/uts/sun4u/vm/mach_vm_dep.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -31,8 +31,6 @@ * under license from the Regents of the University of California. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * UNIX machine dependent virtual memory support. */ @@ -195,9 +193,8 @@ map_addr_proc(caddr_t *addrp, size_t len, offset_t off, int vacalign, ASSERT(userlimit > base); slen = userlimit - base; } else { - slen = p->p_usrstack - base - (((size_t)rctl_enforced_value( - rctlproc_legacy[RLIMIT_STACK], p->p_rctls, p) + PAGEOFFSET) - & PAGEMASK); + slen = p->p_usrstack - base - + ((p->p_stk_ctl + PAGEOFFSET) & PAGEMASK); } /* Make len be a multiple of PAGESIZE */ diff --git a/usr/src/uts/sun4v/vm/mach_vm_dep.c b/usr/src/uts/sun4v/vm/mach_vm_dep.c index 3df7b45adb..d34908b0f5 100644 --- a/usr/src/uts/sun4v/vm/mach_vm_dep.c +++ b/usr/src/uts/sun4v/vm/mach_vm_dep.c @@ -225,9 +225,8 @@ map_addr_proc(caddr_t *addrp, size_t len, offset_t off, int vacalign, ASSERT(userlimit > base); slen = userlimit - base; } else { - slen = p->p_usrstack - base - (((size_t)rctl_enforced_value( - rctlproc_legacy[RLIMIT_STACK], p->p_rctls, p) + PAGEOFFSET) - & PAGEMASK); + slen = p->p_usrstack - base - + ((p->p_stk_ctl + PAGEOFFSET) & PAGEMASK); } /* Make len be a multiple of PAGESIZE */ len = (len + PAGEOFFSET) & PAGEMASK; |