Module Name:    src
Committed By:   pooka
Date:           Wed Apr 21 11:38:05 UTC 2010

Modified Files:
        src/sys/rump/include/rump: rump.h
        src/sys/rump/librump/rumpkern: Makefile.rumpkern emul.c
Added Files:
        src/sys/rump/librump/rumpkern: signals.c

Log Message:
Move all signal-related from emul.c to signals.c.  Additionally,
define a few alternate signal models for the rump kernel, including
ones where signals are ignored or sent to host processes.


To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/sys/rump/include/rump/rump.h
cvs rdiff -u -r1.77 -r1.78 src/sys/rump/librump/rumpkern/Makefile.rumpkern
cvs rdiff -u -r1.129 -r1.130 src/sys/rump/librump/rumpkern/emul.c
cvs rdiff -u -r0 -r1.1 src/sys/rump/librump/rumpkern/signals.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/include/rump/rump.h
diff -u src/sys/rump/include/rump/rump.h:1.38 src/sys/rump/include/rump/rump.h:1.39
--- src/sys/rump/include/rump/rump.h:1.38	Wed Apr 14 14:12:48 2010
+++ src/sys/rump/include/rump/rump.h	Wed Apr 21 11:38:05 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rump.h,v 1.38 2010/04/14 14:12:48 pooka Exp $	*/
+/*	$NetBSD: rump.h,v 1.39 2010/04/21 11:38:05 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -65,6 +65,13 @@
 enum rump_uiorw { RUMPUIO_READ, RUMPUIO_WRITE };
 typedef int (*rump_sysproxy_t)(int, void *, uint8_t *, size_t, register_t *);
 
+enum rump_sigmodel {
+	RUMP_SIGMODEL_PANIC,
+	RUMP_SIGMODEL_IGNORE,
+	RUMP_SIGMODEL_HOST,
+	RUMP_SIGMODEL_RAISE,
+};
+
 /* rumpvfs */
 #define RUMPCN_FREECRED  0x02
 #define RUMPCN_FORCEFREE 0x04
@@ -85,6 +92,7 @@
 
 int	rump_boot_gethowto(void);
 void	rump_boot_sethowto(int);
+void	rump_boot_setsigmodel(enum rump_sigmodel);
 
 void	rump_schedule(void);
 void	rump_unschedule(void);

Index: src/sys/rump/librump/rumpkern/Makefile.rumpkern
diff -u src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.77 src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.78
--- src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.77	Wed Apr 14 14:49:05 2010
+++ src/sys/rump/librump/rumpkern/Makefile.rumpkern	Wed Apr 21 11:38:05 2010
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.rumpkern,v 1.77 2010/04/14 14:49:05 pooka Exp $
+#	$NetBSD: Makefile.rumpkern,v 1.78 2010/04/21 11:38:05 pooka Exp $
 #
 
 .include "${RUMPTOP}/Makefile.rump"
@@ -16,8 +16,8 @@
 # Source modules, first the ones specifically implemented for librump.
 # 
 SRCS=	rump.c rumpcopy.c emul.c intr.c locks.c ltsleep.c	\
-	memalloc.c scheduler.c sleepq.c	sysproxy_socket.c	\
-	threads.c vm.c
+	memalloc.c scheduler.c signals.c sleepq.c		\
+	sysproxy_socket.c threads.c vm.c
 
 vers.c: ${RUMPTOP}/../conf/newvers.sh ${RUMPTOP}/../conf/osrelease.sh
 	${_MKMSG_CREATE} vers.c

Index: src/sys/rump/librump/rumpkern/emul.c
diff -u src/sys/rump/librump/rumpkern/emul.c:1.129 src/sys/rump/librump/rumpkern/emul.c:1.130
--- src/sys/rump/librump/rumpkern/emul.c:1.129	Mon Apr 19 11:26:33 2010
+++ src/sys/rump/librump/rumpkern/emul.c	Wed Apr 21 11:38:05 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: emul.c,v 1.129 2010/04/19 11:26:33 pooka Exp $	*/
+/*	$NetBSD: emul.c,v 1.130 2010/04/21 11:38:05 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.129 2010/04/19 11:26:33 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.130 2010/04/21 11:38:05 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/null.h>
@@ -83,8 +83,6 @@
 const char *domainname;
 int domainnamelen;
 
-const struct filterops sig_filtops;
-
 #define DEVSW_SIZE 255
 const struct bdevsw *bdevsw0[DEVSW_SIZE]; /* XXX storage size */
 const struct bdevsw **bdevsw = bdevsw0;
@@ -143,39 +141,6 @@
 	panic("%s: not implemented", __func__);
 }
 
-void
-psignal(struct proc *p, int signo)
-{
-
-	switch (signo) {
-	case SIGSYS:
-		break;
-	default:
-		panic("unhandled signal %d", signo);
-	}
-}
-
-void
-pgsignal(struct pgrp *pgrp, int sig, int checktty)
-{
-
-	panic("%s: not implemented", __func__);
-}
-
-void
-kpsignal(struct proc *p, ksiginfo_t *ksi, void *data)
-{
-
-	panic("%s: not implemented", __func__);
-}
-
-void
-kpgsignal(struct pgrp *pgrp, ksiginfo_t *ksi, void *data, int checkctty)
-{
-
-	panic("%s: not implemented", __func__);
-}
-
 int
 pgid_in_session(struct proc *p, pid_t pg_id)
 {
@@ -184,20 +149,6 @@
 }
 
 int
