Module Name:    src
Committed By:   martin
Date:           Thu Nov 26 13:15:35 UTC 2015

Modified Files:
        src/sys/arch/amd64/amd64: netbsd32_machdep.c
        src/sys/arch/arm/arm32: netbsd32_machdep.c
        src/sys/arch/mips/mips: netbsd32_machdep.c
        src/sys/arch/riscv/riscv: netbsd32_machdep.c
        src/sys/arch/sparc64/sparc64: netbsd32_machdep.c svr4_32_machdep.c
        src/sys/compat/netbsd32: netbsd32.h
        src/sys/compat/svr4_32: svr4_32_exec.h
        src/sys/external/bsd/drm2/dist/drm/i915: i915_gem.c
        src/sys/kern: exec_elf.c kern_exec.c kern_lwp.c sysv_shm.c
        src/sys/sys: proc.h
        src/sys/uvm: uvm_extern.h uvm_mmap.c uvm_mremap.c

Log Message:
We never exec(2) with a kernel vmspace, so do not test for that, but instead
KASSERT() that we don't.
When calculating the load address for the interpreter (e.g. ld.elf_so),
we need to take into account wether the exec'd process will run with
topdown memory or bottom up. We can not use the current vmspace's flags
to test for that, as this happens too early. Luckily the execpack already
knows what the new state will be later, so instead of testing the current
vmspace, pass the info as additional argument to struct emul
e_vm_default_addr.
Fix all such functions and adopt all callers.


