Module Name:    src
Committed By:   pooka
Date:           Wed Jan  7 22:24:04 UTC 2015

Modified Files:
        src/sys/rump/kern: Makefile.rumpkerncomp
        src/sys/rump/librump/rumpkern: Makefile.rumpkern rump.c rump_private.h
        src/tests/dev/md: Makefile
        src/tests/fs/ffs: Makefile
        src/tests/fs/vfs: Makefile
        src/tests/rump/rumpkern/h_server: Makefile
        src/usr.bin/rump_server: Makefile
Added Files:
        src/sys/rump/kern/lib/libsysproxy: Makefile sysproxy.c
Removed Files:
        src/sys/rump/librump/rumpkern: sysproxy.c

Log Message:
Move sysproxy support into a separate component, rumpkern_sysproxy,
instead of it being always provided by the rump kernel base.  This
move accomplishes two things:

1) it is no longer necessary to provide sysproxy hypercall stubs for
   platforms which do not want to use sysproxy
2) it is easier to reason about the security aspects, since configurations
   not linking the sysproxy component simply do not support remote
   system calls

discussed on rumpkernel-users


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/rump/kern/Makefile.rumpkerncomp
cvs rdiff -u -r0 -r1.1 src/sys/rump/kern/lib/libsysproxy/Makefile \
    src/sys/rump/kern/lib/libsysproxy/sysproxy.c
cvs rdiff -u -r1.152 -r1.153 src/sys/rump/librump/rumpkern/Makefile.rumpkern
cvs rdiff -u -r1.314 -r1.315 src/sys/rump/librump/rumpkern/rump.c
cvs rdiff -u -r1.86 -r1.87 src/sys/rump/librump/rumpkern/rump_private.h
cvs rdiff -u -r1.1 -r0 src/sys/rump/librump/rumpkern/sysproxy.c
cvs rdiff -u -r1.4 -r1.5 src/tests/dev/md/Makefile
cvs rdiff -u -r1.17 -r1.18 src/tests/fs/ffs/Makefile
cvs rdiff -u -r1.19 -r1.20 src/tests/fs/vfs/Makefile
cvs rdiff -u -r1.4 -r1.5 src/tests/rump/rumpkern/h_server/Makefile
cvs rdiff -u -r1.7 -r1.8 src/usr.bin/rump_server/Makefile

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/kern/Makefile.rumpkerncomp
diff -u src/sys/rump/kern/Makefile.rumpkerncomp:1.10 src/sys/rump/kern/Makefile.rumpkerncomp:1.11
--- src/sys/rump/kern/Makefile.rumpkerncomp:1.10	Wed Apr  2 19:37:17 2014
+++ src/sys/rump/kern/Makefile.rumpkerncomp	Wed Jan  7 22:24:03 2015
@@ -1,9 +1,9 @@
-#	$NetBSD: Makefile.rumpkerncomp,v 1.10 2014/04/02 19:37:17 pooka Exp $
+#	$NetBSD: Makefile.rumpkerncomp,v 1.11 2015/01/07 22:24:03 pooka Exp $
 #
 
 .include <bsd.own.mk>
 
-RUMPKERNCOMPS=	crypto tty z
+RUMPKERNCOMPS=	crypto sysproxy tty z
 
 .if ${MKSLJIT} != "no"
 RUMPKERNCOMPS+=	sljit

Index: src/sys/rump/librump/rumpkern/Makefile.rumpkern
diff -u src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.152 src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.153
--- src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.152	Sat Jan  3 17:23:51 2015
+++ src/sys/rump/librump/rumpkern/Makefile.rumpkern	Wed Jan  7 22:24:04 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.rumpkern,v 1.152 2015/01/03 17:23:51 pooka Exp $
+#	$NetBSD: Makefile.rumpkern,v 1.153 2015/01/07 22:24:04 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 sysproxy.c
+	accessors.c
 
 SRCS+=	rumpkern_syscalls.c
 

