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:
parent
fd999b742a
commit
577b83a70e
@ -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:
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
@ -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__ */
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user