To generate a diff of this commit:
cvs rdiff -u -r1.94 -r1.95 src/sys/arch/amd64/amd64/netbsd32_machdep.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/arm32/netbsd32_machdep.c
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/mips/mips/netbsd32_machdep.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/riscv/riscv/netbsd32_machdep.c
cvs rdiff -u -r1.108 -r1.109 src/sys/arch/sparc64/sparc64/netbsd32_machdep.c
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/sparc64/sparc64/svr4_32_machdep.c
cvs rdiff -u -r1.108 -r1.109 src/sys/compat/netbsd32/netbsd32.h
cvs rdiff -u -r1.14 -r1.15 src/sys/compat/svr4_32/svr4_32_exec.h
cvs rdiff -u -r1.32 -r1.33 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
cvs rdiff -u -r1.80 -r1.81 src/sys/kern/exec_elf.c
cvs rdiff -u -r1.421 -r1.422 src/sys/kern/kern_exec.c
cvs rdiff -u -r1.181 -r1.182 src/sys/kern/kern_lwp.c
cvs rdiff -u -r1.130 -r1.131 src/sys/kern/sysv_shm.c
cvs rdiff -u -r1.323 -r1.324 src/sys/sys/proc.h
cvs rdiff -u -r1.194 -r1.195 src/sys/uvm/uvm_extern.h
cvs rdiff -u -r1.153 -r1.154 src/sys/uvm/uvm_mmap.c
cvs rdiff -u -r1.17 -r1.18 src/sys/uvm/uvm_mremap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/amd64/amd64/netbsd32_machdep.c
diff -u src/sys/arch/amd64/amd64/netbsd32_machdep.c:1.94 src/sys/arch/amd64/amd64/netbsd32_machdep.c:1.95
--- src/sys/arch/amd64/amd64/netbsd32_machdep.c:1.94	Sun Nov 22 13:41:24 2015
+++ src/sys/arch/amd64/amd64/netbsd32_machdep.c	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_machdep.c,v 1.94 2015/11/22 13:41:24 maxv Exp $	*/
+/*	$NetBSD: netbsd32_machdep.c,v 1.95 2015/11/26 13:15:34 martin Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.94 2015/11/22 13:41:24 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.95 2015/11/26 13:15:34 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -931,9 +931,10 @@ cpu_mcontext32_validate(struct lwp *l, c
 }
 
 vaddr_t
-netbsd32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t sz)
+netbsd32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t sz,
+    int topdown)
 {
-	if (p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN)
+	if (topdown)
 		return VM_DEFAULT_ADDRESS32_TOPDOWN(base, sz);
 	else
 		return VM_DEFAULT_ADDRESS32_BOTTOMUP(base, sz);

Index: src/sys/arch/arm/arm32/netbsd32_machdep.c
diff -u src/sys/arch/arm/arm32/netbsd32_machdep.c:1.6 src/sys/arch/arm/arm32/netbsd32_machdep.c:1.7
--- src/sys/arch/arm/arm32/netbsd32_machdep.c:1.6	Mon May  5 17:45:24 2014
+++ src/sys/arch/arm/arm32/netbsd32_machdep.c	Thu Nov 26 13:15:34 2015
@@ -29,7 +29,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: netbsd32_machdep.c,v 1.6 2014/05/05 17:45:24 skrll Exp $");
+__KERNEL_RCSID(1, "$NetBSD: netbsd32_machdep.c,v 1.7 2015/11/26 13:15:34 martin Exp $");
 
 #include "opt_compat_netbsd.h"
 
@@ -93,9 +93,10 @@ netbsd32_sysarch(struct lwp *l, const st
 }
 
 vaddr_t
-netbsd32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t sz)
+netbsd32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t sz,
+    int topdown)
 {
-	if (p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN)
+	if (topdown)
 		return VM_DEFAULT_ADDRESS_TOPDOWN(base, sz);
 	else    
 		return VM_DEFAULT_ADDRESS_BOTTOMUP(base, sz);

Index: src/sys/arch/mips/mips/netbsd32_machdep.c
diff -u src/sys/arch/mips/mips/netbsd32_machdep.c:1.12 src/sys/arch/mips/mips/netbsd32_machdep.c:1.13
--- src/sys/arch/mips/mips/netbsd32_machdep.c:1.12	Sun May 17 18:52:37 2015
+++ src/sys/arch/mips/mips/netbsd32_machdep.c	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_machdep.c,v 1.12 2015/05/17 18:52:37 matt Exp $	*/
+/*	$NetBSD: netbsd32_machdep.c,v 1.13 2015/11/26 13:15:34 martin Exp $	*/
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.12 2015/05/17 18:52:37 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.13 2015/11/26 13:15:34 martin Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_coredump.h"
@@ -143,9 +143,10 @@ compat_16_netbsd32___sigreturn14(struct 
 #endif
 
 vaddr_t
-netbsd32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t size)
+netbsd32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t size,
+    int topdown)
 {
-	if (p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN)
+	if (topdown)
 		return VM_DEFAULT_ADDRESS32_TOPDOWN(base, size);
 	else
 		return VM_DEFAULT_ADDRESS32_BOTTOMUP(base, size);

Index: src/sys/arch/riscv/riscv/netbsd32_machdep.c
diff -u src/sys/arch/riscv/riscv/netbsd32_machdep.c:1.1 src/sys/arch/riscv/riscv/netbsd32_machdep.c:1.2
--- src/sys/arch/riscv/riscv/netbsd32_machdep.c:1.1	Sat Mar 28 16:13:56 2015
+++ src/sys/arch/riscv/riscv/netbsd32_machdep.c	Thu Nov 26 13:15:34 2015
@@ -29,7 +29,7 @@
 
 #include <sys/cdefs.h>
 
-__RCSID("$NetBSD: netbsd32_machdep.c,v 1.1 2015/03/28 16:13:56 matt Exp $");
+__RCSID("$NetBSD: netbsd32_machdep.c,v 1.2 2015/11/26 13:15:34 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/ucontext.h>
@@ -177,9 +177,10 @@ netbsd32_sysarch(struct lwp *l, const st
 }
 
 vaddr_t
-netbsd32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t size)
+netbsd32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t size,
+    int topdown)
 {          
-	if (p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN)
+	if (topdown)
 		return VM_DEFAULT_ADDRESS32_TOPDOWN(base, size);
 	else
 		return VM_DEFAULT_ADDRESS32_BOTTOMUP(base, size);

Index: src/sys/arch/sparc64/sparc64/netbsd32_machdep.c
diff -u src/sys/arch/sparc64/sparc64/netbsd32_machdep.c:1.108 src/sys/arch/sparc64/sparc64/netbsd32_machdep.c:1.109
--- src/sys/arch/sparc64/sparc64/netbsd32_machdep.c:1.108	Sun Nov 22 11:24:08 2015
+++ src/sys/arch/sparc64/sparc64/netbsd32_machdep.c	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_machdep.c,v 1.108 2015/11/22 11:24:08 martin Exp $	*/
+/*	$NetBSD: netbsd32_machdep.c,v 1.109 2015/11/26 13:15:34 martin Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Matthew R. Green
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.108 2015/11/22 11:24:08 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_machdep.c,v 1.109 2015/11/26 13:15:34 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -1338,7 +1338,8 @@ startlwp32(void *arg)
 }
 
 vaddr_t
-netbsd32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t size)
+netbsd32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t size,
+     int topdown)
 {
 	return round_page((vaddr_t)(base) + (vsize_t)MAXDSIZ32);
 }

Index: src/sys/arch/sparc64/sparc64/svr4_32_machdep.c
diff -u src/sys/arch/sparc64/sparc64/svr4_32_machdep.c:1.38 src/sys/arch/sparc64/sparc64/svr4_32_machdep.c:1.39
--- src/sys/arch/sparc64/sparc64/svr4_32_machdep.c:1.38	Fri Mar  4 22:25:29 2011
+++ src/sys/arch/sparc64/sparc64/svr4_32_machdep.c	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: svr4_32_machdep.c,v 1.38 2011/03/04 22:25:29 joerg Exp $	 */
+/*	$NetBSD: svr4_32_machdep.c,v 1.39 2015/11/26 13:15:34 martin Exp $	 */
 
 /*-
  * Copyright (c) 1994 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_32_machdep.c,v 1.38 2011/03/04 22:25:29 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_32_machdep.c,v 1.39 2015/11/26 13:15:34 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -673,7 +673,8 @@ svr4_32_sys_sysarch(struct lwp *l, const
 }
 
 vaddr_t
-svr4_32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t size)
+svr4_32_vm_default_addr(struct proc *p, vaddr_t base, vsize_t size,
+    int topdown)
 {
 	return round_page((vaddr_t)(base) + (vsize_t)MAXDSIZ32);
 }

Index: src/sys/compat/netbsd32/netbsd32.h
diff -u src/sys/compat/netbsd32/netbsd32.h:1.108 src/sys/compat/netbsd32/netbsd32.h:1.109
--- src/sys/compat/netbsd32/netbsd32.h:1.108	Mon Aug 10 04:48:53 2015
+++ src/sys/compat/netbsd32/netbsd32.h	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32.h,v 1.108 2015/08/10 04:48:53 mrg Exp $	*/
+/*	$NetBSD: netbsd32.h,v 1.109 2015/11/26 13:15:34 martin Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001, 2008, 2015 Matthew R. Green
@@ -1100,7 +1100,7 @@ int	coredump_netbsd32(struct lwp *, stru
 #include <compat/common/compat_util.h>
 #include <compat/sys/siginfo.h>
 
-vaddr_t netbsd32_vm_default_addr(struct proc *, vaddr_t, vsize_t);
+vaddr_t netbsd32_vm_default_addr(struct proc *, vaddr_t, vsize_t, int);
 void netbsd32_adjust_limits(struct proc *);
 
 void	netbsd32_si_to_si32(siginfo32_t *, const siginfo_t *);

Index: src/sys/compat/svr4_32/svr4_32_exec.h
diff -u src/sys/compat/svr4_32/svr4_32_exec.h:1.14 src/sys/compat/svr4_32/svr4_32_exec.h:1.15
--- src/sys/compat/svr4_32/svr4_32_exec.h:1.14	Thu Dec 10 14:13:54 2009
+++ src/sys/compat/svr4_32/svr4_32_exec.h	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: svr4_32_exec.h,v 1.14 2009/12/10 14:13:54 matt Exp $	 */
+/*	$NetBSD: svr4_32_exec.h,v 1.15 2015/11/26 13:15:34 martin Exp $	 */
 
 /*-
  * Copyright (c) 1994 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@ int svr4_32_copyargs(struct lwp *, struc
 extern struct emul emul_svr4_32;
 
 void svr4_32_setregs(struct lwp *, struct exec_package *, vaddr_t);
-vaddr_t svr4_32_vm_default_addr(struct proc *, vaddr_t, vsize_t);
+vaddr_t svr4_32_vm_default_addr(struct proc *, vaddr_t, vsize_t, int);
 int svr4_32_elf32_probe(struct lwp *, struct exec_package *, void *,
     char *, vaddr_t *);
 

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.32 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.33
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.32	Sat Aug  1 13:42:32 2015
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c	Thu Nov 26 13:15:34 2015
@@ -1772,7 +1772,8 @@ i915_gem_mmap_ioctl(struct drm_device *d
 
 #ifdef __NetBSD__
 	addr = (*curproc->p_emul->e_vm_default_addr)(curproc,
-	    (vaddr_t)curproc->p_vmspace->vm_daddr, args->size);
+	    (vaddr_t)curproc->p_vmspace->vm_daddr, args->size,
+	    curproc->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN);
 	/* XXX errno NetBSD->Linux */
 	ret = -uvm_map(&curproc->p_vmspace->vm_map, &addr, args->size,
 	    obj->gemo_shm_uao, args->offset, 0,

Index: src/sys/kern/exec_elf.c
diff -u src/sys/kern/exec_elf.c:1.80 src/sys/kern/exec_elf.c:1.81
--- src/sys/kern/exec_elf.c:1.80	Sun Nov  1 17:44:41 2015
+++ src/sys/kern/exec_elf.c	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: exec_elf.c,v 1.80 2015/11/01 17:44:41 christos Exp $	*/
+/*	$NetBSD: exec_elf.c,v 1.81 2015/11/26 13:15:34 martin Exp $	*/
 
 /*-
  * Copyright (c) 1994, 2000, 2005, 2015 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: exec_elf.c,v 1.80 2015/11/01 17:44:41 christos Exp $");
+__KERNEL_RCSID(1, "$NetBSD: exec_elf.c,v 1.81 2015/11/26 13:15:34 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_pax.h"
@@ -413,15 +413,13 @@ elf_load_interp(struct lwp *l, struct ex
 	p = l->l_proc;
 
 	KASSERT(p->p_vmspace);
-	if (__predict_true(p->p_vmspace != proc0.p_vmspace)) {
-		use_topdown = p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN;
-	} else {
+	KASSERT(p->p_vmspace != proc0.p_vmspace);
+
 #ifdef __USE_TOPDOWN_VM
-		use_topdown = epp->ep_flags & EXEC_TOPDOWN_VM;
+	use_topdown = epp->ep_flags & EXEC_TOPDOWN_VM;
 #else
-		use_topdown = false;
+	use_topdown = false;
 #endif
-	}
 
 	/*
 	 * 1. open file
@@ -531,9 +529,11 @@ elf_load_interp(struct lwp *l, struct ex
 		 */
 		addr = (*epp->ep_esch->es_emul->e_vm_default_addr)(p,
 		    epp->ep_daddr,
-		    round_page(limit) - trunc_page(base_ph->p_vaddr));
-	} else
+		    round_page(limit) - trunc_page(base_ph->p_vaddr),
+		    use_topdown);
+	} else {
 		addr = *last; /* may be ELF_LINK_ADDR */
+	}
 
 	/*
 	 * Load all the necessary sections

Index: src/sys/kern/kern_exec.c
diff -u src/sys/kern/kern_exec.c:1.421 src/sys/kern/kern_exec.c:1.422
--- src/sys/kern/kern_exec.c:1.421	Thu Oct 22 11:48:02 2015
+++ src/sys/kern/kern_exec.c	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exec.c,v 1.421 2015/10/22 11:48:02 maxv Exp $	*/
+/*	$NetBSD: kern_exec.c,v 1.422 2015/11/26 13:15:34 martin Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -59,7 +59,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.421 2015/10/22 11:48:02 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.422 2015/11/26 13:15:34 martin Exp $");
 
 #include "opt_exec.h"
 #include "opt_execfmt.h"
@@ -1919,7 +1919,7 @@ exec_sigcode_map(struct proc *p, const s
 
 	/* Just a hint to uvm_map where to put it. */
 	va = e->e_vm_default_addr(p, (vaddr_t)p->p_vmspace->vm_daddr,
-	    round_page(sz));
+	    round_page(sz), p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN);
 
 #ifdef __alpha__
 	/*

Index: src/sys/kern/kern_lwp.c
diff -u src/sys/kern/kern_lwp.c:1.181 src/sys/kern/kern_lwp.c:1.182
--- src/sys/kern/kern_lwp.c:1.181	Thu Nov 12 10:47:30 2015
+++ src/sys/kern/kern_lwp.c	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_lwp.c,v 1.181 2015/11/12 10:47:30 skrll Exp $	*/
+/*	$NetBSD: kern_lwp.c,v 1.182 2015/11/26 13:15:34 martin Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2006, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -211,7 +211,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.181 2015/11/12 10:47:30 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.182 2015/11/26 13:15:34 martin Exp $");
 
 #include "opt_ddb.h"
 #include "opt_lockdebug.h"
@@ -1743,7 +1743,8 @@ lwp_ctl_alloc(vaddr_t *uaddr)
 		lp->lp_cur = 0;
 		lp->lp_max = LWPCTL_UAREA_SZ;
 		lp->lp_uva = p->p_emul->e_vm_default_addr(p,
-		     (vaddr_t)p->p_vmspace->vm_daddr, LWPCTL_UAREA_SZ);
+		     (vaddr_t)p->p_vmspace->vm_daddr, LWPCTL_UAREA_SZ,
+		     p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN);
 		error = uvm_map(&p->p_vmspace->vm_map, &lp->lp_uva,
 		    LWPCTL_UAREA_SZ, lp->lp_uao, 0, 0, UVM_MAPFLAG(UVM_PROT_RW,
 		    UVM_PROT_RW, UVM_INH_NONE, UVM_ADV_NORMAL, 0));

Index: src/sys/kern/sysv_shm.c
diff -u src/sys/kern/sysv_shm.c:1.130 src/sys/kern/sysv_shm.c:1.131
--- src/sys/kern/sysv_shm.c:1.130	Fri Nov  6 02:26:42 2015
+++ src/sys/kern/sysv_shm.c	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysv_shm.c,v 1.130 2015/11/06 02:26:42 pgoyette Exp $	*/
+/*	$NetBSD: sysv_shm.c,v 1.131 2015/11/26 13:15:34 martin Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.130 2015/11/06 02:26:42 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysv_shm.c,v 1.131 2015/11/26 13:15:34 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_sysv.h"
@@ -436,7 +436,8 @@ sys_shmat(struct lwp *l, const struct sy
 	} else {
 		/* This is just a hint to uvm_map() about where to put it. */
 		attach_va = p->p_emul->e_vm_default_addr(p,
-		    (vaddr_t)vm->vm_daddr, size);
+		    (vaddr_t)vm->vm_daddr, size,
+		    p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN);
 	}
 
 	/*

Index: src/sys/sys/proc.h
diff -u src/sys/sys/proc.h:1.323 src/sys/sys/proc.h:1.324
--- src/sys/sys/proc.h:1.323	Thu Sep 24 14:33:31 2015
+++ src/sys/sys/proc.h	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: proc.h,v 1.323 2015/09/24 14:33:31 christos Exp $	*/
+/*	$NetBSD: proc.h,v 1.324 2015/11/26 13:15:34 martin Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -170,7 +170,8 @@ struct emul {
 	struct sysctlnode *e_sysctlovly;
 	int		(*e_fault)(struct proc *, vaddr_t, int);
 
-	vaddr_t		(*e_vm_default_addr)(struct proc *, vaddr_t, vsize_t);
+	vaddr_t		(*e_vm_default_addr)(struct proc *, vaddr_t, vsize_t,
+			     int);
 
 	/* Emulation-specific hook for userspace page faults */
 	int		(*e_usertrap)(struct lwp *, vaddr_t, void *);