-sigispending(struct lwp *l, int signo)
-{
-
-	return 0;
-}
-
-void
-sigpending1(struct lwp *l, sigset_t *ss)
-{
-
-	panic("%s: not implemented", __func__);
-}
-
-int
 kpause(const char *wmesg, bool intr, int timeo, kmutex_t *mtx)
 {
 	extern int hz;
@@ -361,28 +312,7 @@
 
 void
 calcru(struct proc *p, struct timeval *up, struct timeval *sp,
-	struct timeval *ip, struct timeval *rp)
-{
-
-	panic("%s unimplemented", __func__);
-}
-
-int
-sigismasked(struct lwp *l, int sig)
-{
-
-	return 0;
-}
-
-void
-sigclearall(struct proc *p, const sigset_t *mask, ksiginfoq_t *kq)
-{
-
-	panic("%s unimplemented", __func__);
-}
-
-void
-ksiginfo_queue_drain0(ksiginfoq_t *kq)
+        struct timeval *ip, struct timeval *rp)
 {
 
 	panic("%s unimplemented", __func__);

Added files:

Index: src/sys/rump/librump/rumpkern/signals.c
diff -u /dev/null src/sys/rump/librump/rumpkern/signals.c:1.1
--- /dev/null	Wed Apr 21 11:38:05 2010
+++ src/sys/rump/librump/rumpkern/signals.c	Wed Apr 21 11:38:05 2010
@@ -0,0 +1,182 @@
+/*	$NetBSD: signals.c,v 1.1 2010/04/21 11:38:05 pooka Exp $	*/
+
+/*
+ * Copyright (c) 2010 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: signals.c,v 1.1 2010/04/21 11:38:05 pooka Exp $");
+
+#include <sys/param.h>
+#include <sys/atomic.h>
+#include <sys/event.h>
+#include <sys/proc.h>
+#include <sys/signal.h>
+
+#include <rump/rump.h>
+#include <rump/rumpuser.h>
+
+#include "rumpkern_if_priv.h"
+
+const struct filterops sig_filtops;
+
+/* RUMP_SIGMODEL_PANIC */
+
+static void
+rumpsig_panic(pid_t target, int signo)
+{
+
+	switch (signo) {
+	case SIGSYS:
+		break;
+	default:
+		panic("unhandled signal %d", signo);
+	}
+}
+
+/* RUMP_SIGMODEL_IGNORE */
+
+static void
+rumpsig_ignore(pid_t target, int signo)
+{
+
+	return;
+}
+
+/* RUMP_SIGMODEL_HOST */
+
+static void
+rumpsig_host(pid_t target, int signo)
+{
+	int error;
+
+	rumpuser_kill(target, signo, &error);
+}
+
+/* RUMP_SIGMODEL_RAISE */
+
+static void
+rumpsig_raise(pid_t target, int signo)
+{
+	int error;
+
+	rumpuser_kill(RUMPUSER_PID_SELF, signo, &error);
+}
+
+typedef void (*rumpsig_fn)(pid_t pid, int sig);
+
+rumpsig_fn rumpsig = rumpsig_panic;
+
+/*
+ * Set signal delivery model.  It would be nice if we could
+ * take a functional argument.  But then we'd need some
+ * OS independent way to represent a signal number and also
+ * a method for easy processing (parsing is boring).
+ *
+ * Plus, upcalls from the rump kernel into process space except
+ * via rumpuser is a somewhat gray area now.
+ */
+void
+rump_boot_setsigmodel(enum rump_sigmodel model)
+{
+
+	switch (model) {
+	case RUMP_SIGMODEL_PANIC:
+		atomic_swap_ptr(&rumpsig, rumpsig_panic);
+		break;
+	case RUMP_SIGMODEL_IGNORE:
+		atomic_swap_ptr(&rumpsig, rumpsig_ignore);
+		break;
+	case RUMP_SIGMODEL_HOST:
+		atomic_swap_ptr(&rumpsig, rumpsig_host);
+		break;
+	case RUMP_SIGMODEL_RAISE:
+		atomic_swap_ptr(&rumpsig, rumpsig_raise);
+		break;
+	}
+}
+
+void
+psignal(struct proc *p, int sig)
+{
+
+	rumpsig(p->p_pid, sig);
+}
+
+void
+pgsignal(struct pgrp *pgrp, int sig, int checktty)
+{
+
+	rumpsig(-pgrp->pg_id, sig);
+}
+
+void
+kpsignal(struct proc *p, ksiginfo_t *ksi, void *data)
+{
+
+	rumpsig(p->p_pid, ksi->ksi_signo);
+}
+
+void
+kpgsignal(struct pgrp *pgrp, ksiginfo_t *ksi, void *data, int checkctty)
+{
+
+	rumpsig(-pgrp->pg_id, ksi->ksi_signo);
+}
+
+int
+sigispending(struct lwp *l, int signo)
+{
+
+	return 0;
+}
+
+void
+sigpending1(struct lwp *l, sigset_t *ss)
+{
+
+	sigemptyset(ss);
+}
+
+int
+sigismasked(struct lwp *l, int sig)
+{
+
+	return 0;
+}
+
+void
+sigclearall(struct proc *p, const sigset_t *mask, ksiginfoq_t *kq)
+{
+
+	/* nada */
+}
+
+void
+ksiginfo_queue_drain0(ksiginfoq_t *kq)
+{
+
+	if (!(CIRCLEQ_EMPTY(kq)))
+		panic("how did that get there?");
+}

Reply via email to