Index: src/sys/rump/librump/rumpkern/rump.c
diff -u src/sys/rump/librump/rumpkern/rump.c:1.314 src/sys/rump/librump/rumpkern/rump.c:1.315
--- src/sys/rump/librump/rumpkern/rump.c:1.314	Sun Jan  4 22:11:40 2015
+++ src/sys/rump/librump/rumpkern/rump.c	Wed Jan  7 22:24:04 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: rump.c,v 1.314 2015/01/04 22:11:40 pooka Exp $	*/
+/*	$NetBSD: rump.c,v 1.315 2015/01/07 22:24:04 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.314 2015/01/04 22:11:40 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.315 2015/01/07 22:24:04 pooka Exp $");
 
 #include <sys/systm.h>
 #define ELFSIZE ARCH_ELFSIZE
@@ -149,6 +149,21 @@ mksysctls(void)
 	    CTL_HW, HW_PAGESIZE, CTL_EOL);
 }
 
+static pid_t rspo_wrap_getpid(void) {
+	return rump_sysproxy_hyp_getpid();
+}
+static int rspo_wrap_syscall(int num, void *arg, long *retval) {
+	return rump_sysproxy_hyp_syscall(num, arg, retval);
+}
+static int rspo_wrap_rfork(void *priv, int flag, const char *comm) {
+	return rump_sysproxy_hyp_rfork(priv, flag, comm);
+}
+static void rspo_wrap_lwpexit(void) {
+	rump_sysproxy_hyp_lwpexit();
+}
+static void rspo_wrap_execnotify(const char *comm) {
+	rump_sysproxy_hyp_execnotify(comm);
+}
 static const struct rumpuser_hyperup hyp = {
 	.hyp_schedule		= rump_schedule,
 	.hyp_unschedule		= rump_unschedule,
@@ -156,13 +171,28 @@ 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_sysproxy_hyp_rfork,
 	.hyp_lwproc_newlwp	= rump_lwproc_newlwp,
 	.hyp_lwproc_curlwp	= rump_lwproc_curlwp,
-	.hyp_lwpexit		= rump_sysproxy_hyp_lwpexit,
-	.hyp_syscall		= rump_sysproxy_hyp_syscall,
-	.hyp_execnotify		= rump_sysproxy_hyp_execnotify,
-	.hyp_getpid		= rump_sysproxy_hyp_getpid,
+
+	.hyp_getpid		= rspo_wrap_getpid,
+	.hyp_syscall		= rspo_wrap_syscall,
+	.hyp_lwproc_rfork	= rspo_wrap_rfork,
+	.hyp_lwpexit		= rspo_wrap_lwpexit,
+	.hyp_execnotify		= rspo_wrap_execnotify,
+};
+struct rump_sysproxy_ops rump_sysproxy_ops = {
+	.rspo_copyin		= (void *)enxio,
+	.rspo_copyinstr 	= (void *)enxio,
+	.rspo_copyout	 	= (void *)enxio,
+	.rspo_copyoutstr 	= (void *)enxio,
+	.rspo_anonmmap 		= (void *)enxio,
+	.rspo_raise 		= (void *)enxio,
+	.rspo_fini 		= (void *)enxio,
+	.rspo_hyp_getpid 	= (void *)enxio,
+	.rspo_hyp_syscall 	= (void *)enxio,
+	.rspo_hyp_rfork 	= (void *)enxio,
+	.rspo_hyp_lwpexit 	= (void *)enxio,
+	.rspo_hyp_execnotify 	= (void *)enxio,
 };
 
 int

Index: src/sys/rump/librump/rumpkern/rump_private.h
diff -u src/sys/rump/librump/rumpkern/rump_private.h:1.86 src/sys/rump/librump/rumpkern/rump_private.h:1.87
--- src/sys/rump/librump/rumpkern/rump_private.h:1.86	Sat Jan  3 17:23:51 2015
+++ src/sys/rump/librump/rumpkern/rump_private.h	Wed Jan  7 22:24:04 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: rump_private.h,v 1.86 2015/01/03 17:23:51 pooka Exp $	*/
+/*	$NetBSD: rump_private.h,v 1.87 2015/01/07 22:24:04 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007-2011 Antti Kantee.  All Rights Reserved.
@@ -187,18 +187,50 @@ 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 *);
+/*
+ * sysproxy is an optional component.  The interfaces with "hyp"
+ * in the name come into the rump kernel from the client or sysproxy
+ * stub, the rest go out of the rump kernel.
+ */
+struct rump_sysproxy_ops {
+	int (*rspo_copyin)(void *, const void *, void *, size_t);
+	int (*rspo_copyinstr)(void *, const void *, void *, size_t *);
+	int (*rspo_copyout)(void *, const void *, void *, size_t);
+	int (*rspo_copyoutstr)(void *, const void *, void *, size_t *);
+	int (*rspo_anonmmap)(void *, size_t, void **);
+	int (*rspo_raise)(void *, int);
+	void (*rspo_fini)(void *);
+
+	pid_t (*rspo_hyp_getpid)(void);
+	int (*rspo_hyp_syscall)(int, void *, long *);
+	int (*rspo_hyp_rfork)(void *, int, const char *);
+	void (*rspo_hyp_lwpexit)(void);
+	void (*rspo_hyp_execnotify)(const char *);
+};
+extern struct rump_sysproxy_ops rump_sysproxy_ops;
+#define rump_sysproxy_copyin(arg, raddr, laddr, len)			\
+ 	rump_sysproxy_ops.rspo_copyin(arg, raddr, laddr, len)
+#define rump_sysproxy_copyinstr(arg, raddr, laddr, lenp)		\
+ 	rump_sysproxy_ops.rspo_copyinstr(arg, raddr, laddr, lenp)
+#define rump_sysproxy_copyout(arg, laddr, raddr, len)			\
+ 	rump_sysproxy_ops.rspo_copyout(arg, laddr, raddr, len)
+#define rump_sysproxy_copyoutstr(arg, laddr, raddr, lenp)		\
+ 	rump_sysproxy_ops.rspo_copyoutstr(arg, laddr, raddr, lenp)
+#define rump_sysproxy_anonmmap(arg, howmuch, addr)			\
+	rump_sysproxy_ops.rspo_anonmmap(arg, howmuch, addr)
+#define rump_sysproxy_raise(arg, signo)					\
+	rump_sysproxy_ops.rspo_raise(arg, signo)
+#define rump_sysproxy_fini(arg)						\
+	rump_sysproxy_ops.rspo_fini(arg)
+#define rump_sysproxy_hyp_getpid()					\
+	rump_sysproxy_ops.rspo_hyp_getpid()
+#define rump_sysproxy_hyp_syscall(num, arg, retval)			\
+	rump_sysproxy_ops.rspo_hyp_syscall(num, arg, retval)
+#define rump_sysproxy_hyp_rfork(priv, flag, comm)			\
+	rump_sysproxy_ops.rspo_hyp_rfork(priv, flag, comm)
+#define rump_sysproxy_hyp_lwpexit()					\
+	rump_sysproxy_ops.rspo_hyp_lwpexit()
+#define rump_sysproxy_hyp_execnotify(comm)				\
+	rump_sysproxy_ops.rspo_hyp_execnotify(comm)
 
 #endif /* _SYS_RUMP_PRIVATE_H_ */

