diff --git a/sys/alpha/alpha/ipl_funcs.c b/sys/alpha/alpha/ipl_funcs.c
index 251c4d28a94e..ad6670ecbbef 100644
--- a/sys/alpha/alpha/ipl_funcs.c
+++ b/sys/alpha/alpha/ipl_funcs.c
@@ -23,11 +23,12 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$Id: ipl_funcs.c,v 1.6 1998/09/16 08:21:12 dfr Exp $
+ *	$Id: ipl_funcs.c,v 1.7 1998/09/19 09:29:40 dfr Exp $
  */
 
 #include <sys/types.h>
 #include <sys/systm.h>
+#include <sys/interrupt.h>
 #include <machine/ipl.h>
 #include <machine/cpu.h>
 #include <net/netisr.h>
@@ -38,17 +39,28 @@ unsigned int bio_imask;		/* XXX */
 unsigned int cam_imask;		/* XXX */
 unsigned int net_imask;		/* XXX */
 
+static void swi_net(void);
+extern void swi_camnet(void);
+extern void swi_cambio(void);
+
 void	(*netisrs[32]) __P((void));
+swihand_t *ihandlers[32] = {	/* software interrupts */
+	swi_null,	swi_net,	swi_camnet,	swi_cambio,
+	swi_null,	softclock,	swi_null,	swi_null,
+	swi_null,	swi_null,	swi_null,	swi_null,
+	swi_null,	swi_null,	swi_null,	swi_null,
+	swi_null,	swi_null,	swi_null,	swi_null,
+	swi_null,	swi_null,	swi_null,	swi_null,
+	swi_null,	swi_null,	swi_null,	swi_null,
+	swi_null,	swi_null,	swi_null,	swi_null,
+};
+
 u_int32_t netisr;
 u_int32_t ipending;
 u_int32_t idelayed;
 
 #define getcpl()	(alpha_pal_rdps() & ALPHA_PSL_IPL_MASK)
 
-static void swi_tty(void);
-static void swi_net(void);
-extern void swi_camnet(void);
-extern void swi_cambio(void);
 
 static void atomic_setbit(u_int32_t* p, u_int32_t bit)
 {
@@ -84,12 +96,17 @@ static u_int32_t atomic_readandclear(u_int32_t* p)
     return v;
 }
 
-static void
-swi_tty()
+void
+swi_null()
 {
-#if NSIO > 0
-    siopoll();
-#endif
+    /* No interrupt registered, do nothing */
+}
+
+void
+swi_generic()
+{
+    /* Just a placeholder, we call swi_dispatcher directly */
+    panic("swi_generic() called");
 }
 
 static void
@@ -109,23 +126,22 @@ void
 do_sir()
 {
     u_int32_t pend;
+    int i;
 
     splsoft();
     while (pend = atomic_readandclear(&ipending)) {
-	if (pend & (1 << SWI_TTY))
-	    swi_tty();
-	if (pend & (1 << SWI_NET))
-	    swi_net();
-	if (pend & (1 << SWI_CAMNET))
-	    swi_camnet();
-	if (pend & (1 << SWI_CAMBIO))
-	    swi_cambio();
-	if (pend & (1 << SWI_CLOCK))
-	    softclock();
+	for (i = 0; pend && i < 32; i++) {
+	    if (pend & (1 << i)) {
+		if (ihandlers[i] == swi_generic)
+		    swi_dispatcher(i);
+		else
+		    ihandlers[i]();
+		pend &= ~(1 << i);
+	    }
+	}
     }
 }
 
-
 #define GENSET(name, ptr, bit)			\
 						\
 void name(void)					\
@@ -202,4 +218,3 @@ splx(int s)
     else
 	spl0();
 }
-
diff --git a/sys/alpha/include/ipl.h b/sys/alpha/include/ipl.h
index 571a93fd16e7..79e83f3d1016 100644
--- a/sys/alpha/include/ipl.h
+++ b/sys/alpha/include/ipl.h
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$Id: ipl.h,v 1.5 1998/09/16 08:23:21 dfr Exp $
+ *	$Id: ipl.h,v 1.6 1998/09/19 09:29:40 dfr Exp $
  */
 
 #ifndef _MACHINE_IPL_H_
@@ -38,6 +38,8 @@
 #define SWI_CAMBIO	3
 #define SWI_VM		4
 #define SWI_CLOCK	5
+#define NSWI		32
+#define NHWI		0
 
 extern int splsoft(void);
 extern int splsoftclock(void);
diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c
index 03dc49b992b6..207263736e86 100644
--- a/sys/kern/kern_intr.c
+++ b/sys/kern/kern_intr.c
@@ -23,16 +23,10 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $Id: kern_intr.c,v 1.18 1998/07/15 02:32:08 bde Exp $
+ * $Id: kern_intr.c,v 1.19 1998/08/11 15:08:13 bde Exp $
  *
  */
 
-#ifdef __i386__
-
-/*
- * This file is pretty i386 specific.  I might be able to make it more
- * portable in the future but for now turn it off for non-i386 ports.
- */
 
 #include <sys/types.h>
 #include <sys/malloc.h>
@@ -44,13 +38,17 @@
 
 #include <machine/ipl.h>
 
+#ifdef __i386__
 #include <i386/isa/icu.h>
 #include <i386/isa/intr_machdep.h>
+#endif
 
 #include <sys/interrupt.h>
 
 #include <stddef.h>
 
+#ifdef __i386__
+
 typedef struct intrec {
 	intrmask_t	mask;
 	inthand2_t	*handler;
@@ -62,14 +60,19 @@ typedef struct intrec {
 	int		flags;
 } intrec;
 
+static intrec *intreclist_head[NHWI];
+
+#endif
+
 struct swilist {
 	swihand_t	*sl_handler;
 	struct swilist	*sl_next;
 };
 
-static intrec *intreclist_head[NHWI];
 static struct swilist swilists[NSWI];
 
+#ifdef __i386__
+
 /*
  * The interrupt multiplexer calls each of the handlers in turn,
  * and applies the associated interrupt mask to "cpl", which is
@@ -443,6 +446,8 @@ unregister_intr(int intr, inthand2_t handler)
 	return (EINVAL);
 }
 
+#endif /* __i386__ */
+
 void
 register_swi(intr, handler)
 	int intr;
@@ -528,4 +533,3 @@ unregister_swi(intr, handler)
 	splx(s);
 }
 
-#endif /* __i386__ */