Implemented dynamic registration of software interrupt handlers. Not

used yet.

Use dummy SWI handlers to avoid some checks for null pointers.
This commit is contained in:
bde 1998-08-11 15:08:13 +00:00
parent fd999b742a
commit 577b83a70e
17 changed files with 197 additions and 117 deletions

View File

@ -1,6 +1,6 @@
/*
* from: vector.s, 386BSD 0.1 unknown origin
* $Id: apic_vector.s,v 1.29 1998/04/22 22:49:27 tegge Exp $
* $Id: apic_vector.s,v 1.30 1998/05/17 22:12:04 tegge Exp $
*/
@ -923,7 +923,6 @@ MCOUNT_LABEL(eintr)
*/
.globl _ihandlers
_ihandlers:
ihandlers:
/*
* used by:
* ipl.s: doreti_unpend
@ -939,18 +938,14 @@ ihandlers:
* ipl.s: doreti_unpend
* apic_ipl.s: splz_unpend
*/
.long swi_tty, swi_net
.long dummycamisr, dummycamisr
.long _swi_vm, 0
.long _softclock, swi_ast
.long swi_tty, swi_net, dummycamisr, dummycamisr
.long _swi_vm, _swi_null, _softclock, swi_ast
imasks: /* masks for interrupt handlers */
.space NHWI*4 /* padding; HWI masks are elsewhere */
.long SWI_TTY_MASK, SWI_NET_MASK
.long SWI_CAMNET_MASK, SWI_CAMBIO_MASK
.long SWI_VM_MASK, 0
.long SWI_CLOCK_MASK, SWI_AST_MASK
.long SWI_TTY_MASK, SWI_NET_MASK, SWI_CAMNET_MASK, SWI_CAMBIO_MASK
.long SWI_VM_MASK, 0, SWI_CLOCK_MASK, SWI_AST_MASK
/* active flag for lazy masking */
iactive:

View File

@ -1,6 +1,6 @@
/*
* from: vector.s, 386BSD 0.1 unknown origin
* $Id: icu_vector.s,v 1.6 1997/09/28 19:30:01 gibbs Exp $
* $Id: icu_vector.s,v 1.7 1998/01/15 07:33:59 gibbs Exp $
*/
/*
@ -195,17 +195,16 @@ MCOUNT_LABEL(eintr)
.data
.globl _ihandlers
_ihandlers:
ihandlers: /* addresses of interrupt handlers */
_ihandlers: /* addresses of interrupt handlers */
/* actually resumption addresses for HWI's */
.long Xresume0, Xresume1, Xresume2, Xresume3
.long Xresume4, Xresume5, Xresume6, Xresume7
.long Xresume8, Xresume9, Xresume10, Xresume11
.long Xresume12, Xresume13, Xresume14, Xresume15
.long swi_tty, swi_net, dummycamisr, dummycamisr
.long _swi_vm, 0, 0, 0
.long 0, 0, 0, 0
.long 0, 0, _softclock, swi_ast
.long _swi_vm, _swi_null, _swi_null, _swi_null
.long _swi_null, _swi_null, _swi_null, _swi_null
.long _swi_null, _swi_null, _softclock, swi_ast
imasks: /* masks for interrupt handlers */
.space NHWI*4 /* padding; HWI masks are elsewhere */

View File

