Modify software interrupt handling a bit.

This commit is contained in:
tsutsui 1999-12-29 05:01:13 +00:00
parent a27c7840ac
commit bcfe791812
3 changed files with 41 additions and 33 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: zs.c,v 1.1 1999/12/09 14:53:06 tsutsui Exp $ */
/* $NetBSD: zs.c,v 1.2 1999/12/29 05:01:13 tsutsui Exp $ */
/*-
* Copyright (c) 1996 The NetBSD Foundation, Inc.
@ -112,7 +112,7 @@ struct zsdevice {
};
static struct zsdevice *zsaddr[NZS];
static u_long zs_sir;
static u_char zs_sir;
/* Flags from cninit() */
static int zs_hwflags[NZS][2];

View File

@ -1,4 +1,4 @@
/* $NetBSD: intr.h,v 1.1 1999/12/09 14:53:11 tsutsui Exp $ */
/* $NetBSD: intr.h,v 1.2 1999/12/29 05:01:14 tsutsui Exp $ */
/*
*
@ -66,22 +66,23 @@
/*
* simulated software interrupt register
*/
extern u_long ssir;
extern u_char ssir;
extern volatile u_char *ctrl_int2;
#define NSIR (sizeof(ssir) * 8)
#define SIR_NET 0x1
#define SIR_CLOCK 0x2
#define SIR_NET 0
#define SIR_CLOCK 1
#define NEXT_SIR 2
#define siroff(x) ssir &= ~(x)
#define setsoftint(x) do{ \
ssir |= (x); \
*ctrl_int2 = 0xff; \
}while(0)
#define setsoftnet() setsoftint(SIR_NET)
#define setsoftclock() setsoftint(SIR_CLOCK)
#define setsoftint(x) do { \
ssir |= (x); \
*ctrl_int2 = 0xff; \
} while (0)
#define setsoftnet() setsoftint(1 << SIR_NET)
#define setsoftclock() setsoftint(1 << SIR_CLOCK)
u_long allocate_sir __P((void (*) __P((void *)), void *));
u_char allocate_sir __P((void (*) __P((void *)), void *));
void init_sir __P((void));
#endif /* _KERNEL */

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.1 1999/12/09 14:53:17 tsutsui Exp $ */
/* $NetBSD: machdep.c,v 1.2 1999/12/29 05:01:14 tsutsui Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@ -1035,47 +1035,48 @@ void intrhand_lev2 __P((void));
void intrhand_lev3 __P((void));
void intrhand_lev4 __P((void));
void intrhand_lev5 __P((void));
#if NLE > 0
int leintr __P((int));
#endif
#if NSI > 0
int si_intr __P((void *));
#endif
void (*sir_routines[NSIR]) __P((void *));
void *sir_args[NSIR];
u_long ssir;
u_char ssir;
int next_sir;
void
intrhand_lev2()
{
int bit;
int bit, s;
u_char sintr;
/* disable level 2 interrupt */
*ctrl_int2 = 0;
s = splhigh();
sintr = ssir;
ssir = 0;
splx(s);
intrcnt[2]++;
uvmexp.intrs++;
while ((bit = ffs(ssir)) != 0) {
--bit;
ssir &= ~(1 << bit);
uvmexp.softs++;
if (sir_routines[bit])
sir_routines[bit](sir_args[bit]);
for (bit = 0; bit < next_sir; bit++) {
if (sintr & (1 << bit)) {
uvmexp.softs++;
if (sir_routines[bit])
sir_routines[bit](sir_args[bit]);
}
}
}
/*
* Allocation routines for software interrupts.
*/
u_long
u_char
allocate_sir(proc, arg)
void (*proc) __P((void *));
void *arg;
{
int bit;
if( next_sir >= NSIR )
if (next_sir >= NSIR)
panic("allocate_sir: none left");
bit = next_sir++;
sir_routines[bit] = proc;
@ -1088,9 +1089,9 @@ init_sir()
{
extern void netintr __P((void));
sir_routines[0] = (void (*) __P((void *)))netintr;
sir_routines[1] = (void (*) __P((void *)))softclock;
next_sir = 2;
sir_routines[SIR_NET] = (void (*) __P((void *)))netintr;
sir_routines[SIR_CLOCK] = (void (*) __P((void *)))softclock;
next_sir = NEXT_SIR;
}
@ -1112,6 +1113,12 @@ void
intrhand_lev4()
{
int stat;
#if NLE > 0
extern int leintr __P((int));
#endif
#if NSI > 0
extern int si_intr __P((int));
#endif
#define INTST_LANCE 0x04
#define INTST_SCSI 0x80