aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/alpha/alpha/ipl_funcs.c59
-rw-r--r--sys/alpha/include/ipl.h4
-rw-r--r--sys/kern/kern_intr.c22
3 files changed, 53 insertions, 32 deletions
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()
+{
+ /* No interrupt registered, do nothing */
+}
+
+void
+swi_generic()
{
-#if NSIO > 0
- siopoll();
-#endif
+ /* 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__ */