Index: src/tests/dev/md/Makefile
diff -u src/tests/dev/md/Makefile:1.4 src/tests/dev/md/Makefile:1.5
--- src/tests/dev/md/Makefile:1.4	Mon Jun  9 18:22:05 2014
+++ src/tests/dev/md/Makefile	Wed Jan  7 22:24:03 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.4 2014/06/09 18:22:05 he Exp $
+#	$NetBSD: Makefile,v 1.5 2015/01/07 22:24:03 pooka Exp $
 #
 
 .include <bsd.own.mk>
@@ -14,9 +14,8 @@ MKMAN=no
 PROGS=		h_mdserv
 
 LDADD+=	-lrumpdev_md -lrumpdev_disk -lrumpdev -lrumpvfs
-LDADD+=	-lrump
+LDADD+=	-lrumpkern_sysproxy -lrump
 LDADD+=	-lrumpuser
-LDADD+=	-lrump
 LDADD+=	-lpthread
 
 WARNS=	4

Index: src/tests/fs/ffs/Makefile
diff -u src/tests/fs/ffs/Makefile:1.17 src/tests/fs/ffs/Makefile:1.18
--- src/tests/fs/ffs/Makefile:1.17	Wed Jan 18 20:51:23 2012
+++ src/tests/fs/ffs/Makefile	Wed Jan  7 22:24:03 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.17 2012/01/18 20:51:23 bouyer Exp $
+#	$NetBSD: Makefile,v 1.18 2015/01/07 22:24:03 pooka Exp $
 #
 
 .include <bsd.own.mk>