@ -34,7 +34,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: icu_ipl.s,v 1.2 1997/08/24 00:05:13 fsmp Exp $
* $Id: icu_ipl.s,v 1.3 1997/09/02 19:40:13 fsmp Exp $
*/
.data
@ -90,9 +90,6 @@ splz_unpend:
bsfl %ecx,%ecx
btrl %ecx,_ipending
jnc splz_next
movl ihandlers(,%ecx,4),%edx
testl %edx,%edx
je splz_next /* "can't happen" */
cmpl $NHWI,%ecx
jae splz_swi
/*
@ -111,7 +108,7 @@ splz_swi:
pushl %eax
orl imasks(,%ecx,4),%eax
movl %eax,_cpl
call %edx
call *_ihandlers(,%ecx,4)
popl %eax
movl %eax,_cpl
jmp splz_next

View File

@ -34,7 +34,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: icu_ipl.s,v 1.2 1997/08/24 00:05:13 fsmp Exp $
* $Id: icu_ipl.s,v 1.3 1997/09/02 19:40:13 fsmp Exp $
*/
.data
@ -90,9 +90,6 @@ splz_unpend:
bsfl %ecx,%ecx
btrl %ecx,_ipending
jnc splz_next
movl ihandlers(,%ecx,4),%edx
testl %edx,%edx
je splz_next /* "can't happen" */
cmpl $NHWI,%ecx
jae splz_swi
/*
@ -111,7 +108,7 @@ splz_swi:
pushl %eax
orl imasks(,%ecx,4),%eax
movl %eax,_cpl
call %edx
call *_ihandlers(,%ecx,4)
popl %eax
movl %eax,_cpl
jmp splz_next

View File

@ -1,6 +1,6 @@
/*
* from: vector.s, 386BSD 0.1 unknown origin
* $Id: icu_vector.s,v 1.6 1997/09/28 19:30:01 gibbs Exp $
* $Id: icu_vector.s,v 1.7 1998/01/15 07:33:59 gibbs Exp $
*/
/*
@ -195,17 +195,16 @@ MCOUNT_LABEL(eintr)
.data
.globl _ihandlers
_ihandlers:
ihandlers: /* addresses of interrupt handlers */
_ihandlers: /* addresses of interrupt handlers */
/* actually resumption addresses for HWI's */
.long Xresume0, Xresume1, Xresume2, Xresume3
.long Xresume4, Xresume5, Xresume6, Xresume7
.long Xresume8, Xresume9, Xresume10, Xresume11
.long Xresume12, Xresume13, Xresume14, Xresume15
.long swi_tty, swi_net, dummycamisr, dummycamisr
.long _swi_vm, 0, 0, 0
.long 0, 0, 0, 0
.long 0, 0, _softclock, swi_ast
.long _swi_vm, _swi_null, _swi_null, _swi_null
.long _swi_null, _swi_null, _swi_null, _swi_null
.long _swi_null, _swi_null, _softclock, swi_ast
imasks: /* masks for interrupt handlers */
.space NHWI*4 /* padding; HWI masks are elsewhere */

View File

@ -1,6 +1,6 @@
/*
* from: vector.s, 386BSD 0.1 unknown origin
* $Id: icu_vector.s,v 1.6 1997/09/28 19:30:01 gibbs Exp $
* $Id: icu_vector.s,v 1.7 1998/01/15 07:33:59 gibbs Exp $
*/
/*
@ -195,17 +195,16 @@ MCOUNT_LABEL(eintr)
.data
.globl _ihandlers
_ihandlers:
ihandlers: /* addresses of interrupt handlers */
_ihandlers: /* addresses of interrupt handlers */
/* actually resumption addresses for HWI's */
.long Xresume0, Xresume1, Xresume2, Xresume3
.long Xresume4, Xresume5, Xresume6, Xresume7
.long Xresume8, Xresume9, Xresume10, Xresume11
.long Xresume12, Xresume13, Xresume14, Xresume15
.long swi_tty, swi_net, dummycamisr, dummycamisr
.long _swi_vm, 0, 0, 0
.long 0, 0, 0, 0
.long 0, 0, _softclock, swi_ast
.long _swi_vm, _swi_null, _swi_null, _swi_null
.long _swi_null, _swi_null, _swi_null, _swi_null
.long _swi_null, _swi_null, _softclock, swi_ast
imasks: /* masks for interrupt handlers */
.space NHWI*4 /* padding; HWI masks are elsewhere */

View File

@ -1,6 +1,6 @@
/*
* from: vector.s, 386BSD 0.1 unknown origin
* $Id: apic_vector.s,v 1.29 1998/04/22 22:49:27 tegge Exp $
* $Id: apic_vector.s,v 1.30 1998/05/17 22:12:04 tegge Exp $
*/
@ -923,7 +923,6 @@ MCOUNT_LABEL(eintr)
*/
.globl _ihandlers
_ihandlers:
ihandlers:
/*
* used by:
* ipl.s: doreti_unpend
@ -939,18 +938,14 @@ ihandlers:
* ipl.s: doreti_unpend
* apic_ipl.s: splz_unpend
*/
.long swi_tty, swi_net
.long dummycamisr, dummycamisr
.long _swi_vm, 0
.long _softclock, swi_ast
.long swi_tty, swi_net, dummycamisr, dummycamisr
.long _swi_vm, _swi_null, _softclock, swi_ast
imasks: /* masks for interrupt handlers */
.space NHWI*4 /* padding; HWI masks are elsewhere */
.long SWI_TTY_MASK, SWI_NET_MASK
.long SWI_CAMNET_MASK, SWI_CAMBIO_MASK
.long SWI_VM_MASK, 0
.long SWI_CLOCK_MASK, SWI_AST_MASK
.long SWI_TTY_MASK, SWI_NET_MASK, SWI_CAMNET_MASK, SWI_CAMBIO_MASK
.long SWI_VM_MASK, 0, SWI_CLOCK_MASK, SWI_AST_MASK
/* active flag for lazy masking */
iactive:

