Source-Changes-HG archive

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

[src/netbsd-1-5]: src/sys Pullup by patch [eeh]:



details:   https://anonhg.NetBSD.org/src/rev/c9b82be5911a
branches:  netbsd-1-5
changeset: 489904:c9b82be5911a
user:      tv <tv%NetBSD.org@localhost>
date:      Wed Oct 18 16:23:57 2000 +0000

description:
Pullup by patch [eeh]:
Support userspace at multiple addresses by making PSSTRINGS variable (using
p_psstr), and fix stackgap_init() appropriately.

diffstat:

 sys/compat/common/compat_util.c       |  15 +++++++++------
 sys/compat/netbsd32/netbsd32_netbsd.c |  16 ++++++++++++----
 sys/kern/kern_exec.c                  |  24 +++++++++++++++++++-----
 sys/miscfs/procfs/procfs_cmdline.c    |   4 ++--
 sys/sys/exec.h                        |  11 ++++++++++-
 sys/vm/vm.h                           |   3 ++-
 6 files changed, 54 insertions(+), 19 deletions(-)

diffs (220 lines):

diff -r 5509097e8ba9 -r c9b82be5911a sys/compat/common/compat_util.c
--- a/sys/compat/common/compat_util.c   Wed Oct 18 04:21:47 2000 +0000
+++ b/sys/compat/common/compat_util.c   Wed Oct 18 16:23:57 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: compat_util.c,v 1.14.12.1 2000/08/30 03:59:18 sommerfeld Exp $ */
+/*     $NetBSD: compat_util.c,v 1.14.12.2 2000/10/18 16:23:57 tv Exp $ */
 
 /*-
  * Copyright (c) 1994 The NetBSD Foundation, Inc.
@@ -234,9 +234,11 @@
 stackgap_init(e)
        struct emul *e;
 {
+       struct proc *p = curproc;               /* XXX */
 
 #define szsigcode ((caddr_t)(e->e_esigcode - e->e_sigcode))
-       return STACKGAPBASE;
+       return (caddr_t)(((unsigned long)p->p_psstr - (unsigned long)szsigcode
+               - STACKGAPLEN) & ~ALIGNBYTES);
 #undef szsigcode
 }
 
@@ -246,17 +248,18 @@
        caddr_t *sgp;
        size_t sz;
 {
-       void *p = (void *) *sgp;
+       void *n = (void *) *sgp;
        caddr_t nsgp;
-       struct emul *e = curproc->p_emul;        /* XXX */
+       struct proc *p = curproc;               /* XXX */
+       struct emul *e = p->p_emul;
        int sigsize = e->e_esigcode - e->e_sigcode;
        
        sz = ALIGN(sz);
        nsgp = *sgp + sz;
-       if (nsgp > (((caddr_t)PS_STRINGS) - sigsize))
+       if (nsgp > (((caddr_t)p->p_psstr) - sigsize))
                return NULL;
        *sgp = nsgp;
-       return p;
+       return n;
 }
 
 void
diff -r 5509097e8ba9 -r c9b82be5911a sys/compat/netbsd32/netbsd32_netbsd.c
--- a/sys/compat/netbsd32/netbsd32_netbsd.c     Wed Oct 18 04:21:47 2000 +0000
+++ b/sys/compat/netbsd32/netbsd32_netbsd.c     Wed Oct 18 16:23:57 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: netbsd32_netbsd.c,v 1.28.2.3 2000/08/26 01:09:34 mrg Exp $     */
+/*     $NetBSD: netbsd32_netbsd.c,v 1.28.2.4 2000/10/18 16:23:58 tv Exp $      */
 
 /*
  * Copyright (c) 1998 Matthew R. Green
@@ -1926,6 +1926,7 @@
        vm->vm_dsize = btoc(pack.ep_dsize);
        vm->vm_ssize = btoc(pack.ep_ssize);
        vm->vm_maxsaddr = (char *) pack.ep_maxsaddr;
+       vm->vm_minsaddr = (char *) pack.ep_minsaddr;
 
        /* create the new process's VM space by running the vmcmds */
 #ifdef DIAGNOSTIC