@@ -34,6 +34,7 @@ LDADD+=-lrumpdev_disk -lrumpdev					# di
 LDADD+=-lrumpvfs_fifofs -lrumpnet_local -lrumpnet_net -lrumpnet	# fifos
 VFSTESTDIR != cd ${.CURDIR}/../common && ${PRINTOBJDIR}
 LDADD+=-L${VFSTESTDIR} -lvfstest
-LDADD+=-lrumpvfs -lrump -lrumpuser -lpthread			# base
+LDADD+=-lrumpvfs -lrumpkern_sysproxy -lrump -lrumpuser		# base
+LDADD+=-lpthread
 
 .include <bsd.test.mk>

Index: src/tests/fs/vfs/Makefile
diff -u src/tests/fs/vfs/Makefile:1.19 src/tests/fs/vfs/Makefile:1.20
--- src/tests/fs/vfs/Makefile:1.19	Fri Jun 28 13:04:06 2013
+++ src/tests/fs/vfs/Makefile	Wed Jan  7 22:24:03 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.19 2013/06/28 13:04:06 reinoud Exp $
+#	$NetBSD: Makefile,v 1.20 2015/01/07 22:24:03 pooka Exp $
 #
 
 .include <bsd.own.mk>
@@ -35,7 +35,8 @@ LDADD+=-L${VFSTESTDIR} -lvfstest
 
 LDADD+=-lrumpfs_nfs						# NFS
 LDADD+=-lrumpnet_shmif -lrumpnet_netinet -lrumpnet_net -lrumpnet
-LDADD+=-lrumpvfs -lrump -lrumpuser -lpthread			# base
+LDADD+=-lrumpvfs -lrumpkern_sysproxy -lrump -lrumpuser		# base
+LDADD+=-lpthread
 
 LDADD+=-lutil
 

Index: src/tests/rump/rumpkern/h_server/Makefile
diff -u src/tests/rump/rumpkern/h_server/Makefile:1.4 src/tests/rump/rumpkern/h_server/Makefile:1.5
--- src/tests/rump/rumpkern/h_server/Makefile:1.4	Tue Jun 10 04:28:40 2014
+++ src/tests/rump/rumpkern/h_server/Makefile	Wed Jan  7 22:24:03 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.4 2014/06/10 04:28:40 he Exp $
+#	$NetBSD: Makefile,v 1.5 2015/01/07 22:24:03 pooka Exp $
 #
 
 .include <bsd.own.mk>
@@ -9,7 +9,7 @@ TESTS_C=	h_simpleserver
 
 ATFFILE=	no
 
-LDADD+=	-lrump -lrumpuser -lrump -lpthread
+LDADD+=	-lrumpkern_sysproxy -lrump -lrumpuser -lrump -lpthread
 
 WARNS=	4
 NOMAN=