View File

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: asnames.h,v 1.21 1998/05/17 11:52:06 phk Exp $
* $Id: asnames.h,v 1.22 1998/05/17 18:53:08 tegge Exp $
*/
#ifndef _MACHINE_ASNAMES_H_
@ -245,6 +245,7 @@
#define _get_syscall_lock get_syscall_lock
#define _getmicrouptime getmicrouptime
#define _idqs idqs
#define _ihandlers ihandlers
#define _imen imen
#define _imen_lock imen_lock
#define _in_vm86call in_vm86call
@ -343,6 +344,8 @@
#define _ss_unlock ss_unlock
#define _started_cpus started_cpus
#define _stopped_cpus stopped_cpus
#define _swi_generic swi_generic
#define _swi_null swi_null
#define _swi_vm swi_vm
#define _syscall syscall
#define _szsigcode szsigcode

View File

@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: ipl.h,v 1.12 1997/09/21 21:38:53 gibbs Exp $
* $Id: ipl.h,v 1.13 1998/01/15 07:32:56 gibbs Exp $
*/
#ifndef _MACHINE_IPL_H_
@ -56,6 +56,7 @@
#define SWI_VM (NHWI + 4)
#define SWI_CLOCK 30
#define SWI_AST 31
#define NSWI (32 - NHWI)
/*
* Corresponding interrupt-pending bits for ipending.

View File

@ -22,7 +22,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: apic_ipl.s,v 1.19 1998/03/05 21:45:50 tegge Exp $
* $Id: apic_ipl.s,v 1.20 1998/04/22 22:49:29 tegge Exp $
*/
@ -116,21 +116,10 @@ splz_next:
ALIGN_TEXT
splz_unpend:
bsfl %ecx,%ecx
btrl %ecx, _ipending
btrl %ecx,_ipending
jnc splz_next
/*
* HWIs: will JUMP thru *_vec[], see comments below.
* SWIs: setup CALL of swi_tty, swi_net, _softclock, swi_ast.
*/
movl ihandlers(,%ecx,4),%edx
testl %edx,%edx
je splz_next /* "can't happen" */
cmpl $NHWI,%ecx
jae splz_swi
pushl %ecx
AICPL_UNLOCK
popl %ecx
/*
* We would prefer to call the intr handler directly here but that
* doesn't work for badly behaved handlers that want the interrupt
@ -141,6 +130,9 @@ splz_unpend:
* The vec[] routines build the proper frame on the stack,
* then call one of _Xintr0 thru _XintrNN.
*/
pushl %ecx
AICPL_UNLOCK
popl %ecx
jmp *_vec(,%ecx,4)
ALIGN_TEXT
@ -150,10 +142,10 @@ splz_swi:
pushl %eax
orl imasks(,%ecx,4),%eax
movl %eax,_cpl
pushl %edx
pushl %ecx
AICPL_UNLOCK
popl %edx
call %edx
popl %ecx
call *_ihandlers(,%ecx,4)
AICPL_LOCK
popl %eax
movl %eax,_cpl

View File