@@ -1950,19 +1951,26 @@
        arginfo.ps_nargvstr = argc;
        arginfo.ps_nenvstr = envc;
 
-       stack = (char *) (USRSTACK - len);
+       stack = (char *) (vm->vm_minsaddr - len);
        /* Now copy argc, args & environ to new stack */
        if (!(*pack.ep_emul->e_copyargs)(&pack, &arginfo, stack, argp))
                goto exec_abort;
 
+       /* fill process ps_strings info */
+       p->p_psstr = (struct ps_strings *)(stack - sizeof(struct ps_strings));
+       p->p_psargv = offsetof(struct ps_strings, ps_argvstr);
+       p->p_psnargv = offsetof(struct ps_strings, ps_nargvstr);
+       p->p_psenv = offsetof(struct ps_strings, ps_envstr);
+       p->p_psnenv = offsetof(struct ps_strings, ps_nenvstr);
+
        /* copy out the process's ps_strings structure */
-       if (copyout(&arginfo, (char *) PS_STRINGS, sizeof(arginfo)))
+       if (copyout(&arginfo, (char *)p->p_psstr, sizeof(arginfo)))
                goto exec_abort;
 
        /* copy out the process's signal trapoline code */
        if (szsigcode) {
                if (copyout((char *)pack.ep_emul->e_sigcode,
-                   p->p_sigacts->ps_sigcode = (char *)PS_STRINGS - szsigcode,
+                   p->p_sigacts->ps_sigcode = (char *)p->p_psstr - szsigcode,
                    szsigcode))
                        goto exec_abort;
 #ifdef PMAP_NEED_PROCWR
diff -r 5509097e8ba9 -r c9b82be5911a sys/kern/kern_exec.c
--- a/sys/kern/kern_exec.c      Wed Oct 18 04:21:47 2000 +0000
+++ b/sys/kern/kern_exec.c      Wed Oct 18 16:23:57 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: kern_exec.c,v 1.110.4.2 2000/07/31 02:41:26 mrg Exp $  */
+/*     $NetBSD: kern_exec.c,v 1.110.4.3 2000/10/18 16:23:59 tv Exp $   */
 
 /*-
  * Copyright (C) 1993, 1994, 1996 Christopher G. Demetriou
@@ -379,6 +379,7 @@
        vm->vm_dsize = btoc(pack.ep_dsize);
        vm->vm_ssize = btoc(pack.ep_ssize);
        vm->vm_maxsaddr = (char *) pack.ep_maxsaddr;
+       vm->vm_minsaddr = (char *) pack.ep_minsaddr;
 
        /* create the new process's VM space by running the vmcmds */
 #ifdef DIAGNOSTIC
@@ -403,7 +404,7 @@
        arginfo.ps_nargvstr = argc;
        arginfo.ps_nenvstr = envc;
 
-       stack = (char *) (USRSTACK - len);
+       stack = (char *) (vm->vm_minsaddr - len);
        /* Now copy argc, args & environ to new stack */
        if (!(*pack.ep_emul->e_copyargs)(&pack, &arginfo, stack, argp))
                goto exec_abort;
@@ -413,18 +414,31 @@
                goto exec_abort;
 
        /* fill process ps_strings info */
-       p->p_psstr = PS_STRINGS;
+       p->p_psstr = (struct ps_strings *)(vm->vm_minsaddr
+               - sizeof(struct ps_strings));
        p->p_psargv = offsetof(struct ps_strings, ps_argvstr);
        p->p_psnargv = offsetof(struct ps_strings, ps_nargvstr);
        p->p_psenv = offsetof(struct ps_strings, ps_envstr);
        p->p_psnenv = offsetof(struct ps_strings, ps_nenvstr);
 
+       /* copy out the process's ps_strings structure */
+       if (copyout(&arginfo, (char *)p->p_psstr, sizeof(arginfo))) {
+#ifdef DEBUG
+               printf("execve: ps_strings copyout failed\n");
+#endif
+               goto exec_abort;
+       }
+
        /* copy out the process's signal trapoline code */
        if (szsigcode) {
                if (copyout((char *)pack.ep_emul->e_sigcode,
-                   p->p_sigacts->ps_sigcode = (char *)PS_STRINGS - szsigcode,
-                   szsigcode))
+                   p->p_sigacts->ps_sigcode = (char *)p->p_psstr - szsigcode,
+                   szsigcode)) {
+#ifdef DEBUG
+                       printf("execve: sig trampoline copyout failed\n");
+#endif
                        goto exec_abort;
+               }
 #ifdef PMAP_NEED_PROCWR
                /* This is code. Let the pmap do what is needed. */
                pmap_procwr(p, (vaddr_t)p->p_sigacts->ps_sigcode, szsigcode);
