Module Name:    src
Committed By:   jmcneill
Date:           Mon Dec 26 12:29:39 UTC 2011

Modified Files:
        src/sys/arch/usermode/dev: ttycons.c
        src/sys/arch/usermode/include: intr.h
        src/sys/arch/usermode/usermode: intr.c trap.c

Log Message:
add sigio_intr_establish so more than one driver can register a SIGIO handler


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/usermode/dev/ttycons.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/usermode/include/intr.h
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/usermode/usermode/intr.c
cvs rdiff -u -r1.46 -r1.47 src/sys/arch/usermode/usermode/trap.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/arch/usermode/dev/ttycons.c
diff -u src/sys/arch/usermode/dev/ttycons.c:1.15 src/sys/arch/usermode/dev/ttycons.c:1.16
--- src/sys/arch/usermode/dev/ttycons.c:1.15	Wed Dec 21 11:53:07 2011
+++ src/sys/arch/usermode/dev/ttycons.c	Mon Dec 26 12:29:38 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: ttycons.c,v 1.15 2011/12/21 11:53:07 jmcneill Exp $ */
+/* $NetBSD: ttycons.c,v 1.16 2011/12/26 12:29:38 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ttycons.c,v 1.15 2011/12/21 11:53:07 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ttycons.c,v 1.16 2011/12/26 12:29:38 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/conf.h>
@@ -99,7 +99,7 @@ const struct cdevsw ttycons_cdevsw = {
 static void	ttycons_start(struct tty *);
 static int	ttycons_param(struct tty *, struct termios *);
 
-static void	ttycons_intr(int);
+static int	ttycons_intr(void *);
 static void	ttycons_softintr(void *);
 
 static void	ttycons_ctrlc(int);
@@ -146,7 +146,7 @@ ttycons_attach(device_t parent, device_t
 	if (sc->sc_ctrlc_sih == NULL)
 		panic("couldn't establish ttycons ctrlc handler\n");
 
-	thunk_signal(SIGIO, ttycons_intr);
+	sigio_intr_establish(ttycons_intr, sc);
 	thunk_signal(SIGINT, ttycons_ctrlc);
 	if (thunk_set_stdin_sigio(true) != 0)
 		panic("couldn't enable stdin async mode");
@@ -348,18 +348,16 @@ ttycons_param(struct tty *t, struct term
 	return 0;
 }
 
-static void
-ttycons_intr(int sig)
+static int
+ttycons_intr(void *priv)
 {
-	struct ttycons_softc *sc;
+	struct ttycons_softc *sc = priv;
 
 	curcpu()->ci_idepth++;
-	sc = device_lookup_private(&ttycons_cd, minor(cn_tab->cn_dev));
-	if (sc) {
-		spl_intr(IPL_SERIAL, softint_schedule, sc->sc_rd_sih);
-	}
+	spl_intr(IPL_SERIAL, softint_schedule, sc->sc_rd_sih);
 	curcpu()->ci_idepth--;
 
+	return 0;
 }
 
 static void

Index: src/sys/arch/usermode/include/intr.h
diff -u src/sys/arch/usermode/include/intr.h:1.4 src/sys/arch/usermode/include/intr.h:1.5
--- src/sys/arch/usermode/include/intr.h:1.4	Mon Sep 12 12:24:34 2011
+++ src/sys/arch/usermode/include/intr.h	Mon Dec 26 12:29:39 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.h,v 1.4 2011/09/12 12:24:34 reinoud Exp $ */
+/* $NetBSD: intr.h,v 1.5 2011/12/26 12:29:39 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca>
@@ -31,6 +31,9 @@
 
 #include <machine/intrdefs.h>
 
+void	sigio_intr_init(void);
+void *	sigio_intr_establish(int (*)(void *), void *);
+
 void	splinit(void);
 int	splraise(int);
 void	spllower(int);

Index: src/sys/arch/usermode/usermode/intr.c
diff -u src/sys/arch/usermode/usermode/intr.c:1.9 src/sys/arch/usermode/usermode/intr.c:1.10
--- src/sys/arch/usermode/usermode/intr.c:1.9	Tue Dec 13 12:27:06 2011
+++ src/sys/arch/usermode/usermode/intr.c	Mon Dec 26 12:29:39 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.c,v 1.9 2011/12/13 12:27:06 reinoud Exp $ */
+/* $NetBSD: intr.c,v 1.10 2011/12/26 12:29:39 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,13 +27,22 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.9 2011/12/13 12:27:06 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.10 2011/12/26 12:29:39 jmcneill Exp $");
 
 #include <sys/types.h>
 
 #include <machine/intr.h>
 #include <machine/thunk.h>
 
+struct intr_handler {
+	int (*func)(void *);
+	void *arg;
+};
+
+#define SIGIO_MAX_HANDLERS	2
+
+static struct intr_handler sigio_intr_handler[SIGIO_MAX_HANDLERS];
+
 //#define INTR_USE_SIGPROCMASK
 
 #define MAX_QUEUED_EVENTS 128
@@ -134,3 +143,40 @@ spllower(int x)
 	}
 #endif
 }
+
+static void
+sigio_signal_handler(int sig)
+{
+	struct intr_handler *sih;
+	unsigned int n;
+
+	for (n = 0; n < SIGIO_MAX_HANDLERS; n++) {
+		sih = &sigio_intr_handler[n];
+		if (sih->func)
+			sih->func(sih->arg);
+	}
+}
+
+void
+sigio_intr_init(void)
+{
+	thunk_signal(SIGIO, sigio_signal_handler);
+}
+
+void *
+sigio_intr_establish(int (*func)(void *), void *arg)
+{
+	struct intr_handler *sih;
+	unsigned int n;
+
+	for (n = 0; n < SIGIO_MAX_HANDLERS; n++) {
+		sih = &sigio_intr_handler[n];
+		if (sih->func == NULL) {
+			sih->func = func;
+			sih->arg = arg;
+			return sih;
+		}
+	}
+
+	panic("increase SIGIO_MAX_HANDLERS");
+}

Index: src/sys/arch/usermode/usermode/trap.c
diff -u src/sys/arch/usermode/usermode/trap.c:1.46 src/sys/arch/usermode/usermode/trap.c:1.47
--- src/sys/arch/usermode/usermode/trap.c:1.46	Sun Dec 25 21:10:00 2011
+++ src/sys/arch/usermode/usermode/trap.c	Mon Dec 26 12:29:39 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.46 2011/12/25 21:10:00 reinoud Exp $ */
+/* $NetBSD: trap.c,v 1.47 2011/12/26 12:29:39 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2011 Reinoud Zandijk <rein...@netbsd.org>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.46 2011/12/25 21:10:00 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.47 2011/12/26 12:29:39 jmcneill Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.4
 #include <machine/pcb.h>
 #include <machine/pmap.h>
 #include <machine/machdep.h>
+#include <machine/intr.h>
 #include <machine/thunk.h>
 
 
@@ -94,6 +95,8 @@ setup_signal_handlers(void)
 //	thunk_sigaddset(&sa.sa_mask, SIGALRM);
 	if (thunk_sigaction(SIGILL, &sa, NULL) == -1)
 		panic("couldn't register SIGILL handler : %d", thunk_geterrno());
+
+	sigio_intr_init();
 }
 
 

Reply via email to