@ -1,6 +1,6 @@
/*
* from: vector.s, 386BSD 0.1 unknown origin
* $Id: apic_vector.s,v 1.29 1998/04/22 22:49:27 tegge Exp $
* $Id: apic_vector.s,v 1.30 1998/05/17 22:12:04 tegge Exp $
*/
@ -923,7 +923,6 @@ MCOUNT_LABEL(eintr)
*/
.globl _ihandlers
_ihandlers:
ihandlers:
/*
* used by:
* ipl.s: doreti_unpend
@ -939,18 +938,14 @@ ihandlers:
* ipl.s: doreti_unpend
* apic_ipl.s: splz_unpend
*/
.long swi_tty, swi_net
.long dummycamisr, dummycamisr
.long _swi_vm, 0
.long _softclock, swi_ast
.long swi_tty, swi_net, dummycamisr, dummycamisr
.long _swi_vm, _swi_null, _softclock, swi_ast
imasks: /* masks for interrupt handlers */
.space NHWI*4 /* padding; HWI masks are elsewhere */
.long SWI_TTY_MASK, SWI_NET_MASK
.long SWI_CAMNET_MASK, SWI_CAMBIO_MASK
.long SWI_VM_MASK, 0
.long SWI_CLOCK_MASK, SWI_AST_MASK
.long SWI_TTY_MASK, SWI_NET_MASK, SWI_CAMNET_MASK, SWI_CAMBIO_MASK
.long SWI_VM_MASK, 0, SWI_CLOCK_MASK, SWI_AST_MASK
/* active flag for lazy masking */
iactive:

View File

@ -1,6 +1,6 @@
/*
* from: vector.s, 386BSD 0.1 unknown origin
* $Id: icu_vector.s,v 1.6 1997/09/28 19:30:01 gibbs Exp $
* $Id: icu_vector.s,v 1.7 1998/01/15 07:33:59 gibbs Exp $
*/
/*
@ -195,17 +195,16 @@ MCOUNT_LABEL(eintr)
.data
.globl _ihandlers
_ihandlers:
ihandlers: /* addresses of interrupt handlers */
_ihandlers: /* addresses of interrupt handlers */
/* actually resumption addresses for HWI's */
.long Xresume0, Xresume1, Xresume2, Xresume3
.long Xresume4, Xresume5, Xresume6, Xresume7
.long Xresume8, Xresume9, Xresume10, Xresume11
.long Xresume12, Xresume13, Xresume14, Xresume15
.long swi_tty, swi_net, dummycamisr, dummycamisr
.long _swi_vm, 0, 0, 0
.long 0, 0, 0, 0
.long 0, 0, _softclock, swi_ast
.long _swi_vm, _swi_null, _swi_null, _swi_null
.long _swi_null, _swi_null, _swi_null, _swi_null
.long _swi_null, _swi_null, _softclock, swi_ast
imasks: /* masks for interrupt handlers */
.space NHWI*4 /* padding; HWI masks are elsewhere */

View File

@ -34,7 +34,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: icu_ipl.s,v 1.2 1997/08/24 00:05:13 fsmp Exp $
* $Id: icu_ipl.s,v 1.3 1997/09/02 19:40:13 fsmp Exp $
*/
.data
@ -90,9 +90,6 @@ splz_unpend:
bsfl %ecx,%ecx
btrl %ecx,_ipending
jnc splz_next
movl ihandlers(,%ecx,4),%edx
testl %edx,%edx
je splz_next /* "can't happen" */
cmpl $NHWI,%ecx
jae splz_swi
/*
@ -111,7 +108,7 @@ splz_swi:
pushl %eax
orl imasks(,%ecx,4),%eax
movl %eax,_cpl
call %edx
call *_ihandlers(,%ecx,4)
popl %eax
movl %eax,_cpl
jmp splz_next

View File

@ -1,6 +1,6 @@
/*
* from: vector.s, 386BSD 0.1 unknown origin
* $Id: icu_vector.s,v 1.6 1997/09/28 19:30:01 gibbs Exp $
* $Id: icu_vector.s,v 1.7 1998/01/15 07:33:59 gibbs Exp $
*/
/*
@ -195,17 +195,16 @@ MCOUNT_LABEL(eintr)
.data
.globl _ihandlers
_ihandlers:
ihandlers: /* addresses of interrupt handlers */
_ihandlers: /* addresses of interrupt handlers */
/* actually resumption addresses for HWI's */
.long Xresume0, Xresume1, Xresume2, Xresume3
.long Xresume4, Xresume5, Xresume6, Xresume7
.long Xresume8, Xresume9, Xresume10, Xresume11
.long Xresume12, Xresume13, Xresume14, Xresume15
.long swi_tty, swi_net, dummycamisr, dummycamisr
.long _swi_vm, 0, 0, 0
.long 0, 0, 0, 0
.long 0, 0, _softclock, swi_ast
.long _swi_vm, _swi_null, _swi_null, _swi_null
.long _swi_null, _swi_null, _swi_null, _swi_null
.long _swi_null, _swi_null, _softclock, swi_ast
imasks: /* masks for interrupt handlers */
.space NHWI*4 /* padding; HWI masks are elsewhere */