Index: src/usr.bin/rump_server/Makefile
diff -u src/usr.bin/rump_server/Makefile:1.7 src/usr.bin/rump_server/Makefile:1.8
--- src/usr.bin/rump_server/Makefile:1.7	Wed Nov 13 17:47:27 2013
+++ src/usr.bin/rump_server/Makefile	Wed Jan  7 22:24:03 2015
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.7 2013/11/13 17:47:27 pooka Exp $
+#	$NetBSD: Makefile,v 1.8 2015/01/07 22:24:03 pooka Exp $
 #
 
 .PATH: ${.CURDIR}/../rump_allserver
@@ -7,6 +7,7 @@ PROG=		rump_server
 SRCS=		rump_allserver.c
 NOMAN=		installed by ../rump_allserver
 
-LDADD+= -Wl,--whole-archive -lrump -lrumpuser -Wl,--no-whole-archive -lpthread
+LDADD+=		-Wl,--whole-archive -lrumpkern_sysproxy -lrump \
+		-lrumpuser -Wl,--no-whole-archive -lpthread
 
 .include <bsd.prog.mk>

Added files:

Index: src/sys/rump/kern/lib/libsysproxy/Makefile
diff -u /dev/null src/sys/rump/kern/lib/libsysproxy/Makefile:1.1
--- /dev/null	Wed Jan  7 22:24:04 2015
+++ src/sys/rump/kern/lib/libsysproxy/Makefile	Wed Jan  7 22:24:04 2015
@@ -0,0 +1,11 @@
+#	$NetBSD: Makefile,v 1.1 2015/01/07 22:24:04 pooka Exp $
+#
+
+LIB=	rumpkern_sysproxy
+
+SRCS=	sysproxy.c
+
+CPPFLAGS+= -I${RUMPTOP}/librump/rumpkern
+
+.include <bsd.lib.mk>
+.include <bsd.klinks.mk>
Index: src/sys/rump/kern/lib/libsysproxy/sysproxy.c
diff -u /dev/null src/sys/rump/kern/lib/libsysproxy/sysproxy.c:1.1
--- /dev/null	Wed Jan  7 22:24:04 2015
+++ src/sys/rump/kern/lib/libsysproxy/sysproxy.c	Wed Jan  7 22:24:04 2015
@@ -0,0 +1,212 @@
+/*	$NetBSD: sysproxy.c,v 1.1 2015/01/07 22:24:04 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/07 22:24:04 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);
+}
+
+static pid_t
+hyp_getpid(void)
+{
+
+	return curproc->p_pid;
+}
+
+static int
+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
+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
+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
+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));
+}
+
+/*
+ * Initialize interface pointers since component is present.
+ */
+RUMP_COMPONENT(RUMP_COMPONENT_KERN)
+{
+
+	rump_sysproxy_ops.rspo_copyin		= rumpuser_sp_copyin;
+	rump_sysproxy_ops.rspo_copyinstr	= rumpuser_sp_copyinstr;
+	rump_sysproxy_ops.rspo_copyout		= rumpuser_sp_copyout;
+	rump_sysproxy_ops.rspo_copyoutstr	= rumpuser_sp_copyoutstr;
+	rump_sysproxy_ops.rspo_anonmmap		= rumpuser_sp_anonmmap;
+	rump_sysproxy_ops.rspo_raise		= rumpuser_sp_raise;
+	rump_sysproxy_ops.rspo_fini		= rumpuser_sp_fini;
+
+	rump_sysproxy_ops.rspo_hyp_getpid	= hyp_getpid;
+	rump_sysproxy_ops.rspo_hyp_syscall	= hyp_syscall;
+	rump_sysproxy_ops.rspo_hyp_rfork	= hyp_rfork;
+	rump_sysproxy_ops.rspo_hyp_lwpexit	= hyp_lwpexit;
+	rump_sysproxy_ops.rspo_hyp_execnotify	= hyp_execnotify;
+}

Reply via email to