diff -r 5509097e8ba9 -r c9b82be5911a sys/miscfs/procfs/procfs_cmdline.c
--- a/sys/miscfs/procfs/procfs_cmdline.c        Wed Oct 18 04:21:47 2000 +0000
+++ b/sys/miscfs/procfs/procfs_cmdline.c        Wed Oct 18 16:23:57 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: procfs_cmdline.c,v 1.8 2000/06/01 13:43:08 simonb Exp $        */
+/*     $NetBSD: procfs_cmdline.c,v 1.8.2.1 2000/10/18 16:23:59 tv Exp $        */
 
 /*
  * Copyright (c) 1999 Jaromir Dolecek <dolecek%ics.muni.cz@localhost>
@@ -119,7 +119,7 @@
        aiov.iov_len = sizeof(pss);
        auio.uio_iov = &aiov;
        auio.uio_iovcnt = 1;
-       auio.uio_offset = (vaddr_t)PS_STRINGS;
+       auio.uio_offset = (vaddr_t)p->p_psstr;
        auio.uio_resid = sizeof(pss);
        auio.uio_segflg = UIO_SYSSPACE;
        auio.uio_rw = UIO_READ;
diff -r 5509097e8ba9 -r c9b82be5911a sys/sys/exec.h
--- a/sys/sys/exec.h    Wed Oct 18 04:21:47 2000 +0000
+++ b/sys/sys/exec.h    Wed Oct 18 16:23:57 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: exec.h,v 1.68.4.1 2000/06/22 16:26:12 matt Exp $       */
+/*     $NetBSD: exec.h,v 1.68.4.2 2000/10/18 16:23:59 tv Exp $ */
 
 /*-
  * Copyright (c) 1994 Christopher G. Demetriou
@@ -63,6 +63,12 @@
 /*
  * Address of ps_strings structure.  We only use this as a default in user
  * space; normal access is done through __ps_strings.
+ *
+ * XXXX PS_STRINGS is deprecated since it can move around for different
+ * processes or emulations.
+ * In the kernel use p->p_psstr.
+ * In userland you should use what's passed in to crt0.s or system calls.
+ *
  */
 #define        PS_STRINGS \
        ((struct ps_strings *)(USRSTACK - sizeof(struct ps_strings)))
@@ -72,6 +78,9 @@
  * (used to copyin/copyout various emulation data structures).
  */
 #define        STACKGAPLEN     400     /* plenty enough for now */
+/*
+ * XXXX The following are deprecated.  Use p->p_psstr instead of PS_STRINGS.
+ */
 #define        STACKGAPBASE_UNALIGNED  \
        ((caddr_t)PS_STRINGS - szsigcode - STACKGAPLEN)
 #define        STACKGAPBASE            \
diff -r 5509097e8ba9 -r c9b82be5911a sys/vm/vm.h
--- a/sys/vm/vm.h       Wed Oct 18 04:21:47 2000 +0000
+++ b/sys/vm/vm.h       Wed Oct 18 16:23:57 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: vm.h,v 1.22.4.1 2000/08/05 11:10:43 wiz Exp $  */
+/*     $NetBSD: vm.h,v 1.22.4.2 2000/10/18 16:24:00 tv Exp $   */
 
 /*
  * Copyright (c) 1991, 1993
@@ -83,6 +83,7 @@
        caddr_t vm_taddr;       /* user virtual address of text XXX */
        caddr_t vm_daddr;       /* user virtual address of data XXX */
        caddr_t vm_maxsaddr;    /* user VA at max stack growth */
+       caddr_t vm_minsaddr;    /* user VA at top of stack */
 };
 
 #ifdef pmap_resident_count



Home | Main Index | Thread Index | Old Index