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);
+}

Reply via email to