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,