Index: src/sys/uvm/uvm_extern.h
diff -u src/sys/uvm/uvm_extern.h:1.194 src/sys/uvm/uvm_extern.h:1.195
--- src/sys/uvm/uvm_extern.h:1.194	Fri Mar 20 15:41:43 2015
+++ src/sys/uvm/uvm_extern.h	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_extern.h,v 1.194 2015/03/20 15:41:43 riastradh Exp $	*/
+/*	$NetBSD: uvm_extern.h,v 1.195 2015/11/26 13:15:34 martin Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -675,7 +675,8 @@ int			uvm_pctparam_createsysctlnode(stru
 int			uvm_mmap_dev(struct proc *, void **, size_t, dev_t,
 			    off_t);
 int			uvm_mmap_anon(struct proc *, void **, size_t);
-vaddr_t			uvm_default_mapaddr(struct proc *, vaddr_t, vsize_t);
+vaddr_t			uvm_default_mapaddr(struct proc *, vaddr_t, vsize_t,
+			    int);
 
 /* uvm_mremap.c */
 int			uvm_mremap(struct vm_map *, vaddr_t, vsize_t,

Index: src/sys/uvm/uvm_mmap.c
diff -u src/sys/uvm/uvm_mmap.c:1.153 src/sys/uvm/uvm_mmap.c:1.154
--- src/sys/uvm/uvm_mmap.c:1.153	Tue Aug  4 18:28:10 2015
+++ src/sys/uvm/uvm_mmap.c	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_mmap.c,v 1.153 2015/08/04 18:28:10 maxv Exp $	*/
+/*	$NetBSD: uvm_mmap.c,v 1.154 2015/11/26 13:15:34 martin Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -46,7 +46,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_mmap.c,v 1.153 2015/08/04 18:28:10 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_mmap.c,v 1.154 2015/11/26 13:15:34 martin Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_pax.h"
@@ -371,7 +371,8 @@ sys_mmap(struct lwp *l, const struct sys
 		 */
 
 		defaddr = p->p_emul->e_vm_default_addr(p,
-		    (vaddr_t)p->p_vmspace->vm_daddr, size);
+		    (vaddr_t)p->p_vmspace->vm_daddr, size,
+		    p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN);
 
 		if (addr == 0 ||
 		    !(p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN))
