Module Name: src
Committed By: pooka
Date: Sat Jan 3 17:23:51 UTC 2015
Modified Files:
src/sys/rump/librump/rumpkern: Makefile.rumpkern emul.c rump.c
rump_private.h rumpcopy.c signals.c vm.c
Added Files:
src/sys/rump/librump/rumpkern: sysproxy.c
Log Message:
Put all sysproxy routines to their own C module, sysproxy.c
To generate a diff of this commit:
cvs rdiff -u -r1.151 -r1.152 src/sys/rump/librump/rumpkern/Makefile.rumpkern
cvs rdiff -u -r1.168 -r1.169 src/sys/rump/librump/rumpkern/emul.c
cvs rdiff -u -r1.312 -r1.313 src/sys/rump/librump/rumpkern/rump.c
cvs rdiff -u -r1.85 -r1.86 src/sys/rump/librump/rumpkern/rump_private.h
cvs rdiff -u -r1.18 -r1.19 src/sys/rump/librump/rumpkern/rumpcopy.c
cvs rdiff -u -r1.13 -r1.14 src/sys/rump/librump/rumpkern/signals.c
cvs rdiff -u -r0 -r1.1 src/sys/rump/librump/rumpkern/sysproxy.c
cvs rdiff -u -r1.160 -r1.161 src/sys/rump/librump/rumpkern/vm.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/rump/librump/rumpkern/Makefile.rumpkern
diff -u src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.151 src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.152
--- src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.151 Tue Dec 2 01:59:15 2014
+++ src/sys/rump/librump/rumpkern/Makefile.rumpkern Sat Jan 3 17:23:51 2015
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.rumpkern,v 1.151 2014/12/02 01:59:15 pooka Exp $
+# $NetBSD: Makefile.rumpkern,v 1.152 2015/01/03 17:23:51 pooka Exp $
#
.include "${RUMPTOP}/Makefile.rump"
@@ -28,7 +28,7 @@ MAN= rump.3 rump_lwproc.3
SRCS+= rump.c rumpcopy.c cons.c emul.c etfs_wrap.c intr.c \
lwproc.c klock.c kobj_rename.c ltsleep.c scheduler.c \
signals.c sleepq.c threads.c vm.c hyperentropy.c \
- accessors.c
+ accessors.c sysproxy.c
SRCS+= rumpkern_syscalls.c
Index: src/sys/rump/librump/rumpkern/emul.c
diff -u src/sys/rump/librump/rumpkern/emul.c:1.168 src/sys/rump/librump/rumpkern/emul.c:1.169
--- src/sys/rump/librump/rumpkern/emul.c:1.168 Tue Nov 18 16:57:52 2014
+++ src/sys/rump/librump/rumpkern/emul.c Sat Jan 3 17:23:51 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: emul.c,v 1.168 2014/11/18 16:57:52 pooka Exp $ */
+/* $NetBSD: emul.c,v 1.169 2015/01/03 17:23:51 pooka Exp $ */
/*
* Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.168 2014/11/18 16:57:52 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.169 2015/01/03 17:23:51 pooka Exp $");
#include <sys/param.h>
#include <sys/null.h>
@@ -382,7 +382,7 @@ cpu_reboot(int howto, char *bootstr)
/* your wish is my command */
if (howto & RB_HALT) {
printf("rump kernel halted\n");
- rumpuser_sp_fini(finiarg);
+ rump_sysproxy_fini(finiarg);
for (;;) {
rumpuser_clock_sleep(RUMPUSER_CLOCK_RELWALL, 10, 0);
}
@@ -391,6 +391,6 @@ cpu_reboot(int howto, char *bootstr)
/* this function is __dead, we must exit */
out:
printf("halted\n");
- rumpuser_sp_fini(finiarg);
+ rump_sysproxy_fini(finiarg);
rumpuser_exit(ruhow);
}
Index: src/sys/rump/librump/rumpkern/rump.c
diff -u src/sys/rump/librump/rumpkern/rump.c:1.312 src/sys/rump/librump/rumpkern/rump.c:1.313
--- src/sys/rump/librump/rumpkern/rump.c:1.312 Mon Aug 25 18:44:02 2014
+++ src/sys/rump/librump/rumpkern/rump.c Sat Jan 3 17:23:51 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rump.c,v 1.312 2014/08/25 18:44:02 pooka Exp $ */
+/* $NetBSD: rump.c,v 1.313 2015/01/03 17:23:51 pooka Exp $ */
/*
* Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.312 2014/08/25 18:44:02 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.313 2015/01/03 17:23:51 pooka Exp $");
#include <sys/systm.h>
#define ELFSIZE ARCH_ELFSIZE
@@ -101,11 +101,6 @@ int rump_threads = 0;
int rump_threads = 1;
#endif
-static int rump_hyp_syscall(int, void *, long *);
-static int rump_hyp_rfork(void *, int, const char *);
-static void rump_hyp_lwpexit(void);
-static void rump_hyp_execnotify(const char *);
-
static void rump_component_addlocal(void);
static struct lwp *bootlwp;
@@ -154,14 +149,6 @@ mksysctls(void)
CTL_HW, HW_PAGESIZE, CTL_EOL);
}
-/* there's no convenient kernel entry point for this, so just craft out own */
-static pid_t
-spgetpid(void)
-{
-
- return curproc->p_pid;
-}
-
static const struct rumpuser_hyperup hyp = {
.hyp_schedule = rump_schedule,
.hyp_unschedule = rump_unschedule,
@@ -169,13 +156,13 @@ static const struct rumpuser_hyperup hyp
.hyp_backend_schedule = rump_user_schedule,
.hyp_lwproc_switch = rump_lwproc_switch,
.hyp_lwproc_release = rump_lwproc_releaselwp,
- .hyp_lwproc_rfork = rump_hyp_rfork,
+ .hyp_lwproc_rfork = rump_sysproxy_hyp_rfork,
.hyp_lwproc_newlwp = rump_lwproc_newlwp,
.hyp_lwproc_curlwp = rump_lwproc_curlwp,
- .hyp_lwpexit = rump_hyp_lwpexit,
- .hyp_syscall = rump_hyp_syscall,
- .hyp_execnotify = rump_hyp_execnotify,
- .hyp_getpid = spgetpid,
+ .hyp_lwpexit = rump_sysproxy_hyp_lwpexit,
+ .hyp_syscall = rump_sysproxy_hyp_syscall,
+ .hyp_execnotify = rump_sysproxy_hyp_execnotify,
+ .hyp_getpid = rump_sysproxy_hyp_getpid,
};
int
@@ -476,13 +463,6 @@ rump_init(void)
/* historic compat */
__strong_alias(rump__init,rump_init);
-int
-rump_init_server(const char *url)
-{
-
- return rumpuser_sp_init(url, ostype, osrelease, MACHINE);
-}
-
static int compcounter[RUMP_COMPONENT_MAX];
static int compinited[RUMP_COMPONENT_MAX];
@@ -630,141 +610,6 @@ rump_kernelfsym_load(void *symtab, uint6
return 0;
}
-static int
-rump_hyp_syscall(int num, void *arg, long *retval)
-{
- register_t regrv[2] = {0, 0};
- struct lwp *l;
- struct sysent *callp;
- int rv;
-
- if (__predict_false(num >= SYS_NSYSENT))
- return ENOSYS;
-
- /* XXX: always uses native syscall vector */
- callp = rump_sysent + num;
- l = curlwp;
- rv = sy_invoke(callp, l, (void *)arg, regrv, num);
- retval[0] = regrv[0];
- retval[1] = regrv[1];
-
- return rv;
-}
-
-static int
-rump_hyp_rfork(void *priv, int flags, const char *comm)
-{
- struct vmspace *newspace;
- struct proc *p;
- struct lwp *l;
- int error;
- bool initfds;
-
- /*
- * If we are forking off of pid 1, initialize file descriptors.
- */
- l = curlwp;
- if (l->l_proc->p_pid == 1) {
- KASSERT(flags == RUMP_RFFD_CLEAR);
- initfds = true;
- } else {
- initfds = false;
- }
-
- if ((error = rump_lwproc_rfork(flags)) != 0)
- return error;
-
- /*
- * We forked in this routine, so cannot use curlwp (const)
- */
- l = rump_lwproc_curlwp();
- p = l->l_proc;
-
- /*
- * Since it's a proxy proc, adjust the vmspace.
- * Refcount will eternally be 1.
- */
- newspace = kmem_zalloc(sizeof(*newspace), KM_SLEEP);
- newspace->vm_refcnt = 1;
- newspace->vm_map.pmap = priv;
- KASSERT(p->p_vmspace == vmspace_kernel());
- p->p_vmspace = newspace;
- if (comm)
- strlcpy(p->p_comm, comm, sizeof(p->p_comm));
- if (initfds)
- rump_consdev_init();
-
- return 0;
-}
-
-/*
- * Order all lwps in a process to exit. does *not* wait for them to drain.
- */
-static void
-rump_hyp_lwpexit(void)
-{
- struct proc *p = curproc;
- uint64_t where;
- struct lwp *l;
-
- mutex_enter(p->p_lock);
- /*
- * First pass: mark all lwps in the process with LW_RUMP_QEXIT
- * so that they know they should exit.
- */
- LIST_FOREACH(l, &p->p_lwps, l_sibling) {
- if (l == curlwp)
- continue;
- l->l_flag |= LW_RUMP_QEXIT;
- }
- mutex_exit(p->p_lock);
-
- /*
- * Next, make sure everyone on all CPUs sees our status
- * update. This keeps threads inside cv_wait() and makes
- * sure we don't access a stale cv pointer later when
- * we wake up the threads.
- */
-
- where = xc_broadcast(0, (xcfunc_t)nullop, NULL, NULL);
- xc_wait(where);
-
- /*
- * Ok, all lwps are either:
- * 1) not in the cv code
- * 2) sleeping on l->l_private
- * 3) sleeping on p->p_waitcv
- *
- * Either way, l_private is stable until we set PS_RUMP_LWPEXIT
- * in p->p_sflag.
- */
-
- mutex_enter(p->p_lock);
- LIST_FOREACH(l, &p->p_lwps, l_sibling) {
- if (l->l_private)
- cv_broadcast(l->l_private);
- }
- p->p_sflag |= PS_RUMP_LWPEXIT;
- cv_broadcast(&p->p_waitcv);
- mutex_exit(p->p_lock);
-}
-
-/*
- * Notify process that all threads have been drained and exec is complete.
- */
-static void
-rump_hyp_execnotify(const char *comm)
-{
- struct proc *p = curproc;
-
- fd_closeexec();
- mutex_enter(p->p_lock);
- KASSERT(p->p_nlwps == 1 && p->p_sflag & PS_RUMP_LWPEXIT);
- p->p_sflag &= ~PS_RUMP_LWPEXIT;
- mutex_exit(p->p_lock);
- strlcpy(p->p_comm, comm, sizeof(p->p_comm));
-}
-
int
rump_boot_gethowto()
{
Index: src/sys/rump/librump/rumpkern/rump_private.h
diff -u src/sys/rump/librump/rumpkern/rump_private.h:1.85 src/sys/rump/librump/rumpkern/rump_private.h:1.86
--- src/sys/rump/librump/rumpkern/rump_private.h:1.85 Sun Apr 27 16:28:21 2014
+++ src/sys/rump/librump/rumpkern/rump_private.h Sat Jan 3 17:23:51 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rump_private.h,v 1.85 2014/04/27 16:28:21 pooka Exp $ */
+/* $NetBSD: rump_private.h,v 1.86 2015/01/03 17:23:51 pooka Exp $ */
/*
* Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved.
@@ -187,4 +187,18 @@ void rump_lwproc_init(void);
void rump_lwproc_curlwp_set(struct lwp *);
void rump_lwproc_curlwp_clear(struct lwp *);
+/* in-kernel sysproxy bouncers */
+int rump_sysproxy_copyin(void *, const void *, void *, size_t);
+int rump_sysproxy_copyinstr(void *, const void *, void *, size_t *);
+int rump_sysproxy_copyout(void *, const void *, void *, size_t);
+int rump_sysproxy_copyoutstr(void *, const void *, void *, size_t *);
+int rump_sysproxy_anonmmap(void *, size_t, void **);
+int rump_sysproxy_raise(void *, int);
+void rump_sysproxy_fini(void *);
+pid_t rump_sysproxy_hyp_getpid(void);
+int rump_sysproxy_hyp_syscall(int, void *, long *);
+int rump_sysproxy_hyp_rfork(void *, int, const char *);
+void rump_sysproxy_hyp_lwpexit(void);
+void rump_sysproxy_hyp_execnotify(const char *);
+
#endif /* _SYS_RUMP_PRIVATE_H_ */
Index: src/sys/rump/librump/rumpkern/rumpcopy.c
diff -u src/sys/rump/librump/rumpkern/rumpcopy.c:1.18 src/sys/rump/librump/rumpkern/rumpcopy.c:1.19
--- src/sys/rump/librump/rumpkern/rumpcopy.c:1.18 Fri Jul 26 16:07:51 2013
+++ src/sys/rump/librump/rumpkern/rumpcopy.c Sat Jan 3 17:23:51 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: rumpcopy.c,v 1.18 2013/07/26 16:07:51 njoly Exp $ */
+/* $NetBSD: rumpcopy.c,v 1.19 2015/01/03 17:23:51 pooka Exp $ */
/*
* Copyright (c) 2009 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpcopy.c,v 1.18 2013/07/26 16:07:51 njoly Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpcopy.c,v 1.19 2015/01/03 17:23:51 pooka Exp $");
#include <sys/param.h>
#include <sys/lwp.h>
@@ -49,7 +49,7 @@ copyin(const void *uaddr, void *kaddr, s
if (RUMP_LOCALPROC_P(curproc)) {
memcpy(kaddr, uaddr, len);
} else if (len) {
- error = rumpuser_sp_copyin(curproc->p_vmspace->vm_map.pmap,
+ error = rump_sysproxy_copyin(curproc->p_vmspace->vm_map.pmap,
uaddr, kaddr, len);
}
@@ -68,7 +68,7 @@ copyout(const void *kaddr, void *uaddr,
if (RUMP_LOCALPROC_P(curproc)) {
memcpy(uaddr, kaddr, len);
} else if (len) {
- error = rumpuser_sp_copyout(curproc->p_vmspace->vm_map.pmap,
+ error = rump_sysproxy_copyout(curproc->p_vmspace->vm_map.pmap,
kaddr, uaddr, len);
}
return error;
@@ -82,7 +82,7 @@ subyte(void *uaddr, int byte)
if (RUMP_LOCALPROC_P(curproc))
*(char *)uaddr = byte;
else
- error = rumpuser_sp_copyout(curproc->p_vmspace->vm_map.pmap,
+ error = rump_sysproxy_copyout(curproc->p_vmspace->vm_map.pmap,
&byte, uaddr, 1);
return error;
@@ -122,7 +122,7 @@ copyinstr(const void *uaddr, void *kaddr
if (RUMP_LOCALPROC_P(curproc))
return copystr(uaddr, kaddr, len, done);
- if ((rv = rumpuser_sp_copyinstr(curproc->p_vmspace->vm_map.pmap,
+ if ((rv = rump_sysproxy_copyinstr(curproc->p_vmspace->vm_map.pmap,
uaddr, kaddr, &len)) != 0)
return rv;
@@ -159,7 +159,7 @@ copyoutstr(const void *kaddr, void *uadd
if (slen > len)
return ENAMETOOLONG;
- error = rumpuser_sp_copyoutstr(curproc->p_vmspace->vm_map.pmap,
+ error = rump_sysproxy_copyoutstr(curproc->p_vmspace->vm_map.pmap,
kaddr, uaddr, &slen);
if (done)
*done = slen;
@@ -194,11 +194,11 @@ uvm_io(struct vm_map *vm, struct uio *ui
continue;
if (uio->uio_rw == UIO_READ) {
- error = rumpuser_sp_copyin(vm->pmap,
+ error = rump_sysproxy_copyin(vm->pmap,
(void *)(vaddr_t)uio->uio_offset, iov->iov_base,
curlen);
} else {
- error = rumpuser_sp_copyout(vm->pmap,
+ error = rump_sysproxy_copyout(vm->pmap,
iov->iov_base, (void *)(vaddr_t)uio->uio_offset,
curlen);
}
Index: src/sys/rump/librump/rumpkern/signals.c
diff -u src/sys/rump/librump/rumpkern/signals.c:1.13 src/sys/rump/librump/rumpkern/signals.c:1.14
--- src/sys/rump/librump/rumpkern/signals.c:1.13 Thu Feb 20 00:41:05 2014
+++ src/sys/rump/librump/rumpkern/signals.c Sat Jan 3 17:23:51 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: signals.c,v 1.13 2014/02/20 00:41:05 pooka Exp $ */
+/* $NetBSD: signals.c,v 1.14 2015/01/03 17:23:51 pooka Exp $ */
/*-
* Copyright (c) 2010, 2011 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: signals.c,v 1.13 2014/02/20 00:41:05 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: signals.c,v 1.14 2015/01/03 17:23:51 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -93,7 +93,7 @@ rumpsig_raise(struct proc *p, int signo)
if (RUMP_LOCALPROC_P(p)) {
rumpuser_kill(p->p_pid, signo);
} else {
- rumpuser_sp_raise(p->p_vmspace->vm_map.pmap, signo);
+ rump_sysproxy_raise(p->p_vmspace->vm_map.pmap, signo);
}
}
Index: src/sys/rump/librump/rumpkern/vm.c
diff -u src/sys/rump/librump/rumpkern/vm.c:1.160 src/sys/rump/librump/rumpkern/vm.c:1.161
--- src/sys/rump/librump/rumpkern/vm.c:1.160 Sun Dec 14 23:48:58 2014
+++ src/sys/rump/librump/rumpkern/vm.c Sat Jan 3 17:23:51 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: vm.c,v 1.160 2014/12/14 23:48:58 chs Exp $ */
+/* $NetBSD: vm.c,v 1.161 2015/01/03 17:23:51 pooka Exp $ */
/*
* Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved.
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.160 2014/12/14 23:48:58 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.161 2015/01/03 17:23:51 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -448,7 +448,7 @@ uvm_mmap_anon(struct proc *p, void **add
if (RUMP_LOCALPROC_P(curproc)) {
error = rumpuser_anonmmap(NULL, size, 0, 0, addrp);
} else {
- error = rumpuser_sp_anonmmap(p->p_vmspace->vm_map.pmap,
+ error = rump_sysproxy_anonmmap(p->p_vmspace->vm_map.pmap,
size, addrp);
}
return error;
Added files:
Index: src/sys/rump/librump/rumpkern/sysproxy.c
diff -u /dev/null src/sys/rump/librump/rumpkern/sysproxy.c:1.1
--- /dev/null Sat Jan 3 17:23:51 2015
+++ src/sys/rump/librump/rumpkern/sysproxy.c Sat Jan 3 17:23:51 2015
@@ -0,0 +1,246 @@
+/* $NetBSD: sysproxy.c,v 1.1 2015/01/03 17:23:51 pooka Exp $ */
+
+/*
+ * Copyright (c) 2010, 2011 Antti Kantee. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: sysproxy.c,v 1.1 2015/01/03 17:23:51 pooka Exp $");
+
+#include <sys/param.h>
+#include <sys/filedesc.h>
+#include <sys/kmem.h>
+#include <sys/syscall.h>
+#include <sys/syscallvar.h>
+#include <sys/systm.h>
+#include <sys/xcall.h>
+
+#define _RUMP_SYSPROXY
+#include <rump/rumpuser.h>
+
+#include "rump_private.h"
+
+int
+rump_init_server(const char *url)
+{
+
+ return rumpuser_sp_init(url, ostype, osrelease, MACHINE);
+}
+
+pid_t
+rump_sysproxy_hyp_getpid(void)
+{
+
+ return curproc->p_pid;
+}
+
+int
+rump_sysproxy_hyp_syscall(int num, void *arg, long *retval)
+{
+ register_t regrv[2] = {0, 0};
+ struct lwp *l;
+ struct sysent *callp;
+ int rv;
+
+ if (__predict_false(num >= SYS_NSYSENT))
+ return ENOSYS;
+
+ /* XXX: always uses native syscall vector */
+ callp = rump_sysent + num;
+ l = curlwp;
+ rv = sy_invoke(callp, l, (void *)arg, regrv, num);
+ retval[0] = regrv[0];
+ retval[1] = regrv[1];
+
+ return rv;
+}
+
+int
+rump_sysproxy_hyp_rfork(void *priv, int flags, const char *comm)
+{
+ struct vmspace *newspace;
+ struct proc *p;
+ struct lwp *l;
+ int error;
+ bool initfds;
+
+ /*
+ * If we are forking off of pid 1, initialize file descriptors.
+ */
+ l = curlwp;
+ if (l->l_proc->p_pid == 1) {
+ KASSERT(flags == RUMP_RFFD_CLEAR);
+ initfds = true;
+ } else {
+ initfds = false;
+ }
+
+ if ((error = rump_lwproc_rfork(flags)) != 0)
+ return error;
+
+ /*
+ * We forked in this routine, so cannot use curlwp (const)
+ */
+ l = rump_lwproc_curlwp();
+ p = l->l_proc;
+
+ /*
+ * Since it's a proxy proc, adjust the vmspace.
+ * Refcount will eternally be 1.
+ */
+ newspace = kmem_zalloc(sizeof(*newspace), KM_SLEEP);
+ newspace->vm_refcnt = 1;
+ newspace->vm_map.pmap = priv;
+ KASSERT(p->p_vmspace == vmspace_kernel());
+ p->p_vmspace = newspace;
+ if (comm)
+ strlcpy(p->p_comm, comm, sizeof(p->p_comm));
+ if (initfds)
+ rump_consdev_init();
+
+ return 0;
+}
+
+/*
+ * Order all lwps in a process to exit. does *not* wait for them to drain.
+ */
+void
+rump_sysproxy_hyp_lwpexit(void)
+{
+ struct proc *p = curproc;
+ uint64_t where;
+ struct lwp *l;
+
+ mutex_enter(p->p_lock);
+ /*
+ * First pass: mark all lwps in the process with LW_RUMP_QEXIT
+ * so that they know they should exit.
+ */
+ LIST_FOREACH(l, &p->p_lwps, l_sibling) {
+ if (l == curlwp)
+ continue;
+ l->l_flag |= LW_RUMP_QEXIT;
+ }
+ mutex_exit(p->p_lock);
+
+ /*
+ * Next, make sure everyone on all CPUs sees our status
+ * update. This keeps threads inside cv_wait() and makes
+ * sure we don't access a stale cv pointer later when
+ * we wake up the threads.
+ */
+
+ where = xc_broadcast(0, (xcfunc_t)nullop, NULL, NULL);
+ xc_wait(where);
+
+ /*
+ * Ok, all lwps are either:
+ * 1) not in the cv code
+ * 2) sleeping on l->l_private
+ * 3) sleeping on p->p_waitcv
+ *
+ * Either way, l_private is stable until we set PS_RUMP_LWPEXIT
+ * in p->p_sflag.
+ */
+
+ mutex_enter(p->p_lock);
+ LIST_FOREACH(l, &p->p_lwps, l_sibling) {
+ if (l->l_private)
+ cv_broadcast(l->l_private);
+ }
+ p->p_sflag |= PS_RUMP_LWPEXIT;
+ cv_broadcast(&p->p_waitcv);
+ mutex_exit(p->p_lock);
+}
+
+/*
+ * Notify process that all threads have been drained and exec is complete.
+ */
+void
+rump_sysproxy_hyp_execnotify(const char *comm)
+{
+ struct proc *p = curproc;
+
+ fd_closeexec();
+ mutex_enter(p->p_lock);
+ KASSERT(p->p_nlwps == 1 && p->p_sflag & PS_RUMP_LWPEXIT);
+ p->p_sflag &= ~PS_RUMP_LWPEXIT;
+ mutex_exit(p->p_lock);
+ strlcpy(p->p_comm, comm, sizeof(p->p_comm));
+}
+
+/*
+ * rest are rump kernel -> client calls
+ */
+
+int
+rump_sysproxy_copyin(void *arg, const void *raddr, void *laddr, size_t len)
+{
+
+ return rumpuser_sp_copyin(arg, raddr, laddr, len);
+}
+
+int
+rump_sysproxy_copyinstr(void *arg, const void *raddr, void *laddr, size_t *lenp)
+{
+
+ return rumpuser_sp_copyinstr(arg, raddr, laddr, lenp);
+}
+
+int
+rump_sysproxy_copyout(void *arg,
+ const void *laddr, void *raddr, size_t len)
+{
+
+ return rumpuser_sp_copyout(arg, laddr, raddr, len);
+}
+
+int
+rump_sysproxy_copyoutstr(void *arg,
+ const void *laddr, void *raddr, size_t *lenp)
+{
+
+ return rumpuser_sp_copyoutstr(arg, laddr, raddr, lenp);
+}
+
+int
+rump_sysproxy_anonmmap(void *arg, size_t howmuch, void **addr)
+{
+
+ return rumpuser_sp_anonmmap(arg, howmuch, addr);
+}
+
+int
+rump_sysproxy_raise(void *arg, int signo)
+{
+
+ return rumpuser_sp_raise(arg, signo);
+}
+
+void
+rump_sysproxy_fini(void *arg)
+{
+
+ rumpuser_sp_fini(arg);
+}