summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_fork.c
diff options
context:
space:
mode:
authorniklas <niklas@openbsd.org>1999-08-17 10:32:16 +0000
committerniklas <niklas@openbsd.org>1999-08-17 10:32:16 +0000
commit9c2090272aee3ad7a054aba6b9736090fb33f78a (patch)
treed1801380d9503618e35645ab16f44d5be0d8c201 /sys/kern/kern_fork.c
parentMore <sys/file.h> vs. <fcntl.h> and open() flags fixes. (diff)
downloadwireguard-openbsd-9c2090272aee3ad7a054aba6b9736090fb33f78a.tar.xz
wireguard-openbsd-9c2090272aee3ad7a054aba6b9736090fb33f78a.zip
New cpu_fork API to take a stack in which you point the child's stackpointer
to, at the bottom or the top, depending on your architecture's stack growth direction. This is in preparation for Linux' clone(2) emulation. port maintainers, please check that I did the work right.
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r--sys/kern/kern_fork.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index ef16a476ee7..364e767b3f6 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_fork.c,v 1.23 1999/08/15 00:07:43 pjanzen Exp $ */
+/* $OpenBSD: kern_fork.c,v 1.24 1999/08/17 10:32:18 niklas Exp $ */
/* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */
/*
@@ -78,7 +78,7 @@ sys_fork(p, v, retval)
void *v;
register_t *retval;
{
- return (fork1(p, ISFORK, 0, retval));
+ return (fork1(p, ISFORK, 0, NULL, 0, retval));
}
/*ARGSUSED*/
@@ -88,7 +88,7 @@ sys_vfork(p, v, retval)
void *v;
register_t *retval;
{
- return (fork1(p, ISVFORK, 0, retval));
+ return (fork1(p, ISVFORK, 0, NULL, 0, retval));
}
int
@@ -101,14 +101,16 @@ sys_rfork(p, v, retval)
syscallarg(int) flags;
} */ *uap = v;
- return (fork1(p, ISRFORK, SCARG(uap, flags), retval));
+ return (fork1(p, ISRFORK, SCARG(uap, flags), NULL, 0, retval));
}
int
-fork1(p1, forktype, rforkflags, retval)
+fork1(p1, forktype, rforkflags, stack, stacksize, retval)
register struct proc *p1;
int forktype;
int rforkflags;
+ void *stack;
+ size_t stacksize;
register_t *retval;
{
register struct proc *p2;
@@ -334,7 +336,7 @@ again:
*/
retval[0] = 0;
retval[1] = 1;
- if (vm_fork(p1, p2))
+ if (vm_fork(p1, p2, stack, stacksize))
return (0);
#else
/*
@@ -342,9 +344,11 @@ again:
* different path later.
*/
#if defined(UVM)
- uvm_fork(p1, p2, (forktype == ISRFORK && (rforkflags & RFMEM)) ? TRUE : FALSE);
+ uvm_fork(p1, p2,
+ (forktype == ISRFORK && (rforkflags & RFMEM)) ? TRUE : FALSE,
+ stack, stacksize);
#else /* UVM */
- vm_fork(p1, p2);
+ vm_fork(p1, p2, stack, stacksize);
#endif /* UVM */
#endif
vm = p2->p_vmspace;