View File

@ -36,7 +36,7 @@
*
* @(#)ipl.s
*
* $Id: ipl.s,v 1.21 1998/03/23 19:52:59 jlemon Exp $
* $Id: ipl.s,v 1.22 1998/07/27 16:51:33 jlemon Exp $
*/
@ -247,21 +247,12 @@ doreti_unpend:
#endif /* SMP */
/*
* Setup JUMP to _Xresume0 thru _Xresume23 for HWIs,
* or
* Setup CALL of swi_tty, swi_net, _softclock, swi_ast for SWIs.
* Set up JUMP to _ihandlers[%ecx] for HWIs.
* Set up CALL of _ihandlers[%ecx] for SWIs.
* This is a bit early for the SMP case - we have to push %ecx and
* %edx, but could push only %ecx and load %edx later.
*/
movl ihandlers(,%ecx,4),%edx
testl %edx,%edx
#if 0
/* XXX SMP this would leave cil set: */
je doreti_next /* "can't happen" */
#else
jne 1f
int $3 /* _breakpoint */
jmp doreti_next /* "can't happen" */
1:
#endif
movl _ihandlers(,%ecx,4),%edx
cmpl $NHWI,%ecx
jae doreti_swi
cli
@ -323,6 +314,7 @@ doreti_swi:
*/
#ifdef SMP
orl imasks(,%ecx,4), %eax
pushl %ecx /* preserve for use by _swi_generic */
pushl %edx /* save handler entry point */
cli /* prevent INT deadlock */
pushl %eax /* save cpl|cml */
@ -335,6 +327,7 @@ doreti_swi:
FAST_ICPL_UNLOCK
sti
popl %edx /* restore handler entry point */
popl %ecx
#else
orl imasks(,%ecx,4),%eax
movl %eax,_cpl
@ -418,8 +411,8 @@ dummycamisr:
ret
/*
* XXX there should be a registration function to put the handler for the
* attached driver directly in ihandlers. Then this function will go away.
* This function will go away soon when register_swi() is used to register
* the poll functions.
*/
ALIGN_TEXT
swi_tty:
@ -439,6 +432,22 @@ swi_tty:
ret
#endif
/*
* The arg is in a nonstandard place, so swi_dispatcher() can't be called
* directly and swi_generic() can't use ENTRY() or MCOUNT.
*/
ALIGN_TEXT
.globl _swi_generic
_swi_generic:
pushl %ecx
FAKE_MCOUNT(4(%esp))
call _swi_dispatcher
popl %ecx
ret
ENTRY(swi_null)
ret
#ifdef APIC_IO
#include "i386/isa/apic_ipl.s"
#else

View File

@ -23,7 +23,7 @@
* (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.17 1998/06/18 15:32:08 bde Exp $
* $Id: kern_intr.c,v 1.18 1998/07/15 02:32:08 bde Exp $
*
*/
@ -42,8 +42,11 @@
#include <sys/drvresource.h>
#endif /* RESOURCE_CHECK */
#include <machine/ipl.h>
#include <i386/isa/icu.h>
#include <i386/isa/intr_machdep.h>
#include <sys/interrupt.h>
#include <stddef.h>
@ -59,6 +62,14 @@ typedef struct intrec {
int flags;
} intrec;
struct swilist {
swihand_t *sl_handler;
struct swilist *sl_next;
};
static intrec *intreclist_head[NHWI];
static struct swilist swilists[NSWI];
/*
* The interrupt multiplexer calls each of the handlers in turn,
* and applies the associated interrupt mask to "cpl", which is
@ -66,8 +77,6 @@ typedef struct intrec {
*/
#ifndef SMP
#include <machine/ipl.h>
static __inline intrmask_t
splq(intrmask_t mask)
{
@ -90,9 +99,6 @@ intr_mux(void *arg)
}
}
/* XXX better use NHWI from <machine/ipl.h> for array size ??? */
static intrec *intreclist_head[ICU_LEN];
static intrec*
find_idesc(unsigned *maskptr, int irq)
{
@ -437,4 +443,89 @@ unregister_intr(int intr, inthand2_t handler)
return (EINVAL);
}
void
register_swi(intr, handler)
int intr;
swihand_t *handler;
{
struct swilist *slp, *slq;
int s;
if (intr < NHWI || intr >= NHWI + NSWI)
panic("register_swi: bad intr %d", intr);
if (handler == swi_generic || handler == swi_null)
panic("register_swi: bad handler %p", (void *)handler);
slp = &swilists[intr - NHWI];
s = splhigh();
if (ihandlers[intr] == swi_null)
ihandlers[intr] = handler;
else {
if (slp->sl_next == NULL) {
slp->sl_handler = ihandlers[intr];
ihandlers[intr] = swi_generic;
}
slq = malloc(sizeof(*slq), M_DEVBUF, M_NOWAIT);
if (slq == NULL)
panic("register_swi: malloc failed");
slq->sl_handler = handler;
slq->sl_next = NULL;
while (slp->sl_next != NULL)
slp = slp->sl_next;
slp->sl_next = slq;
}
splx(s);
}
void
swi_dispatcher(intr)
int intr;
{
struct swilist *slp;
slp = &swilists[intr - NHWI];
do {
(*slp->sl_handler)();
slp = slp->sl_next;
} while (slp != NULL);
}
void
unregister_swi(intr, handler)
int intr;
swihand_t *handler;
{
struct swilist *slfoundpred, *slp, *slq;
int s;
if (intr < NHWI || intr >= NHWI + NSWI)
panic("unregister_swi: bad intr %d", intr);
if (handler == swi_generic || handler == swi_null)
panic("unregister_swi: bad handler %p", (void *)handler);
slp = &swilists[intr - NHWI];
s = splhigh();
if (ihandlers[intr] == handler)
ihandlers[intr] = swi_null;
else if (slp->sl_next != NULL) {
slfoundpred = NULL;
for (slq = slp->sl_next; slq != NULL;
slp = slq, slq = slp->sl_next)
if (slq->sl_handler == handler)
slfoundpred = slp;
slp = &swilists[intr - NHWI];
if (slfoundpred != NULL) {
slq = slfoundpred->sl_next;
slfoundpred->sl_next = slq->sl_next;
free(slq, M_DEVBUF);
} else if (slp->sl_handler == handler) {
slq = slp->sl_next;
slp->sl_next = slq->sl_next;
slp->sl_handler = slq->sl_handler;
free(slq, M_DEVBUF);
}
if (slp->sl_next == NULL)
ihandlers[intr] = slp->sl_handler;
}
splx(s);
}
#endif /* __i386__ */

View File

@ -23,13 +23,15 @@
* (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: interrupt.h,v 1.5 1997/06/08 17:15:31 ache Exp $
* $Id: interrupt.h,v 1.6 1997/07/09 18:08:15 ache Exp $
*/
/* XXX currently dev_instance must be set to the ISA device_id or -1 for PCI */
#define INTR_FAST 0x00000001 /* fast interrupt handler */
#define INTR_EXCL 0x00010000 /* excl. intr, default is shared */
typedef void swihand_t __P((void));
struct intrec *intr_create(void *dev_instance, int irq, inthand2_t handler,
void *arg, intrmask_t *maskptr, int flags);
@ -38,7 +40,18 @@ int intr_destroy(struct intrec *idesc);
int intr_connect(struct intrec *idesc);
int intr_disconnect(struct intrec *idesc);
void register_swi __P((int intr, swihand_t *handler));
void swi_dispatcher __P((int intr));
swihand_t swi_generic;
swihand_t swi_null;
void unregister_swi __P((int intr, swihand_t *handler));
/* XXX emulate old interface for now ... */
int register_intr __P((int intr, int device_id, u_int flags,
inthand2_t *handler, u_int *maskptr, int unit));
int unregister_intr(int intr, inthand2_t handler);
#ifdef NHWI
/* XXX type change in middle; MI code uses only the top NSWI entries. */
extern swihand_t *ihandlers[NHWI + NSWI];
#endif