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