summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/hp300/hp300/autoconf.c5
-rw-r--r--sys/arch/hp300/hp300/intr.c28
-rw-r--r--sys/arch/hp300/hp300/locore.s14
-rw-r--r--sys/arch/hp300/hp300/trap.c24
-rw-r--r--sys/arch/hp300/include/intr.h21
-rw-r--r--sys/arch/m68k/conf/files.m68k3
-rw-r--r--sys/arch/m68k/include/_types.h5
-rw-r--r--sys/arch/m68k/include/intr.h112
-rw-r--r--sys/arch/m68k/include/psl.h23
-rw-r--r--sys/arch/m68k/m68k/softintr.c198
-rw-r--r--sys/arch/mac68k/dev/adb.c73
-rw-r--r--sys/arch/mac68k/dev/if_sn.c3
-rw-r--r--sys/arch/mac68k/dev/z8530sc.c75
-rw-r--r--sys/arch/mac68k/dev/z8530sc.h4
-rw-r--r--sys/arch/mac68k/dev/z8530tty.c50
-rw-r--r--sys/arch/mac68k/dev/zs.c83
-rw-r--r--sys/arch/mac68k/include/intr.h25
-rw-r--r--sys/arch/mac68k/include/z8530var.h3
-rw-r--r--sys/arch/mac68k/mac68k/autoconf.c5
-rw-r--r--sys/arch/mac68k/mac68k/intr.c27
-rw-r--r--sys/arch/mac68k/mac68k/locore.s14
-rw-r--r--sys/arch/mac68k/mac68k/trap.c37
-rw-r--r--sys/arch/mac68k/mac68k/via.c5
-rw-r--r--sys/arch/mvme68k/dev/cl.c10
-rw-r--r--sys/arch/mvme68k/dev/zs.c194
-rw-r--r--sys/arch/mvme68k/include/intr.h26
-rw-r--r--sys/arch/mvme68k/mvme68k/locore.s14
-rw-r--r--sys/arch/mvme68k/mvme68k/machdep.c27
-rw-r--r--sys/arch/mvme68k/mvme68k/trap.c49
29 files changed, 645 insertions, 512 deletions
diff --git a/sys/arch/hp300/hp300/autoconf.c b/sys/arch/hp300/hp300/autoconf.c
index 4a88e4546e2..19f9bd4680c 100644
--- a/sys/arch/hp300/hp300/autoconf.c
+++ b/sys/arch/hp300/hp300/autoconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: autoconf.c,v 1.45 2008/07/21 04:35:54 todd Exp $ */
+/* $OpenBSD: autoconf.c,v 1.46 2009/03/15 20:40:23 miod Exp $ */
/* $NetBSD: autoconf.c,v 1.45 1999/04/10 17:31:02 kleink Exp $ */
/*
@@ -226,6 +226,9 @@ mainbussearch(parent, match, aux)
void
cpu_configure()
{
+ /* this couldn't be done in intr_init() because this uses malloc() */
+ softintr_init();
+
/*
* Initialize the dev_data_lists.
*/
diff --git a/sys/arch/hp300/hp300/intr.c b/sys/arch/hp300/hp300/intr.c
index 4afe998208f..48bbc738bdc 100644
--- a/sys/arch/hp300/hp300/intr.c
+++ b/sys/arch/hp300/hp300/intr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: intr.c,v 1.22 2008/07/18 21:39:14 miod Exp $ */
+/* $OpenBSD: intr.c,v 1.23 2009/03/15 20:40:23 miod Exp $ */
/* $NetBSD: intr.c,v 1.5 1998/02/16 20:58:30 thorpej Exp $ */
/*-
@@ -41,13 +41,9 @@
#include <uvm/uvm_extern.h>
-#include <net/netisr.h>
#include "ppp.h"
#include "bridge.h"
-void netintr(void);
-
-#include <machine/atomic.h>
#include <machine/cpu.h>
#include <machine/intr.h>
@@ -277,28 +273,6 @@ intr_dispatch(evec)
printf("intr_dispatch: stray level %d interrupt\n", ipl);
}
-int netisr;
-
-void
-netintr()
-{
- int n;
-
- while ((n = netisr) != 0) {
- atomic_clearbits_int(&netisr, n);
-
-#define DONETISR(bit, fn) \
- do { \
- if (n & (1 << (bit))) \
- (fn)(); \
- } while (0)
-
-#include <net/netisr_dispatch.h>
-
-#undef DONETISR
- }
-}
-
#ifdef DIAGNOSTIC
void
splassert_check(int wantipl, const char *func)
diff --git a/sys/arch/hp300/hp300/locore.s b/sys/arch/hp300/hp300/locore.s
index 89a0d6bb291..d62a4f32b61 100644
--- a/sys/arch/hp300/hp300/locore.s
+++ b/sys/arch/hp300/hp300/locore.s
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore.s,v 1.63 2008/01/04 19:10:31 miod Exp $ */
+/* $OpenBSD: locore.s,v 1.64 2009/03/15 20:40:23 miod Exp $ */
/* $NetBSD: locore.s,v 1.91 1998/11/11 06:41:25 thorpej Exp $ */
/*
@@ -1005,10 +1005,10 @@ ENTRY_NOPROFILE(trap0)
addql #4,sp | pop syscall arg
tstl _C_LABEL(astpending)
jne Lrei2
- tstb _C_LABEL(ssir)
+ tstl _C_LABEL(softpending)
jeq Ltrap1
movw #SPL1,sr
- tstb _C_LABEL(ssir)
+ tstl _C_LABEL(softpending)
jne Lsir1
Ltrap1:
movl sp@(FR_SP),a0 | grab and restore
@@ -1264,7 +1264,7 @@ ENTRY_NOPROFILE(lev7intr) /* level 7: parity errors, reset key */
* necessitating a stack cleanup.
*/
-BSS(ssir,1)
+BSS(softpending,4)
ASENTRY_NOPROFILE(rei)
tstl _C_LABEL(astpending) | AST pending?
@@ -1302,7 +1302,7 @@ Laststkadj:
movl sp@,sp | and our SP
rte | and do real RTE
Lchksir:
- tstb _C_LABEL(ssir) | SIR pending?
+ tstl _C_LABEL(softpending) | SIR pending?
jeq Ldorte | no, all done
movl d0,sp@- | need a scratch register
movw sp@(4),d0 | get SR
@@ -1311,7 +1311,7 @@ Lchksir:
movl sp@+,d0 | restore scratch register
Lgotsir:
movw #SPL1,sr | prevent others from servicing int
- tstb _C_LABEL(ssir) | too late?
+ tstl _C_LABEL(softpending) | too late?
jeq Ldorte | yes, oh well...
clrl sp@- | stack adjust
moveml #0xFFFF,sp@- | save all registers
@@ -1808,7 +1808,7 @@ ENTRY(spl0)
moveq #0,d0
movw sr,d0 | get old SR for return
movw #PSL_LOWIPL,sr | restore new SR
- tstb _C_LABEL(ssir) | software interrupt pending?
+ tstl _C_LABEL(softpending) | software interrupt pending?
jeq Lspldone | no, all done
subql #4,sp | make room for RTE frame
movl sp@(4),sp@(2) | position return address
diff --git a/sys/arch/hp300/hp300/trap.c b/sys/arch/hp300/hp300/trap.c
index e96dda2303f..e2d7e8f6a3c 100644
--- a/sys/arch/hp300/hp300/trap.c
+++ b/sys/arch/hp300/hp300/trap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: trap.c,v 1.53 2008/06/08 20:57:16 miod Exp $ */
+/* $OpenBSD: trap.c,v 1.54 2009/03/15 20:40:23 miod Exp $ */
/* $NetBSD: trap.c,v 1.57 1998/02/16 20:58:31 thorpej Exp $ */
/*
@@ -535,17 +535,19 @@ dopanic:
case T_SSIR: /* software interrupt */
case T_SSIR|T_USER:
- if (ssir & SIR_NET) {
- void netintr(void);
- siroff(SIR_NET);
- uvmexp.softs++;
- netintr();
- }
- if (ssir & SIR_CLOCK) {
- siroff(SIR_CLOCK);
- uvmexp.softs++;
- softclock();
+ {
+ int sir, q, mask;
+
+ while ((sir = softpending) != 0) {
+ atomic_clearbits_int(&softpending, sir);
+
+ for (q = SI_NQUEUES - 1, mask = 1 << (SI_NQUEUES - 1);
+ mask != 0; q--, mask >>= 1)
+ if (mask & sir)
+ softintr_dispatch(q);
}
+ }
+
/*
* If this was not an AST trap, we are all done.
*/
diff --git a/sys/arch/hp300/include/intr.h b/sys/arch/hp300/include/intr.h
index c7216332a51..25267bd661a 100644
--- a/sys/arch/hp300/include/intr.h
+++ b/sys/arch/hp300/include/intr.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: intr.h,v 1.24 2008/07/18 21:39:16 miod Exp $ */
+/* $OpenBSD: intr.h,v 1.25 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: intr.h,v 1.2 1997/07/24 05:43:08 scottr Exp $ */
/*-
@@ -58,8 +58,7 @@ struct isr {
* - compute CPU PSL values for the spl*() calls.
*/
#define IPL_NONE 0
-#define IPL_SOFTNET 1
-#define IPL_SOFTCLOCK 1
+#define IPL_SOFTINT 1
#define IPL_BIO 2
#define IPL_NET 3
#define IPL_TTY 4
@@ -90,21 +89,7 @@ extern unsigned short hp300_varpsl[NISR];
/* watch out for side effects */
#define splx(s) ((s) & PSL_IPL ? _spl((s)) : spl0())
-/*
- * Simulated software interrupt register.
- */
-extern volatile u_int8_t ssir;
-
-#define SIR_NET 0x01
-#define SIR_CLOCK 0x02
-
-#define siron(mask) \
- __asm __volatile ( "orb %1,%0" : "=m" (ssir) : "i" (mask))
-#define siroff(mask) \
- __asm __volatile ( "andb %1,%0" : "=m" (ssir) : "ir" (~(mask)))
-
-#define setsoftnet() siron(SIR_NET)
-#define setsoftclock() siron(SIR_CLOCK)
+#include <m68k/intr.h> /* soft interrupt support */
/* locore.s */
int spl0(void);
diff --git a/sys/arch/m68k/conf/files.m68k b/sys/arch/m68k/conf/files.m68k
index d0ef0536d58..6d974de94f1 100644
--- a/sys/arch/m68k/conf/files.m68k
+++ b/sys/arch/m68k/conf/files.m68k
@@ -1,4 +1,4 @@
-# $OpenBSD: files.m68k,v 1.19 2008/04/25 14:51:35 jmc Exp $
+# $OpenBSD: files.m68k,v 1.20 2009/03/15 20:40:25 miod Exp $
# $NetBSD: files.m68k,v 1.18 1997/06/06 23:15:28 veego Exp $
#
file arch/m68k/m68k/bcopy.s
@@ -17,6 +17,7 @@ file arch/m68k/m68k/oc_cksum.s inet
file arch/m68k/m68k/process_machdep.c
file arch/m68k/m68k/regdump.c
file arch/m68k/m68k/sig_machdep.c
+file arch/m68k/m68k/softintr.c
#
# Older m68k4k executables binary compatibility
diff --git a/sys/arch/m68k/include/_types.h b/sys/arch/m68k/include/_types.h
index 485460e8657..5d701a38ee4 100644
--- a/sys/arch/m68k/include/_types.h
+++ b/sys/arch/m68k/include/_types.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: _types.h,v 1.7 2008/07/21 20:50:54 martynas Exp $ */
+/* $OpenBSD: _types.h,v 1.8 2009/03/15 20:40:25 miod Exp $ */
/*-
* Copyright (c) 1990, 1993
@@ -116,4 +116,7 @@ typedef int __rune_t;
typedef void * __wctrans_t;
typedef void * __wctype_t;
+/* Feature test macros */
+#define __HAVE_GENERIC_SOFT_INTERRUPTS
+
#endif /* _M68K__TYPES_H_ */
diff --git a/sys/arch/m68k/include/intr.h b/sys/arch/m68k/include/intr.h
new file mode 100644
index 00000000000..02846b8d158
--- /dev/null
+++ b/sys/arch/m68k/include/intr.h
@@ -0,0 +1,112 @@
+/* $OpenBSD: intr.h,v 1.1 2009/03/15 20:40:25 miod Exp $ */
+/*
+ * Copyright (c) 2001 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Jason R. Thorpe for Wasabi Systems, Inc.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed for the NetBSD Project by
+ * Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ * or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
+ * 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.
+ */
+
+#ifndef _M68K_INTR_H_
+#define _M68K_INTR_H_
+
+#ifdef _KERNEL
+#ifndef _LOCORE
+
+/* SPL asserts */
+#ifdef DIAGNOSTIC
+/*
+ * Although this function is implemented in MI code, it must be in this MD
+ * header because we don't want this header to include MI includes.
+ */
+void splassert_fail(int, int, const char *);
+extern int splassert_ctl;
+void splassert_check(int, const char *);
+#define splassert(__wantipl) do { \
+ if (splassert_ctl > 0) { \
+ splassert_check(__wantipl, __func__); \
+ } \
+} while (0)
+#define splsoftassert(wantipl) splassert(IPL_SOFTINT)
+#else
+#define splassert(wantipl) do { /* nothing */ } while (0)
+#define splsoftassert(wantipl) do { /* nothing */ } while (0)
+#endif
+
+/*
+ * Generic software interrupt support for all m68k platforms.
+ */
+
+#define IPL_SOFT 0
+#define IPL_SOFTCLOCK 1
+#define IPL_SOFTNET 2
+#define IPL_SOFTTTY 3
+
+#define SI_SOFT 0 /* for IPL_SOFT */
+#define SI_SOFTCLOCK 1 /* for IPL_SOFTCLOCK */
+#define SI_SOFTNET 2 /* for IPL_SOFTNET */
+#define SI_SOFTTTY 3 /* for IPL_SOFTTTY */
+
+#define SI_NQUEUES 4
+
+#include <machine/mutex.h>
+#include <sys/queue.h>
+
+struct soft_intrhand {
+ TAILQ_ENTRY(soft_intrhand) sih_list;
+ void (*sih_func)(void *);
+ void *sih_arg;
+ struct soft_intrq *sih_siq;
+ int sih_pending;
+};
+
+struct soft_intrq {
+ TAILQ_HEAD(, soft_intrhand) siq_list;
+ int siq_si;
+ struct mutex siq_mtx;
+};
+
+void *softintr_establish(int, void (*)(void *), void *);
+void softintr_disestablish(void *);
+void softintr_init(void);
+void softintr_dispatch(int);
+void softintr_schedule(void *);
+
+extern int softpending;
+
+/* XXX For legacy software interrupts. */
+extern struct soft_intrhand *softnet_intrhand;
+
+#define setsoftnet() softintr_schedule(softnet_intrhand)
+
+#endif /* _LOCORE */
+
+#endif /* _KERNEL */
+#endif /* _M68K_INTR_H_ */
diff --git a/sys/arch/m68k/include/psl.h b/sys/arch/m68k/include/psl.h
index f27c0ef0d8b..bf75afae893 100644
--- a/sys/arch/m68k/include/psl.h
+++ b/sys/arch/m68k/include/psl.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: psl.h,v 1.8 2009/03/15 19:40:40 miod Exp $ */
+/* $OpenBSD: psl.h,v 1.9 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: psl.h,v 1.5 1994/10/26 07:50:50 cgd Exp $ */
/*
@@ -72,27 +72,6 @@
#ifdef _KERNEL
-/* SPL asserts */
-#ifdef DIAGNOSTIC
-/*
- * Although this function is implemented in MI code, it must be in this MD
- * header because we don't want this header to include MI includes.
- */
-void splassert_fail(int, int, const char *);
-extern int splassert_ctl;
-void splassert_check(int, const char *);
-#define splassert(__wantipl) \
-do { \
- if (splassert_ctl > 0) { \
- splassert_check(__wantipl, __func__); \
- } \
-} while (0)
-#define splsoftassert(wantipl) splassert(wantipl)
-#else
-#define splassert(wantipl) do { /* nothing */ } while (0)
-#define splsoftassert(wantipl) do { /* nothing */ } while (0)
-#endif
-
/*
* Convert PSL values to CPU IPLs and vice-versa.
*/
diff --git a/sys/arch/m68k/m68k/softintr.c b/sys/arch/m68k/m68k/softintr.c
new file mode 100644
index 00000000000..35f0237335f
--- /dev/null
+++ b/sys/arch/m68k/m68k/softintr.c
@@ -0,0 +1,198 @@
+/* $OpenBSD: softintr.c,v 1.1 2009/03/15 20:40:25 miod Exp $ */
+/* $NetBSD: softintr.c,v 1.2 2003/07/15 00:24:39 lukem Exp $ */
+
+/*
+ * Copyright (c) 2001 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Jason R. Thorpe for Wasabi Systems, Inc.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed for the NetBSD Project by
+ * Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ * or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
+ * 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/param.h>
+#include <sys/malloc.h>
+
+/* XXX Network interrupts should be converted to new softintrs. */
+#include <net/netisr.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <machine/atomic.h>
+#include <machine/intr.h>
+
+struct soft_intrq soft_intrq[SI_NQUEUES];
+
+struct soft_intrhand *softnet_intrhand;
+
+void netintr(void);
+
+/*
+ * Initialize the software interrupt system.
+ */
+void
+softintr_init(void)
+{
+ struct soft_intrq *siq;
+ int i;
+
+ for (i = 0; i < SI_NQUEUES; i++) {
+ siq = &soft_intrq[i];
+ TAILQ_INIT(&siq->siq_list);
+ siq->siq_si = i;
+ mtx_init(&siq->siq_mtx, IPL_HIGH);
+ }
+
+ /* XXX Establish legacy software interrupt handlers. */
+ softnet_intrhand = softintr_establish(IPL_SOFTNET,
+ (void (*)(void *))netintr, NULL);
+}
+
+/*
+ * Process pending software interrupts on the specified queue.
+ *
+ * NOTE: We must already be at the correct interrupt priority level.
+ */
+void
+softintr_dispatch(int si)
+{
+ struct soft_intrq *siq = &soft_intrq[si];
+ struct soft_intrhand *sih;
+
+ for (;;) {
+ mtx_enter(&siq->siq_mtx);
+ sih = TAILQ_FIRST(&siq->siq_list);
+ if (sih == NULL) {
+ mtx_leave(&siq->siq_mtx);
+ break;
+ }
+
+ TAILQ_REMOVE(&siq->siq_list, sih, sih_list);
+ sih->sih_pending = 0;
+
+ uvmexp.softs++;
+
+ mtx_leave(&siq->siq_mtx);
+
+ (*sih->sih_func)(sih->sih_arg);
+ }
+}
+
+/*
+ * Register a software interrupt handler.
+ */
+void *
+softintr_establish(int ipl, void (*func)(void *), void *arg)
+{
+ struct soft_intrhand *sih;
+ int si;
+
+ switch (ipl) {
+ case IPL_SOFT:
+ si = SI_SOFT;
+ break;
+ case IPL_SOFTCLOCK:
+ si = SI_SOFTCLOCK;
+ break;
+ case IPL_SOFTNET:
+ si = SI_SOFTNET;
+ break;
+ case IPL_SOFTTTY:
+ si = SI_SOFTTTY;
+ break;
+ default:
+ printf("softintr_establish: unknown soft IPL %d\n", ipl);
+ return NULL;
+ }
+
+ sih = malloc(sizeof(*sih), M_DEVBUF, M_NOWAIT);
+ if (__predict_true(sih != NULL)) {
+ sih->sih_func = func;
+ sih->sih_arg = arg;
+ sih->sih_siq = &soft_intrq[si];
+ sih->sih_pending = 0;
+ }
+ return (sih);
+}
+
+/*
+ * Unregister a software interrupt handler.
+ */
+void
+softintr_disestablish(void *arg)
+{
+ struct soft_intrhand *sih = arg;
+ struct soft_intrq *siq = sih->sih_siq;
+
+ mtx_enter(&siq->siq_mtx);
+ if (sih->sih_pending) {
+ TAILQ_REMOVE(&siq->siq_list, sih, sih_list);
+ sih->sih_pending = 0;
+ }
+ mtx_leave(&siq->siq_mtx);
+
+ free(sih, M_DEVBUF);
+}
+
+/*
+ * Schedule a software interrupt.
+ */
+void
+softintr_schedule(void *arg)
+{
+ struct soft_intrhand *sih = (struct soft_intrhand *)arg;
+ struct soft_intrq *siq = sih->sih_siq;
+
+ mtx_enter(&siq->siq_mtx);
+ if (sih->sih_pending == 0) {
+ TAILQ_INSERT_TAIL(&siq->siq_list, sih, sih_list);
+ sih->sih_pending = 1;
+ atomic_setbits_int(&softpending, 1 << siq->siq_si);
+ }
+ mtx_leave(&siq->siq_mtx);
+}
+
+int netisr;
+
+void
+netintr(void)
+{
+ int n;
+
+ while ((n = netisr) != 0) {
+ atomic_clearbits_int(&netisr, n);
+#define DONETISR(bit, fn) \
+ do { \
+ if (n & (1 << (bit))) \
+ fn(); \
+ } while (0)
+#include <net/netisr_dispatch.h>
+#undef DONETISR
+ }
+}
diff --git a/sys/arch/mac68k/dev/adb.c b/sys/arch/mac68k/dev/adb.c
index 0792b3b3e34..35e6700950b 100644
--- a/sys/arch/mac68k/dev/adb.c
+++ b/sys/arch/mac68k/dev/adb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: adb.c,v 1.26 2007/04/10 17:47:54 miod Exp $ */
+/* $OpenBSD: adb.c,v 1.27 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: adb.c,v 1.47 2005/06/16 22:43:36 jmc Exp $ */
/* $NetBSD: adb_direct.c,v 1.51 2005/06/16 22:43:36 jmc Exp $ */
@@ -113,6 +113,11 @@ int adb_polling; /* Are we polling? (Debugger mode) */
int adb_debug; /* Output debugging messages */
#endif /* ADB_DEBUG */
+struct adb_softc {
+ struct device sc_dev;
+ void *sc_softih;
+};
+
/* some misc. leftovers */
#define vPB 0x0000
#define vPB3 0x08
@@ -298,7 +303,7 @@ int adb_intr(void *);
int adb_intr_II(void *);
int adb_intr_IIsi(void *);
int adb_intr_cuda(void *);
-void adb_soft_intr(void);
+void adb_soft_intr(void *);
int send_adb_II(u_char *, u_char *, void *, void *, int);
int send_adb_IIsi(u_char *, u_char *, void *, void *, int);
int send_adb_cuda(u_char *, u_char *, void *, void *, int);
@@ -306,14 +311,14 @@ void adb_intr_cuda_test(void);
void adb_cuda_tickle(void);
void adb_pass_up(struct adbCommand *);
void adb_op_comprout(caddr_t, caddr_t, int);
-void adb_reinit(struct device *);
+void adb_reinit(struct adb_softc *);
int count_adbs(void);
int get_ind_adb_info(ADBDataBlock *, int);
int get_adb_info(ADBDataBlock *, int);
void adb_setup_hw_type(void);
int adb_op(Ptr, Ptr, Ptr, short);
void adb_read_II(u_char *);
-void adb_hw_setup(struct device *);
+void adb_hw_setup(struct adb_softc *);
void adb_hw_setup_IIsi(u_char *);
int adb_cmd_result(u_char *);
int adb_guess_next_device(void);
@@ -394,7 +399,7 @@ adb_intr_cuda(void *arg)
struct adbCommand packet;
s = splhigh(); /* can't be too careful - might be called */
- /* from a routine, NOT an interrupt */
+ /* from a routine, NOT an interrupt */
ADB_VIA_CLR_INTR(); /* clear interrupt */
ADB_VIA_INTR_DISABLE(); /* disable ADB interrupt on IIs. */
@@ -608,7 +613,7 @@ switch_start:
splx(s); /* restore */
return (1);
-} /* end adb_intr_cuda */
+}
int
@@ -696,12 +701,12 @@ send_adb_cuda(u_char *in, u_char *buffer, void *compRout, void *data, int
if (ADB_SR_INTR_IS_ON) { /* wait for "interrupt" */
adb_intr_cuda(NULL); /* go process it */
if (adb_polling)
- adb_soft_intr();
+ adb_soft_intr(NULL);
}
}
return 0;
-} /* send_adb_cuda */
+}
int
@@ -1139,7 +1144,7 @@ send_adb_II(u_char *in, u_char *buffer, void *compRout, void *data, int command)
if (ADB_SR_INTR_IS_ON) { /* wait for "interrupt" */
adb_intr_II(NULL); /* go process it */
if (adb_polling)
- adb_soft_intr();
+ adb_soft_intr(NULL);
}
}
@@ -1418,7 +1423,7 @@ switch_start:
splx(s); /* restore */
return (1);
-} /* end adb_intr_IIsi */
+}
/*****************************************************************************
@@ -1512,12 +1517,12 @@ send_adb_IIsi(u_char *in, u_char *buffer, void *compRout, void *data, int
if (ADB_SR_INTR_IS_ON) { /* wait for "interrupt" */
adb_intr_IIsi(NULL); /* go process it */
if (adb_polling)
- adb_soft_intr();
+ adb_soft_intr(NULL);
}
}
- return 0;
-} /* send_adb_IIsi */
+ return 0;
+}
/*
* adb_pass_up is called by the interrupt-time routines.
@@ -1546,6 +1551,8 @@ send_adb_IIsi(u_char *in, u_char *buffer, void *compRout, void *data, int
void
adb_pass_up(struct adbCommand *in)
{
+ extern struct cfdriver adb_cd;
+ struct adb_softc *sc;
int start = 0, len = 0, cmd = 0;
ADBDataBlock block;
@@ -1650,10 +1657,14 @@ adb_pass_up(struct adbCommand *in)
* If the debugger is running, call upper half manually.
* Otherwise, trigger a soft interrupt to handle the rest later.
*/
- if (adb_polling)
- adb_soft_intr();
+ if (adb_cd.cd_ndevs != 0)
+ sc = (struct adb_softc *)adb_cd.cd_devs[0];
+ else
+ sc = NULL;
+ if (adb_polling || sc == NULL || sc->sc_softih == NULL)
+ adb_soft_intr(NULL);
else
- setsoftadb();
+ softintr_schedule(sc->sc_softih);
}
@@ -1663,7 +1674,7 @@ adb_pass_up(struct adbCommand *in)
*
*/
void
-adb_soft_intr(void)
+adb_soft_intr(void *arg)
{
int s;
int cmd = 0;
@@ -1803,14 +1814,14 @@ adb_op(Ptr buffer, Ptr compRout, Ptr data, short command)
* config (mainly VIA settings) for the various models.
*/
void
-adb_hw_setup(struct device *self)
+adb_hw_setup(struct adb_softc *sc)
{
volatile int i;
u_char send_string[ADB_MAX_MSG_LENGTH];
switch (adbHardware) {
case ADB_HW_II:
- via1_register_irq(2, adb_intr_II, self, self->dv_xname);
+ via1_register_irq(2, adb_intr_II, sc, sc->sc_dev.dv_xname);
via_reg(VIA1, vDirB) |= 0x30; /* register B bits 4 and 5:
* outputs */
@@ -1829,7 +1840,7 @@ adb_hw_setup(struct device *self)
break;
case ADB_HW_IISI:
- via1_register_irq(2, adb_intr_IIsi, self, self->dv_xname);
+ via1_register_irq(2, adb_intr_IIsi, sc, sc->sc_dev.dv_xname);
via_reg(VIA1, vDirB) |= 0x30; /* register B bits 4 and 5:
* outputs */
via_reg(VIA1, vDirB) &= 0xf7; /* register B bit 3: input */
@@ -1864,11 +1875,11 @@ adb_hw_setup(struct device *self)
* XXX - really PM_VIA_CLR_INTR - should we put it in
* pm_direct.h?
*/
- pm_hw_setup(self);
+ pm_hw_setup(&sc->sc_dev);
break;
case ADB_HW_CUDA:
- via1_register_irq(2, adb_intr_cuda, self, self->dv_xname);
+ via1_register_irq(2, adb_intr_cuda, sc, sc->sc_dev.dv_xname);
via_reg(VIA1, vDirB) |= 0x30; /* register B bits 4 and 5:
* outputs */
via_reg(VIA1, vDirB) &= 0xf7; /* register B bit 3: input */
@@ -1979,7 +1990,7 @@ adb_hw_setup_IIsi(u_char *buffer)
*
*/
void
-adb_reinit(struct device *self)
+adb_reinit(struct adb_softc *sc)
{
u_char send_string[ADB_MAX_MSG_LENGTH];
ADBDataBlock data; /* temp. holder for getting device info */
@@ -2012,7 +2023,7 @@ adb_reinit(struct device *self)
ADBDevTable[i].origAddr = ADBDevTable[i].currentAddr = 0;
}
- adb_hw_setup(self); /* init the VIA bits and hard reset ADB */
+ adb_hw_setup(sc); /* init the VIA bits and hard reset ADB */
delay(1000);
@@ -2494,7 +2505,6 @@ set_adb_info(ADBSetInfoBlock *info, int adbAddr)
}
return (-1); /* not found */
-
}
/* caller should really use machine-independant version: getPramTime */
@@ -2741,8 +2751,9 @@ void adb_attach_deferred(void *);
/*
* Driver definition.
*/
+
struct cfattach adb_ca = {
- sizeof(struct device), adbmatch, adbattach
+ sizeof(struct adb_softc), adbmatch, adbattach
};
int
@@ -2769,15 +2780,15 @@ adbattach(struct device *parent, struct device *self, void *aux)
void
adb_attach_deferred(void *v)
{
- struct device *self = v;
+ struct adb_softc *sc = v;
ADBDataBlock adbdata;
struct adb_attach_args aa_args;
int totaladbs;
int adbindex, adbaddr;
- printf("%s: ", self->dv_xname);
+ printf("%s: ", sc->sc_dev.dv_xname);
adb_polling = 1;
- adb_reinit(self);
+ adb_reinit(sc);
#ifdef ADB_DEBUG
if (adb_debug)
@@ -2797,7 +2808,9 @@ adb_attach_deferred(void *v)
aa_args.adbaddr = adbaddr;
aa_args.handler_id = (int)(adbdata.devType);
- (void)config_found(self, &aa_args, adbprint);
+ (void)config_found(&sc->sc_dev, &aa_args, adbprint);
}
+
+ sc->sc_softih = softintr_establish(IPL_SOFTTTY, adb_soft_intr, NULL);
adb_polling = 0;
}
diff --git a/sys/arch/mac68k/dev/if_sn.c b/sys/arch/mac68k/dev/if_sn.c
index 537eca51026..3a9bca02128 100644
--- a/sys/arch/mac68k/dev/if_sn.c
+++ b/sys/arch/mac68k/dev/if_sn.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_sn.c,v 1.50 2008/11/28 02:44:17 brad Exp $ */
+/* $OpenBSD: if_sn.c,v 1.51 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: if_sn.c,v 1.13 1997/04/25 03:40:10 briggs Exp $ */
/*
@@ -29,7 +29,6 @@
#include <net/if.h>
#include <net/if_dl.h>
-#include <net/netisr.h>
#ifdef INET
#include <netinet/in.h>
diff --git a/sys/arch/mac68k/dev/z8530sc.c b/sys/arch/mac68k/dev/z8530sc.c
index 6ec3fef5ac6..28976cb10dc 100644
--- a/sys/arch/mac68k/dev/z8530sc.c
+++ b/sys/arch/mac68k/dev/z8530sc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: z8530sc.c,v 1.7 2004/11/25 18:32:10 miod Exp $ */
+/* $OpenBSD: z8530sc.c,v 1.8 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: z8530sc.c,v 1.5 1996/12/17 20:42:40 gwr Exp $ */
/*
@@ -229,69 +229,60 @@ zsc_intr_hard(arg)
void *arg;
{
register struct zsc_softc *zsc = arg;
- register struct zs_chanstate *cs_a;
- register struct zs_chanstate *cs_b;
- register int rval;
- register u_char rr3, rr3a;
-
- cs_a = zsc->zsc_cs[0];
- cs_b = zsc->zsc_cs[1];
- rval = 0;
- rr3a = 0;
+ register struct zs_chanstate *cs;
+ register u_char rr3;
+ /* First look at channel A. */
+ cs = zsc->zsc_cs[0];
/* Note: only channel A has an RR3 */
- while ((rr3 = zs_read_reg(cs_a, 3)) != 0) {
+ rr3 = zs_read_reg(cs, 3);
- /* Handle receive interrupts first. */
+ /*
+ * Clear interrupt first to avoid a race condition.
+ * If a new interrupt condition happens while we are
+ * servicing this one, we will get another interrupt
+ * shortly. We can NOT just sit here in a loop, or
+ * we will cause horrible latency for other devices
+ * on this interrupt level (i.e. sun3x floppy disk).
+ */
+ if (rr3 & (ZSRR3_IP_A_RX | ZSRR3_IP_A_TX | ZSRR3_IP_A_STAT)) {
+ zs_write_csr(cs, ZSWR0_CLR_INTR);
if (rr3 & ZSRR3_IP_A_RX)
- (*cs_a->cs_ops->zsop_rxint)(cs_a);
- if (rr3 & ZSRR3_IP_B_RX)
- (*cs_b->cs_ops->zsop_stint)(cs_b);
-
- /* Handle status interrupts (i.e. flow control). */
+ (*cs->cs_ops->zsop_rxint)(cs);
if (rr3 & ZSRR3_IP_A_STAT)
- (*cs_a->cs_ops->zsop_stint)(cs_a);
- if (rr3 & ZSRR3_IP_B_STAT)
- (*cs_b->cs_ops->zsop_stint)(cs_b);
-
- /* Handle transmit done interrupts. */
+ (*cs->cs_ops->zsop_stint)(cs);
if (rr3 & ZSRR3_IP_A_TX)
- (*cs_a->cs_ops->zsop_txint)(cs_a);
- if (rr3 & ZSRR3_IP_B_TX)
- (*cs_b->cs_ops->zsop_txint)(cs_b);
-
- /* Accumulate so we know what needs to be cleared. */
- rr3a |= rr3;
+ (*cs->cs_ops->zsop_txint)(cs);
}
-
- /* Clear interrupt. */
- if (rr3a & (ZSRR3_IP_A_RX | ZSRR3_IP_A_TX | ZSRR3_IP_A_STAT)) {
- zs_write_csr(cs_a, ZSWR0_CLR_INTR);
- rval |= 1;
- }
- if (rr3a & (ZSRR3_IP_B_RX | ZSRR3_IP_B_TX | ZSRR3_IP_B_STAT)) {
- zs_write_csr(cs_b, ZSWR0_CLR_INTR);
- rval |= 2;
+ /* Now look at channel B. */
+ cs = zsc->zsc_cs[1];
+ if (rr3 & (ZSRR3_IP_B_RX | ZSRR3_IP_B_TX | ZSRR3_IP_B_STAT)) {
+ zs_write_csr(cs, ZSWR0_CLR_INTR);
+ if (rr3 & ZSRR3_IP_B_RX)
+ (*cs->cs_ops->zsop_stint)(cs);
+ if (rr3 & ZSRR3_IP_B_STAT)
+ (*cs->cs_ops->zsop_stint)(cs);
+ if (rr3 & ZSRR3_IP_B_TX)
+ (*cs->cs_ops->zsop_txint)(cs);
}
/* Note: caller will check cs_x->cs_softreq and DTRT. */
- return (rval);
+ return (rr3);
}
/*
* ZS software interrupt. Scan all channels for deferred interrupts.
*/
-int
+void
zsc_intr_soft(arg)
void *arg;
{
register struct zsc_softc *zsc = arg;
register struct zs_chanstate *cs;
- register int rval, chan;
+ register int chan;
- rval = 0;
for (chan = 0; chan < 2; chan++) {
cs = zsc->zsc_cs[chan];
@@ -303,10 +294,8 @@ zsc_intr_soft(arg)
if (cs->cs_softreq) {
cs->cs_softreq = 0;
(*cs->cs_ops->zsop_softint)(cs);
- rval++;
}
}
- return (rval);
}
/*
diff --git a/sys/arch/mac68k/dev/z8530sc.h b/sys/arch/mac68k/dev/z8530sc.h
index 6604c744bff..80a41ed7539 100644
--- a/sys/arch/mac68k/dev/z8530sc.h
+++ b/sys/arch/mac68k/dev/z8530sc.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: z8530sc.h,v 1.6 2004/11/25 18:32:10 miod Exp $ */
+/* $OpenBSD: z8530sc.h,v 1.7 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: z8530sc.h,v 1.5 1996/12/17 20:42:42 gwr Exp $ */
/*
@@ -117,7 +117,7 @@ struct zsc_attach_args {
#define ZS_HWFLAG_RAW 8 /* advise raw mode */
int zsc_intr_hard(void *);
-int zsc_intr_soft(void *);
+void zsc_intr_soft(void *);
void zs_abort(struct zs_chanstate *);
void zs_break(struct zs_chanstate *, int);
diff --git a/sys/arch/mac68k/dev/z8530tty.c b/sys/arch/mac68k/dev/z8530tty.c
index c1fc0235e88..246485e76c1 100644
--- a/sys/arch/mac68k/dev/z8530tty.c
+++ b/sys/arch/mac68k/dev/z8530tty.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: z8530tty.c,v 1.17 2006/04/14 09:36:49 martin Exp $ */
+/* $OpenBSD: z8530tty.c,v 1.18 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: z8530tty.c,v 1.14 1996/12/17 20:42:43 gwr Exp $ */
/*
@@ -163,20 +163,20 @@ struct zsops zsops_tty;
/* Routines called from other code. */
cdev_decl(zs); /* open, close, read, write, ioctl, stop, ... */
-static void zsstart(struct tty *);
-static int zsparam(struct tty *, struct termios *);
-static void zs_modem(struct zstty_softc *zst, int onoff);
-static int zshwiflow(struct tty *, int);
-static void zs_hwiflow(struct zstty_softc *, int);
-static void zstty_rxint(register struct zs_chanstate *);
-static void zstty_txint(register struct zs_chanstate *);
-static void zstty_stint(register struct zs_chanstate *);
-static void zstty_softint(struct zs_chanstate *);
-static void zsoverrun(struct zstty_softc *, long *, char *);
+void zsstart(struct tty *);
+int zsparam(struct tty *, struct termios *);
+void zs_modem(struct zstty_softc *zst, int onoff);
+int zshwiflow(struct tty *, int);
+void zs_hwiflow(struct zstty_softc *, int);
+void zstty_rxint(register struct zs_chanstate *);
+void zstty_txint(register struct zs_chanstate *);
+void zstty_stint(register struct zs_chanstate *);
+void zstty_softint(struct zs_chanstate *);
+void zsoverrun(struct zstty_softc *, long *, char *);
/*
* zstty_match: how is this zs channel configured?
*/
-int
+static int
zstty_match(parent, match, aux)
struct device *parent;
void *match, *aux;
@@ -195,7 +195,7 @@ zstty_match(parent, match, aux)
return 0;
}
-void
+static void
zstty_attach(parent, self, aux)
struct device *parent, *self;
void *aux;
@@ -609,7 +609,7 @@ zsioctl(dev, cmd, data, flag, p)
/*
* Start or restart transmission.
*/
-static void
+void
zsstart(tp)
register struct tty *tp;
{
@@ -711,7 +711,7 @@ zsstop(tp, flag)
* XXX - Should just copy the whole termios after
* making sure all the changes could be done.
*/
-static int
+int
zsparam(tp, t)
register struct tty *tp;
register struct termios *t;
@@ -857,7 +857,7 @@ zsparam(tp, t)
* Raise or lower modem control (DTR/RTS) signals. If a character is
* in transmission, the change is deferred.
*/
-static void
+void
zs_modem(zst, onoff)
struct zstty_softc *zst;
int onoff;
@@ -941,7 +941,7 @@ zshwiflow(tp, stop)
* Internal version of zshwiflow
* called at splzs
*/
-static void
+void
zs_hwiflow(zst, stop)
register struct zstty_softc *zst;
int stop;
@@ -983,15 +983,15 @@ zs_hwiflow(zst, stop)
* Interface to the lower layer (zscc)
****************************************************************/
-static void zstty_rxint (struct zs_chanstate *);
-static void zstty_txint (struct zs_chanstate *);
-static void zstty_stint (struct zs_chanstate *);
+void zstty_rxint(struct zs_chanstate *);
+void zstty_txint(struct zs_chanstate *);
+void zstty_stint(struct zs_chanstate *);
/*
* receiver ready interrupt.
* called at splzs
*/
-static void
+void
zstty_rxint(cs)
register struct zs_chanstate *cs;
{
@@ -1058,7 +1058,7 @@ nextchar:
/*
* transmitter ready interrupt. (splzs)
*/
-static void
+void
zstty_txint(cs)
register struct zs_chanstate *cs;
{
@@ -1110,7 +1110,7 @@ zstty_txint(cs)
/*
* status change interrupt. (splzs)
*/
-static void
+void
zstty_stint(cs)
register struct zs_chanstate *cs;
{
@@ -1167,7 +1167,7 @@ zstty_stint(cs)
/*
* Print out a ring or fifo overrun error message.
*/
-static void
+void
zsoverrun(zst, ptime, what)
struct zstty_softc *zst;
long *ptime;
@@ -1193,7 +1193,7 @@ zsoverrun(zst, ptime, what)
* Note: an "input blockage" condition is assumed to exist if
* EITHER the TS_TBLOCK flag or zst_rx_blocked flag is set.
*/
-static void
+void
zstty_softint(cs)
struct zs_chanstate *cs;
{
diff --git a/sys/arch/mac68k/dev/zs.c b/sys/arch/mac68k/dev/zs.c
index b1af641730f..794471d5002 100644
--- a/sys/arch/mac68k/dev/zs.c
+++ b/sys/arch/mac68k/dev/zs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: zs.c,v 1.26 2008/01/23 16:37:56 jsing Exp $ */
+/* $OpenBSD: zs.c,v 1.27 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: zs.c,v 1.19 1998/01/12 19:22:18 thorpej Exp $ */
/*
@@ -135,8 +135,6 @@ static int zs_defspeed[NZSC][2] = {
};
void *zs_conschan = 0;
int zs_consunit;
-/* device to which the console is attached--if serial. */
-dev_t mac68k_zsdev;
/* Mac stuff */
volatile unsigned char *sccA = 0;
int nzsc_attached = 0; /* needed as long as we have spurious
@@ -231,7 +229,7 @@ struct cfdriver zsc_cd = {
};
int zshard(void *);
-int zssoft(void *);
+void zssoft(void *);
/*
@@ -415,6 +413,8 @@ zsc_attach(parent, self, aux)
}
}
+ /* XXX - Now safe to install interrupt handlers. */
+
if (current_mac_model->class == MACH_CLASSAV) {
add_psc_lev4_intr(PSCINTR_SCCA, zshard, zsc);
add_psc_lev4_intr(PSCINTR_SCCB, zshard, zsc);
@@ -422,7 +422,7 @@ zsc_attach(parent, self, aux)
intr_establish(zshard, zsc, ZSHARD_PRI, self->dv_xname);
}
- /* XXX - Now safe to install interrupt handlers. */
+ zsc->zsc_softih = softintr_establish(IPL_SOFTTTY, zssoft, zsc);
/*
* Set the master interrupt enable and interrupt vector.
@@ -482,8 +482,6 @@ zsmd_setclock(cs)
via_set_modem((xcs->cs_pclk_flag & ZSC_EXTERN) ? 1 : 0);
}
-static int zssoftpending;
-
/*
* Do the minimum work to pull data off of the chip and queue it up
* for later processing.
@@ -493,54 +491,49 @@ zshard(arg)
void *arg;
{
struct zsc_softc *zsc = (struct zsc_softc *)arg;
- int rval;
+ int rr3, rval;
+
+ /*
+ * The horror: the adb subsystem will invoke us directly.
+ * However if we were already servicing an interrupt,
+ * we'll lose bigtime. Don't allow such reentrancy.
+ */
+ static int zshard_busy = 0;
+
+ if (zshard_busy != 0)
+ return 0;
if (zsc == NULL)
return 0;
+ zshard_busy++;
+
rval = 0;
- rval |= zsc_intr_hard(zsc);
+ while ((rr3 = zsc_intr_hard(zsc)))
+ rval |= rr3;
+
if ((zsc->zsc_cs[0]->cs_softreq) || (zsc->zsc_cs[1]->cs_softreq)) {
/* zsc_req_softint(zsc); */
- /* We are at splzs here, so no need to lock. */
- if (zssoftpending == 0) {
- zssoftpending = 1;
- setsoftserial();
- }
+ softintr_schedule(zsc->zsc_softih);
}
+
+ zshard_busy--;
+
return (rval);
}
-/*
- * Similar scheme as for zshard (look at all of them)
- */
-int
+void
zssoft(arg)
void *arg;
{
- register struct zsc_softc *zsc;
- register int unit;
-
- /* This is not the only ISR on this IPL. */
- if (zssoftpending == 0)
- return (0);
-
- /*
- * The soft intr. bit will be set by zshard only if
- * the variable zssoftpending is zero.
- */
- zssoftpending = 0;
+ struct zsc_softc *zsc = (struct zsc_softc *)arg;
+ int s;
- for (unit = 0; unit < zsc_cd.cd_ndevs; ++unit) {
- zsc = zsc_cd.cd_devs[unit];
- if (zsc == NULL)
- continue;
- (void) zsc_intr_soft(zsc);
- }
- return (1);
+ s = spltty();
+ zsc_intr_soft(zsc);
+ splx(s);
}
-
#ifndef ZS_TOLERANCE
#define ZS_TOLERANCE 51
/* 5% in tenths of a %, plus 1 so that exactly 5% will be ok. */
@@ -837,7 +830,8 @@ zs_write_reg(cs, reg, val)
ZS_DELAY();
}
-u_char zs_read_csr(cs)
+u_char
+zs_read_csr(cs)
struct zs_chanstate *cs;
{
u_char val;
@@ -849,7 +843,8 @@ u_char zs_read_csr(cs)
return val;
}
-void zs_write_csr(cs, val)
+void
+zs_write_csr(cs, val)
struct zs_chanstate *cs;
register u_char val;
{
@@ -858,7 +853,8 @@ void zs_write_csr(cs, val)
ZS_DELAY();
}
-u_char zs_read_data(cs)
+u_char
+zs_read_data(cs)
struct zs_chanstate *cs;
{
register u_char val;
@@ -868,7 +864,8 @@ u_char zs_read_data(cs)
return val;
}
-void zs_write_data(cs, val)
+void
+zs_write_data(cs, val)
struct zs_chanstate *cs;
u_char val;
{
@@ -973,7 +970,7 @@ zscnprobe(struct consdev * cp)
zs_consunit = unit;
zs_conschan = (struct zschan *) -1; /* dummy flag for zs_init() */
- mac68k_zsdev = cp->cn_dev = makedev(maj, unit);
+ cp->cn_dev = makedev(maj, unit);
}
if (mac68k_machine.serial_boot_echo) {
/*
diff --git a/sys/arch/mac68k/include/intr.h b/sys/arch/mac68k/include/intr.h
index b29ee66d211..42d1140ef30 100644
--- a/sys/arch/mac68k/include/intr.h
+++ b/sys/arch/mac68k/include/intr.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: intr.h,v 1.18 2007/11/30 08:19:43 miod Exp $ */
+/* $OpenBSD: intr.h,v 1.19 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: intr.h,v 1.9 1998/08/12 06:58:42 scottr Exp $ */
/*
@@ -55,8 +55,7 @@ extern u_short mac68k_statclockipl;
* - compute CPU PSL values for the spl*() calls.
*/
#define IPL_NONE 0
-#define IPL_SOFTNET 1
-#define IPL_SOFTCLOCK 1
+#define IPL_SOFTINT 1
#define IPL_BIO 2
#define IPL_AUDIO PSLTOIPL(mac68k_audioipl)
#define IPL_NET PSLTOIPL(mac68k_netipl)
@@ -96,25 +95,7 @@ extern u_short mac68k_statclockipl;
/* watch out for side effects */
#define splx(s) ((s) & PSL_IPL ? _spl(s) : spl0())
-/*
- * simulated software interrupt register
- */
-extern volatile u_int8_t ssir;
-
-#define SIR_NET 0x01
-#define SIR_CLOCK 0x02
-#define SIR_SERIAL 0x04
-#define SIR_ADB 0x08
-
-#define siron(mask) \
- __asm __volatile ( "orb %1,%0" : "=m" (ssir) : "i" (mask))
-#define siroff(mask) \
- __asm __volatile ( "andb %1,%0" : "=m" (ssir) : "ir" (~(mask)))
-
-#define setsoftnet() siron(SIR_NET)
-#define setsoftclock() siron(SIR_CLOCK)
-#define setsoftserial() siron(SIR_SERIAL)
-#define setsoftadb() siron(SIR_ADB)
+#include <m68k/intr.h> /* soft interrupt support */
/* intr.c */
void intr_init(void);
diff --git a/sys/arch/mac68k/include/z8530var.h b/sys/arch/mac68k/include/z8530var.h
index 5bf9a0bb3a4..f031d38cda9 100644
--- a/sys/arch/mac68k/include/z8530var.h
+++ b/sys/arch/mac68k/include/z8530var.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: z8530var.h,v 1.7 2004/11/25 18:32:10 miod Exp $ */
+/* $OpenBSD: z8530var.h,v 1.8 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: z8530var.h,v 1.2 1996/06/07 10:27:19 briggs Exp $ */
/*
@@ -97,6 +97,7 @@ struct zsc_softc {
struct zs_chanstate *zsc_cs[2]; /* channel A and B soft state */
/* Machine-dependent part follows... */
struct xzs_chanstate xzsc_xcs_store[2];
+ void *zsc_softih;
};
/*
diff --git a/sys/arch/mac68k/mac68k/autoconf.c b/sys/arch/mac68k/mac68k/autoconf.c
index ae2c49e962c..4e4d1235155 100644
--- a/sys/arch/mac68k/mac68k/autoconf.c
+++ b/sys/arch/mac68k/mac68k/autoconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: autoconf.c,v 1.31 2008/07/21 04:35:54 todd Exp $ */
+/* $OpenBSD: autoconf.c,v 1.32 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: autoconf.c,v 1.38 1996/12/18 05:46:09 scottr Exp $ */
/*
@@ -110,6 +110,9 @@ findbootdev()
void
cpu_configure()
{
+ /* this couldn't be done in intr_init() because this uses malloc() */
+ softintr_init();
+
startrtclock();
if (config_rootfound("mainbus", "mainbus") == NULL)
diff --git a/sys/arch/mac68k/mac68k/intr.c b/sys/arch/mac68k/mac68k/intr.c
index 45b725cfe99..9e2c2bbea58 100644
--- a/sys/arch/mac68k/mac68k/intr.c
+++ b/sys/arch/mac68k/mac68k/intr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: intr.c,v 1.12 2008/06/26 05:42:12 ray Exp $ */
+/* $OpenBSD: intr.c,v 1.13 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: intr.c,v 1.2 1998/08/25 04:03:56 scottr Exp $ */
/*-
@@ -42,9 +42,6 @@
#include <uvm/uvm_extern.h>
-#include <net/netisr.h>
-
-#include <machine/atomic.h>
#include <machine/cpu.h>
#include <machine/intr.h>
@@ -204,28 +201,6 @@ intr_dispatch(int evec) /* format | vector offset */
}
}
-int netisr;
-
-void
-netintr()
-{
- int isr;
-
- while ((isr = netisr) != 0) {
- atomic_clearbits_int(&netisr, isr);
-
-#define DONETISR(bit, fn) \
- do { \
- if (isr & (1 << bit)) \
- (fn)(); \
- } while (0)
-
-#include <net/netisr_dispatch.h>
-
-#undef DONETISR
- }
-}
-
#ifdef DIAGNOSTIC
void
splassert_check(int wantipl, const char *func)
diff --git a/sys/arch/mac68k/mac68k/locore.s b/sys/arch/mac68k/mac68k/locore.s
index 5fe0927635b..9feb14dd59c 100644
--- a/sys/arch/mac68k/mac68k/locore.s
+++ b/sys/arch/mac68k/mac68k/locore.s
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore.s,v 1.61 2007/12/30 14:45:25 miod Exp $ */
+/* $OpenBSD: locore.s,v 1.62 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: locore.s,v 1.103 1998/07/09 06:02:50 scottr Exp $ */
/*
@@ -629,10 +629,10 @@ ENTRY_NOPROFILE(trap0)
addql #4,sp | pop syscall arg
tstl _C_LABEL(astpending)
jne Lrei2
- tstb _C_LABEL(ssir)
+ tstl _C_LABEL(softpending)
jeq Ltrap1
movw #SPL1,sr
- tstb _C_LABEL(ssir)
+ tstl _C_LABEL(softpending)
jne Lsir1
Ltrap1:
movl sp@(FR_SP),a0 | grab and restore
@@ -871,7 +871,7 @@ ENTRY_NOPROFILE(rtclock_intr)
* necessitating a stack cleanup.
*/
-BSS(ssir,1)
+BSS(softpending,4)
ASENTRY_NOPROFILE(rei)
tstl _C_LABEL(astpending) | AST pending?
@@ -909,7 +909,7 @@ Laststkadj:
movl sp@,sp | and our SP
rte | and do real RTE
Lchksir:
- tstb _C_LABEL(ssir) | SIR pending?
+ tstl _C_LABEL(softpending) | SIR pending?
jeq Ldorte | no, all done
movl d0,sp@- | need a scratch register
movw sp@(4),d0 | get SR
@@ -918,7 +918,7 @@ Lchksir:
movl sp@+,d0 | restore scratch register
Lgotsir:
movw #SPL1,sr | prevent others from servicing int
- tstb _C_LABEL(ssir) | too late?
+ tstl _C_LABEL(softpending) | too late?
jeq Ldorte | yes, oh well...
clrl sp@- | stack adjust
moveml #0xFFFF,sp@- | save all registers
@@ -1318,7 +1318,7 @@ ENTRY(spl0)
moveq #0,d0
movw sr,d0 | get old SR for return
movw #PSL_LOWIPL,sr | restore new SR
- tstb _C_LABEL(ssir) | software interrupt pending?
+ tstl _C_LABEL(softpending) | software interrupt pending?
jeq Lspldone | no, all done
subql #4,sp | make room for RTE frame
movl sp@(4),sp@(2) | position return address
diff --git a/sys/arch/mac68k/mac68k/trap.c b/sys/arch/mac68k/mac68k/trap.c
index 38d8e9d41ff..ddcb73577df 100644
--- a/sys/arch/mac68k/mac68k/trap.c
+++ b/sys/arch/mac68k/mac68k/trap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: trap.c,v 1.55 2008/06/08 20:57:19 miod Exp $ */
+/* $OpenBSD: trap.c,v 1.56 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: trap.c,v 1.68 1998/12/22 08:47:07 scottr Exp $ */
/*
@@ -476,30 +476,19 @@ copyfault:
case T_SSIR: /* Software interrupt */
case T_SSIR|T_USER:
- if (ssir & SIR_SERIAL) {
- void zssoft(int);
- siroff(SIR_SERIAL);
- uvmexp.softs++;
- zssoft(0);
- }
- if (ssir & SIR_NET) {
- void netintr(void);
- siroff(SIR_NET);
- uvmexp.softs++;
- netintr();
- }
- if (ssir & SIR_CLOCK) {
- void softclock(void);
- siroff(SIR_CLOCK);
- uvmexp.softs++;
- softclock();
- }
- if (ssir & SIR_ADB) {
- void adb_soft_intr(void);
- siroff(SIR_ADB);
- uvmexp.softs++;
- adb_soft_intr();
+ {
+ int sir, q, mask;
+
+ while ((sir = softpending) != 0) {
+ atomic_clearbits_int(&softpending, sir);
+
+ for (q = SI_NQUEUES - 1, mask = 1 << (SI_NQUEUES - 1);
+ mask != 0; q--, mask >>= 1)
+ if (mask & sir)
+ softintr_dispatch(q);
}
+ }
+
/*
* If this was not an AST trap, we are all done.
*/
diff --git a/sys/arch/mac68k/mac68k/via.c b/sys/arch/mac68k/mac68k/via.c
index 9042dc80b93..d6c0b3e5d6f 100644
--- a/sys/arch/mac68k/mac68k/via.c
+++ b/sys/arch/mac68k/mac68k/via.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: via.c,v 1.31 2007/09/10 20:29:50 miod Exp $ */
+/* $OpenBSD: via.c,v 1.32 2009/03/15 20:40:25 miod Exp $ */
/* $NetBSD: via.c,v 1.62 1997/09/10 04:38:48 scottr Exp $ */
/*-
@@ -198,8 +198,7 @@ via1_intr(void *arg)
return (0);
/*
- * Unflag interrupts here. If we do it after each interrupt,
- * the MRG ADB hangs up.
+ * Unflag interrupts here.
*/
via_reg(VIA1, vIFR) = intbits;
diff --git a/sys/arch/mvme68k/dev/cl.c b/sys/arch/mvme68k/dev/cl.c
index dc47ddf252e..57b2baeeb36 100644
--- a/sys/arch/mvme68k/dev/cl.c
+++ b/sys/arch/mvme68k/dev/cl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cl.c,v 1.45 2009/03/01 21:37:41 miod Exp $ */
+/* $OpenBSD: cl.c,v 1.46 2009/03/15 20:40:25 miod Exp $ */
/*
* Copyright (c) 1995 Dale Rahn. All rights reserved.
@@ -128,7 +128,7 @@ struct clsoftc {
char sc_rxintrname[16 + 3];
char sc_txintrname[16 + 3];
int sc_flags;
- u_int8_t ssir;
+ void *sc_softih;
};
const struct {
@@ -315,7 +315,7 @@ clattach(parent, self, aux)
sc->sc_cl[i].psupply = sc->sc_cl[i].buffer;
sc->sc_cl[i].nchar = 0;
}
- sc->ssir = allocate_sir(cl_softint, (void *)sc);
+ sc->sc_softih = softintr_establish(IPL_SOFTTTY, cl_softint, sc);
#endif
for (i = 0; i < CLCD_PORTS_PER_CHIP; i++) {
#if 0
@@ -1973,7 +1973,7 @@ cl_appendbuf(sc, channel, c)
sc->sc_cl[channel].psupply = sc->sc_cl[channel].buffer;
}
sc->sc_cl[channel].nchar ++;
- setsoftint(sc->ssir);
+ softintr_schedule(sc->sc_softih);
/* splx (s); */
}
@@ -2004,7 +2004,7 @@ cl_appendbufn(sc, channel, buf, cnt)
}
sc->sc_cl[channel].nchar ++;
}
- setsoftint(sc->ssir);
+ softintr_schedule(sc->sc_softih);
/* splx (s); */
}
diff --git a/sys/arch/mvme68k/dev/zs.c b/sys/arch/mvme68k/dev/zs.c
index c033c859a90..ac3e2a4fae8 100644
--- a/sys/arch/mvme68k/dev/zs.c
+++ b/sys/arch/mvme68k/dev/zs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: zs.c,v 1.26 2008/01/23 16:37:57 jsing Exp $ */
+/* $OpenBSD: zs.c,v 1.27 2009/03/15 20:40:25 miod Exp $ */
/*
* Copyright (c) 2000 Steve Murphree, Jr.
@@ -109,10 +109,11 @@ struct zs {
#define ZH_RXOVF 8 /* receiver buffer overflow */
struct zssoftc {
- struct device sc_dev;
- struct zs sc_zs[2];
- struct intrhand sc_ih;
- int sc_flags;
+ struct device sc_dev;
+ struct zs sc_zs[2];
+ struct intrhand sc_ih;
+ void *sc_softih;
+ int sc_flags;
};
#define ZSSF_85230 1
@@ -129,7 +130,6 @@ int zsirq(void *);
int zsregs(vaddr_t, int, volatile u_char **, volatile u_char **);
int zspclk(void);
-u_int8_t sir_zs;
void zs_softint(void *);
#define zsunit(dev) (minor(dev) >> 1)
@@ -159,9 +159,9 @@ void zscc_mset(struct sccregs *, int);
void zscc_mclr(struct sccregs *, int);
void zs_drain(struct zs *);
void zs_unblock(struct tty *);
-void zs_txint(struct zs *);
-void zs_rxint(struct zs *);
-void zs_extint(struct zs *);
+void zs_txint(struct zssoftc *, struct zs *);
+void zs_rxint(struct zssoftc *, struct zs *);
+void zs_extint(struct zssoftc *, struct zs *);
cons_decl(zs);
int
@@ -263,8 +263,7 @@ zsattach(parent, self, args)
zp->scc.s_dr = scc_dr;
zp->flags |= ZS_RESET;
- if (sir_zs == 0)
- sir_zs = allocate_sir(zs_softint, 0);
+ sc->sc_softih = softintr_establish(IPL_SOFTTTY, zs_softint, sc);
printf("\n");
@@ -535,7 +534,7 @@ zsstart(tp)
zp->send_ptr = tp->t_outq.c_cf;
zp->send_count = n;
zp->sent_count = 0;
- zs_txint(zp);
+ zs_txint(sc, zp);
spltty();
}
}
@@ -759,26 +758,25 @@ zsirq(arg)
if (ipend == 0)
return (0);
if ((ipend & 0x20) != 0)
- zs_rxint(zp);
+ zs_rxint(sc, zp);
if ((ipend & 0x10) != 0)
- zs_txint(zp);
+ zs_txint(sc, zp);
if ((ipend & 0x8) != 0)
- zs_extint(zp);
+ zs_extint(sc, zp);
++zp; /* now look for B side ints */
if ((ipend & 0x4) != 0)
- zs_rxint(zp);
+ zs_rxint(sc, zp);
if ((ipend & 0x2) != 0)
- zs_txint(zp);
+ zs_txint(sc, zp);
if ((ipend & 0x1) != 0)
- zs_extint(zp);
+ zs_extint(sc, zp);
ZWRITE0(&zp->scc, 0x38); /* reset highest IUS */
return (1);
}
void
-zs_txint(zp)
- register struct zs *zp;
+zs_txint(struct zssoftc *sc, struct zs *zp)
{
struct sccregs *scc;
int c;
@@ -798,14 +796,13 @@ zs_txint(zp)
if (zp->send_count == 0 && (zp->hflags & ZH_TXING) != 0) {
zp->hflags &= ~ZH_TXING;
zp->hflags |= ZH_SIRQ;
- setsoftint(sir_zs);
+ softintr_schedule(sc->sc_softih);
}
}
}
void
-zs_rxint(zp)
- register struct zs *zp;
+zs_rxint(struct zssoftc *sc, struct zs *zp)
{
register int stat, c, n, extra;
u_char *put;
@@ -846,14 +843,13 @@ zs_rxint(zp)
zp->rcv_put = put;
zp->rcv_count = n;
zp->hflags |= ZH_SIRQ;
- setsoftint(sir_zs);
+ softintr_schedule(sc->sc_softih);
}
}
/* Ext/status interrupt */
void
-zs_extint(zp)
- register struct zs *zp;
+zs_extint(struct zssoftc *sc, struct zs *zp)
{
int rr0;
struct tty *tp = zp->tty;
@@ -875,13 +871,13 @@ zs_extint(zp)
else {
zp->hflags &= ~ZH_OBLOCK;
if ((rr0 & SCC_TXRDY) != 0)
- zs_txint(zp);
+ zs_txint(sc, zp);
}
}
zp->modem_change |= rr0 ^ zp->modem_state;
zp->modem_state = rr0;
zp->hflags |= ZH_SIRQ;
- setsoftint(sir_zs);
+ softintr_schedule(sc->sc_softih);
}
/* ARGSUSED */
@@ -889,97 +885,93 @@ void
zs_softint(arg)
void *arg;
{
+ struct zssoftc *sc = (struct zssoftc *)arg;
int s, c, stat, rr0;
struct zs *zp;
struct tty *tp;
u_char *get;
- int unit, side;
+ int side;
s = splzs();
- for (unit = 0; unit < zs_cd.cd_ndevs; ++unit) {
- if (zs_cd.cd_devs[unit] == NULL)
+ zp = &sc->sc_zs[0];
+ for (side = 0; side < 2; ++side, ++zp) {
+ if ((zp->hflags & ZH_SIRQ) == 0)
continue;
- zp = &((struct zssoftc *) zs_cd.cd_devs[unit])->sc_zs[0];
- for (side = 0; side < 2; ++side, ++zp) {
- if ((zp->hflags & ZH_SIRQ) == 0)
- continue;
- zp->hflags &= ~ZH_SIRQ;
- tp = zp->tty;
+ zp->hflags &= ~ZH_SIRQ;
+ tp = zp->tty;
- /* check for tx done */
- spltty();
- if (tp != NULL && zp->send_count == 0
- && (tp->t_state & TS_BUSY) != 0) {
- tp->t_state &= ~(TS_BUSY | TS_FLUSH);
- ndflush(&tp->t_outq, zp->sent_count);
- if (tp->t_outq.c_cc <= tp->t_lowat) {
- if (tp->t_state & TS_ASLEEP) {
- tp->t_state &= ~TS_ASLEEP;
- wakeup((caddr_t) & tp->t_outq);
- }
- selwakeup(&tp->t_wsel);
+ /* check for tx done */
+ spltty();
+ if (tp != NULL && zp->send_count == 0
+ && (tp->t_state & TS_BUSY) != 0) {
+ tp->t_state &= ~(TS_BUSY | TS_FLUSH);
+ ndflush(&tp->t_outq, zp->sent_count);
+ if (tp->t_outq.c_cc <= tp->t_lowat) {
+ if (tp->t_state & TS_ASLEEP) {
+ tp->t_state &= ~TS_ASLEEP;
+ wakeup((caddr_t) & tp->t_outq);
}
- if (tp->t_line != 0)
- (*linesw[tp->t_line].l_start) (tp);
- else
- zsstart(tp);
+ selwakeup(&tp->t_wsel);
}
- splzs();
+ if (tp->t_line != 0)
+ (*linesw[tp->t_line].l_start) (tp);
+ else
+ zsstart(tp);
+ }
+ splzs();
- /* check for received characters */
- get = zp->rcv_get;
- while (zp->rcv_count > 0) {
+ /* check for received characters */
+ get = zp->rcv_get;
+ while (zp->rcv_count > 0) {
+ c = *get++;
+ if (get >= zp->rcv_end)
+ get = zp->rcv_buf;
+ if (c == ERROR_DET) {
+ stat = *get++;
+ if (get >= zp->rcv_end)
+ get = zp->rcv_buf;
c = *get++;
if (get >= zp->rcv_end)
get = zp->rcv_buf;
- if (c == ERROR_DET) {
- stat = *get++;
- if (get >= zp->rcv_end)
- get = zp->rcv_buf;
- c = *get++;
- if (get >= zp->rcv_end)
- get = zp->rcv_buf;
- zp->rcv_count -= 3;
- } else {
- stat = 0;
- --zp->rcv_count;
+ zp->rcv_count -= 3;
+ } else {
+ stat = 0;
+ --zp->rcv_count;
+ }
+ spltty();
+ if (tp == NULL || (tp->t_state & TS_ISOPEN) == 0)
+ continue;
+ if (zp->nzs_open == 0) {
+ } else {
+ if ((stat & 0x10) != 0)
+ c |= TTY_PE;
+ if ((stat & 0x20) != 0) {
+ log(LOG_WARNING, "zs: fifo overflow\n");
+ c |= TTY_FE; /* need some error for
+ * slip stuff */
}
+ if ((stat & 0x40) != 0)
+ c |= TTY_FE;
+ (*linesw[tp->t_line].l_rint) (c, tp);
+ }
+ splzs();
+ }
+ zp->rcv_get = get;
+
+ /* check for modem lines changing */
+ while (zp->modem_change != 0 || zp->modem_state != zp->rr0) {
+ rr0 = zp->rr0 ^ zp->modem_change;
+ zp->modem_change = rr0 ^ zp->modem_state;
+
+ /* Check if DCD (carrier detect) has changed */
+ if (tp != NULL && (rr0 & 8) != (zp->rr0 & 8)) {
spltty();
- if (tp == NULL || (tp->t_state & TS_ISOPEN) == 0)
- continue;
- if (zp->nzs_open == 0) {
-
- } else {
- if ((stat & 0x10) != 0)
- c |= TTY_PE;
- if ((stat & 0x20) != 0) {
- log(LOG_WARNING, "zs: fifo overflow\n");
- c |= TTY_FE; /* need some error for
- * slip stuff */
- }
- if ((stat & 0x40) != 0)
- c |= TTY_FE;
- (*linesw[tp->t_line].l_rint) (c, tp);
- }
+ ttymodem(tp, rr0 & 8);
+ /* XXX possibly should disable line if
+ * return value is 0 */
splzs();
}
- zp->rcv_get = get;
-
- /* check for modem lines changing */
- while (zp->modem_change != 0 || zp->modem_state != zp->rr0) {
- rr0 = zp->rr0 ^ zp->modem_change;
- zp->modem_change = rr0 ^ zp->modem_state;
-
- /* Check if DCD (carrier detect) has changed */
- if (tp != NULL && (rr0 & 8) != (zp->rr0 & 8)) {
- spltty();
- ttymodem(tp, rr0 & 8);
- /* XXX possibly should disable line if
- * return value is 0 */
- splzs();
- }
- zp->rr0 = rr0;
- }
+ zp->rr0 = rr0;
}
}
splx(s);
diff --git a/sys/arch/mvme68k/include/intr.h b/sys/arch/mvme68k/include/intr.h
index c6f711cb9aa..bd16c4471f3 100644
--- a/sys/arch/mvme68k/include/intr.h
+++ b/sys/arch/mvme68k/include/intr.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: intr.h,v 1.17 2009/03/01 21:40:49 miod Exp $ */
+/* $OpenBSD: intr.h,v 1.18 2009/03/15 20:40:25 miod Exp $ */
/*
* Copyright (C) 2000 Steve Murphree, Jr.
* All rights reserved.
@@ -34,25 +34,6 @@
#ifdef _KERNEL
/*
- * Simulated software interrupt register.
- */
-extern volatile u_int8_t ssir;
-
-#define SIR_NET 0x01
-#define SIR_CLOCK 0x02
-
-#define siron(mask) \
- __asm __volatile ( "orb %1,%0" : "=m" (ssir) : "ir" (mask))
-#define siroff(mask) \
- __asm __volatile ( "andb %1,%0" : "=m" (ssir) : "ir" (~(mask)))
-
-#define setsoftint(s) siron(s)
-#define setsoftnet() siron(SIR_NET)
-#define setsoftclock() siron(SIR_CLOCK)
-
-u_int8_t allocate_sir(void (*proc)(void *), void *arg);
-
-/*
* Interrupt "levels". These are a more abstract representation
* of interrupt levels, and do not have the same meaning as m68k
* CPU interrupt levels. They serve two purposes:
@@ -61,8 +42,7 @@ u_int8_t allocate_sir(void (*proc)(void *), void *arg);
* - compute CPU PSL values for the spl*() calls.
*/
#define IPL_NONE 0
-#define IPL_SOFTNET 1
-#define IPL_SOFTCLOCK 1
+#define IPL_SOFTINT 1
#define IPL_BIO 2
#define IPL_NET 3
#define IPL_TTY 5
@@ -86,6 +66,8 @@ u_int8_t allocate_sir(void (*proc)(void *), void *arg);
/* watch out for side effects */
#define splx(s) ((s) & PSL_IPL ? _spl(s) : spl0())
+#include <m68k/intr.h> /* soft interrupt support */
+
/* locore.s */
int spl0(void);
diff --git a/sys/arch/mvme68k/mvme68k/locore.s b/sys/arch/mvme68k/mvme68k/locore.s
index 56cdfa8f350..6dc91bbe290 100644
--- a/sys/arch/mvme68k/mvme68k/locore.s
+++ b/sys/arch/mvme68k/mvme68k/locore.s
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore.s,v 1.60 2009/03/01 22:08:13 miod Exp $ */
+/* $OpenBSD: locore.s,v 1.61 2009/03/15 20:40:25 miod Exp $ */
/*
* Copyright (c) 1995 Theo de Raadt
@@ -1009,10 +1009,10 @@ ENTRY_NOPROFILE(trap0)
addql #4,sp | pop syscall arg
tstl _C_LABEL(astpending)
jne Lrei2
- tstb _C_LABEL(ssir)
+ tstl _C_LABEL(softpending)
jeq Ltrap1
movw #SPL1,sr
- tstb _C_LABEL(ssir)
+ tstl _C_LABEL(softpending)
jne Lsir1
Ltrap1:
movl sp@(FR_SP),a0 | grab and restore
@@ -1197,7 +1197,7 @@ ENTRY_NOPROFILE(spurintr)
* necessitating a stack cleanup.
*/
-BSS(ssir,1)
+BSS(softpending,4)
ASENTRY_NOPROFILE(rei)
tstl _C_LABEL(astpending) | AST pending?
@@ -1235,7 +1235,7 @@ Laststkadj:
movl sp@,sp | and our SP
rte | and do real RTE
Lchksir:
- tstb _C_LABEL(ssir) | SIR pending?
+ tstl _C_LABEL(softpending) | SIR pending?
jeq Ldorte | no, all done
movl d0,sp@- | need a scratch register
movw sp@(4),d0 | get SR
@@ -1244,7 +1244,7 @@ Lchksir:
movl sp@+,d0 | restore scratch register
Lgotsir:
movw #SPL1,sr | prevent others from servicing int
- tstb _C_LABEL(ssir) | too late?
+ tstl _C_LABEL(softpending) | too late?
jeq Ldorte | yes, oh well...
clrl sp@- | stack adjust
moveml #0xFFFF,sp@- | save all registers
@@ -1690,7 +1690,7 @@ ENTRY(spl0)
moveq #0,d0
movw sr,d0 | get old SR for return
movw #PSL_LOWIPL,sr | restore new SR
- tstb _C_LABEL(ssir) | software interrupt pending?
+ tstl _C_LABEL(softpending) | software interrupt pending?
jeq Lspldone | no, all done
subql #4,sp | make room for RTE frame
movl sp@(4),sp@(2) | position return address
diff --git a/sys/arch/mvme68k/mvme68k/machdep.c b/sys/arch/mvme68k/mvme68k/machdep.c
index 0a8d85d8df9..206d606a0da 100644
--- a/sys/arch/mvme68k/mvme68k/machdep.c
+++ b/sys/arch/mvme68k/mvme68k/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.113 2009/03/01 22:08:13 miod Exp $ */
+/* $OpenBSD: machdep.c,v 1.114 2009/03/15 20:40:25 miod Exp $ */
/*
* Copyright (c) 1995 Theo de Raadt
@@ -111,8 +111,6 @@
#include <dev/cons.h>
-#include <net/netisr.h>
-
#ifdef DDB
#include <machine/db_machdep.h>
#include <ddb/db_extern.h>
@@ -870,29 +868,6 @@ badvaddr(addr, size)
return (0);
}
-int netisr;
-
-void
-netintr(arg)
- void *arg;
-{
- int n;
-
- while ((n = netisr) != 0) {
- atomic_clearbits_int(&netisr, n);
-
-#define DONETISR(bit, fn) \
- do { \
- if (n & (1 << (bit))) \
- (fn)(); \
- } while (0)
-
-#include <net/netisr_dispatch.h>
-
-#undef DONETISR
- }
-}
-
/*
* Level 7 interrupts are normally caused by the ABORT switch,
* drop into ddb.
diff --git a/sys/arch/mvme68k/mvme68k/trap.c b/sys/arch/mvme68k/mvme68k/trap.c
index 38fdc8d0811..aa9f371ebcf 100644
--- a/sys/arch/mvme68k/mvme68k/trap.c
+++ b/sys/arch/mvme68k/mvme68k/trap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: trap.c,v 1.67 2007/05/15 13:46:22 martin Exp $ */
+/* $OpenBSD: trap.c,v 1.68 2009/03/15 20:40:25 miod Exp $ */
/*
* Copyright (c) 1995 Theo de Raadt
@@ -158,11 +158,6 @@ int mmupid = -1;
#define MDB_ISPID(p) (p) == mmupid
#endif
-#define NSIR 8
-void (*sir_routines[NSIR])(void *);
-void *sir_args[NSIR];
-u_char next_sir;
-
void trap(int, u_int, u_int, struct frame);
void syscall(register_t, struct frame);
void init_intrs(void);
@@ -238,7 +233,7 @@ trap(type, code, v, frame)
register struct proc *p;
register int i;
u_int ucode;
- int typ = 0, bit;
+ int typ = 0;
#ifdef COMPAT_HPUX
extern struct emul emul_hpux;
#endif
@@ -473,13 +468,19 @@ copyfault:
case T_SSIR: /* software interrupt */
case T_SSIR|T_USER:
- while ((bit = ffs(ssir))) {
- --bit;
- ssir &= ~(1 << bit);
- uvmexp.softs++;
- if (sir_routines[bit])
- sir_routines[bit](sir_args[bit]);
+ {
+ int sir, q, mask;
+
+ while ((sir = softpending) != 0) {
+ atomic_clearbits_int(&softpending, sir);
+
+ for (q = SI_NQUEUES - 1, mask = 1 << (SI_NQUEUES - 1);
+ mask != 0; q--, mask >>= 1)
+ if (mask & sir)
+ softintr_dispatch(q);
}
+ }
+
/*
* If this was not an AST trap, we are all done.
*/
@@ -1100,24 +1101,6 @@ bad:
#endif
}
-/*
- * Allocation routines for software interrupts.
- */
-u_int8_t
-allocate_sir(proc, arg)
- void (*proc)(void *);
- void *arg;
-{
- int bit;
-
- if (next_sir >= NSIR)
- panic("allocate_sir: none left");
- bit = next_sir++;
- sir_routines[bit] = proc;
- sir_args[bit] = arg;
- return (1 << bit);
-}
-
typedef SLIST_HEAD(,intrhand) intrhand_t;
intrhand_t intrs[NVMEINTR];
@@ -1132,9 +1115,7 @@ init_intrs()
SLIST_INIT(&intrs[i]);
/* soft interrupts... */
- sir_routines[0] = netintr;
- sir_routines[1] = (void (*)(void *))softclock;
- next_sir = 2;
+ softintr_init();
}
void