summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/os/mmapobj.c33
-rw-r--r--usr/src/uts/i86pc/vm/vm_machdep.c6
-rw-r--r--usr/src/uts/sun4u/vm/mach_vm_dep.c9
-rw-r--r--usr/src/uts/sun4v/vm/mach_vm_dep.c5
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;