@@ -1064,10 +1065,10 @@ uvm_mmap(struct vm_map *map, vaddr_t *ad
 }
 
 vaddr_t
-uvm_default_mapaddr(struct proc *p, vaddr_t base, vsize_t sz)
+uvm_default_mapaddr(struct proc *p, vaddr_t base, vsize_t sz, int topdown)
 {
 
-	if (p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN)
+	if (topdown)
 		return VM_DEFAULT_ADDRESS_TOPDOWN(base, sz);
 	else
 		return VM_DEFAULT_ADDRESS_BOTTOMUP(base, sz);
@@ -1086,7 +1087,8 @@ uvm_mmap_dev(struct proc *p, void **addr
 		flags |= MAP_FIXED;
 	else
 		*addrp = (void *)p->p_emul->e_vm_default_addr(p,
-		    (vaddr_t)p->p_vmspace->vm_daddr, len);
+		    (vaddr_t)p->p_vmspace->vm_daddr, len,
+		    p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN);
 
 	uobj = udv_attach(dev, prot, off, len);
 	if (uobj == NULL)
@@ -1109,7 +1111,8 @@ uvm_mmap_anon(struct proc *p, void **add
 		flags |= MAP_FIXED;
 	else
 		*addrp = (void *)p->p_emul->e_vm_default_addr(p,
-		    (vaddr_t)p->p_vmspace->vm_daddr, len);
+		    (vaddr_t)p->p_vmspace->vm_daddr, len,
+		    p->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN);
 
 	error = uvm_mmap(&p->p_vmspace->vm_map, (vaddr_t *)addrp,
 			 (vsize_t)len, prot, prot, flags, UVM_ADV_NORMAL,

Index: src/sys/uvm/uvm_mremap.c
diff -u src/sys/uvm/uvm_mremap.c:1.17 src/sys/uvm/uvm_mremap.c:1.18
--- src/sys/uvm/uvm_mremap.c:1.17	Sun Jun 12 03:36:03 2011
+++ src/sys/uvm/uvm_mremap.c	Thu Nov 26 13:15:34 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_mremap.c,v 1.17 2011/06/12 03:36:03 rmind Exp $	*/
+/*	$NetBSD: uvm_mremap.c,v 1.18 2015/11/26 13:15:34 martin Exp $	*/
 
 /*-
  * Copyright (c)2006,2007,2009 YAMAMOTO Takashi,
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_mremap.c,v 1.17 2011/06/12 03:36:03 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_mremap.c,v 1.18 2015/11/26 13:15:34 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/mman.h>
@@ -196,7 +196,8 @@ uvm_mremap(struct vm_map *oldmap, vaddr_
 	if (!fixed) {
 		KASSERT(&newproc->p_vmspace->vm_map == newmap);
 		newva = newproc->p_emul->e_vm_default_addr(newproc,
-		    (vaddr_t)newproc->p_vmspace->vm_daddr, newsize);
+		    (vaddr_t)newproc->p_vmspace->vm_daddr, newsize,
+		    newproc->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN);
 	}
 	dstva = newva;
 	if (!uvm_map_reserve(newmap, newsize, oldva, align, &dstva, 

Reply via email to