Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys We never exec(2) with a kernel vmspace, so do not test f...



details:   https://anonhg.NetBSD.org/src/rev/be45047166f7
branches:  trunk
changeset: 341857:be45047166f7
user:      martin <martin%NetBSD.org@localhost>
date:      Thu Nov 26 13:15:34 2015 +0000

description:
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.

diffstat:

 sys/arch/amd64/amd64/netbsd32_machdep.c        |   9 +++++----
 sys/arch/arm/arm32/netbsd32_machdep.c          |   7 ++++---
 sys/arch/mips/mips/netbsd32_machdep.c          |   9 +++++----
 sys/arch/riscv/riscv/netbsd32_machdep.c        |   7 ++++---
 sys/arch/sparc64/sparc64/netbsd32_machdep.c    |   7 ++++---
 sys/arch/sparc64/sparc64/svr4_32_machdep.c     |   7 ++++---
 sys/compat/netbsd32/netbsd32.h                 |   4 ++--
 sys/compat/svr4_32/svr4_32_exec.h              |   4 ++--
 sys/external/bsd/drm2/dist/drm/i915/i915_gem.c |   3 ++-
 sys/kern/exec_elf.c                            |  20 ++++++++++----------
 sys/kern/kern_exec.c                           |   6 +++---
 sys/kern/kern_lwp.c                            |   7 ++++---
 sys/kern/sysv_shm.c                            |   7 ++++---
 sys/sys/proc.h                                 |   5 +++--
 sys/uvm/uvm_extern.h                           |   5 +++--
 sys/uvm/uvm_mmap.c                             |  17 ++++++++++-------
 sys/uvm/uvm_mremap.c                           |   7 ++++---
 17 files changed, 73 insertions(+), 58 deletions(-)

diffs (truncated from 479 to 300 lines):

diff -r dc73159aef9c -r be45047166f7 sys/arch/amd64/amd64/netbsd32_machdep.c
--- a/sys/arch/amd64/amd64/netbsd32_machdep.c   Thu Nov 26 09:48:21 2015 +0000
+++ b/sys/arch/amd64/amd64/netbsd32_machdep.c   Thu Nov 26 13:15:34 2015 +0000
@@ -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 @@
 }
 
 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);
diff -r dc73159aef9c -r be45047166f7 sys/arch/arm/arm32/netbsd32_machdep.c
--- a/sys/arch/arm/arm32/netbsd32_machdep.c     Thu Nov 26 09:48:21 2015 +0000
+++ b/sys/arch/arm/arm32/netbsd32_machdep.c     Thu Nov 26 13:15:34 2015 +0000
@@ -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 @@
 }
 
 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);
diff -r dc73159aef9c -r be45047166f7 sys/arch/mips/mips/netbsd32_machdep.c
--- a/sys/arch/mips/mips/netbsd32_machdep.c     Thu Nov 26 09:48:21 2015 +0000
+++ b/sys/arch/mips/mips/netbsd32_machdep.c     Thu Nov 26 13:15:34 2015 +0000
@@ -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 @@
 #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);
diff -r dc73159aef9c -r be45047166f7 sys/arch/riscv/riscv/netbsd32_machdep.c
--- a/sys/arch/riscv/riscv/netbsd32_machdep.c   Thu Nov 26 09:48:21 2015 +0000
+++ b/sys/arch/riscv/riscv/netbsd32_machdep.c   Thu Nov 26 13:15:34 2015 +0000
@@ -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 @@
 }
 
 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);
diff -r dc73159aef9c -r be45047166f7 sys/arch/sparc64/sparc64/netbsd32_machdep.c
--- a/sys/arch/sparc64/sparc64/netbsd32_machdep.c       Thu Nov 26 09:48:21 2015 +0000
+++ b/sys/arch/sparc64/sparc64/netbsd32_machdep.c       Thu Nov 26 13:15:34 2015 +0000
@@ -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 @@
 }
 
 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);
 }
diff -r dc73159aef9c -r be45047166f7 sys/arch/sparc64/sparc64/svr4_32_machdep.c
--- a/sys/arch/sparc64/sparc64/svr4_32_machdep.c        Thu Nov 26 09:48:21 2015 +0000
+++ b/sys/arch/sparc64/sparc64/svr4_32_machdep.c        Thu Nov 26 13:15:34 2015 +0000
@@ -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 @@
 }
 
 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);
 }
diff -r dc73159aef9c -r be45047166f7 sys/compat/netbsd32/netbsd32.h
--- a/sys/compat/netbsd32/netbsd32.h    Thu Nov 26 09:48:21 2015 +0000
+++ b/sys/compat/netbsd32/netbsd32.h    Thu Nov 26 13:15:34 2015 +0000
@@ -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 @@
 #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 *);
diff -r dc73159aef9c -r be45047166f7 sys/compat/svr4_32/svr4_32_exec.h
--- a/sys/compat/svr4_32/svr4_32_exec.h Thu Nov 26 09:48:21 2015 +0000
+++ b/sys/compat/svr4_32/svr4_32_exec.h Thu Nov 26 13:15:34 2015 +0000
@@ -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 @@
 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 *);
 
diff -r dc73159aef9c -r be45047166f7 sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
--- a/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c    Thu Nov 26 09:48:21 2015 +0000
+++ b/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c    Thu Nov 26 13:15:34 2015 +0000
@@ -1772,7 +1772,8 @@
 
 #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,
diff -r dc73159aef9c -r be45047166f7 sys/kern/exec_elf.c
--- a/sys/kern/exec_elf.c       Thu Nov 26 09:48:21 2015 +0000
+++ b/sys/kern/exec_elf.c       Thu Nov 26 13:15:34 2015 +0000
@@ -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 @@
        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 @@
                 */
                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
diff -r dc73159aef9c -r be45047166f7 sys/kern/kern_exec.c
--- a/sys/kern/kern_exec.c      Thu Nov 26 09:48:21 2015 +0000
+++ b/sys/kern/kern_exec.c      Thu Nov 26 13:15:34 2015 +0000
@@ -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 @@
 
        /* 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__
        /*
diff -r dc73159aef9c -r be45047166f7 sys/kern/kern_lwp.c
--- a/sys/kern/kern_lwp.c       Thu Nov 26 09:48:21 2015 +0000
+++ b/sys/kern/kern_lwp.c       Thu Nov 26 13:15:34 2015 +0000
@@ -1,4 +1,4 @@



Home | Main Index | Thread Index | Old Index