diff options
-rw-r--r-- | sys/amd64/amd64/apic_vector.S | 15 | ||||
-rw-r--r-- | sys/amd64/isa/atpic_vector.S | 11 | ||||
-rw-r--r-- | sys/amd64/isa/icu_ipl.S | 7 | ||||
-rw-r--r-- | sys/amd64/isa/icu_ipl.s | 7 | ||||
-rw-r--r-- | sys/amd64/isa/icu_vector.S | 11 | ||||
-rw-r--r-- | sys/amd64/isa/icu_vector.s | 11 | ||||
-rw-r--r-- | sys/i386/i386/apic_vector.s | 15 | ||||
-rw-r--r-- | sys/i386/include/asnames.h | 5 | ||||
-rw-r--r-- | sys/i386/include/ipl.h | 3 | ||||
-rw-r--r-- | sys/i386/isa/apic_ipl.s | 24 | ||||
-rw-r--r-- | sys/i386/isa/apic_vector.s | 15 | ||||
-rw-r--r-- | sys/i386/isa/atpic_vector.s | 11 | ||||
-rw-r--r-- | sys/i386/isa/icu_ipl.s | 7 | ||||
-rw-r--r-- | sys/i386/isa/icu_vector.s | 11 | ||||
-rw-r--r-- | sys/i386/isa/ipl.s | 43 | ||||
-rw-r--r-- | sys/kern/kern_intr.c | 103 | ||||
-rw-r--r-- | sys/sys/interrupt.h | 15 |
17 files changed, 197 insertions, 117 deletions
diff --git a/sys/amd64/amd64/apic_vector.S b/sys/amd64/amd64/apic_vector.S index edd8225..2db57da 100644 --- a/sys/amd64/amd64/apic_vector.S +++ b/sys/amd64/amd64/apic_vector.S @@ -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: diff --git a/sys/amd64/isa/atpic_vector.S b/sys/amd64/isa/atpic_vector.S index 224970c..4756038 100644 --- a/sys/amd64/isa/atpic_vector.S +++ b/sys/amd64/isa/atpic_vector.S @@ -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 */ diff --git a/sys/amd64/isa/icu_ipl.S b/sys/amd64/isa/icu_ipl.S index 54ec5d8d..4d91725 100644 --- a/sys/amd64/isa/icu_ipl.S +++ b/sys/amd64/isa/icu_ipl.S @@ -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 diff --git a/sys/amd64/isa/icu_ipl.s b/sys/amd64/isa/icu_ipl.s index 54ec5d8d..4d91725 100644 --- a/sys/amd64/isa/icu_ipl.s +++ b/sys/amd64/isa/icu_ipl.s @@ -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 diff --git a/sys/amd64/isa/icu_vector.S b/sys/amd64/isa/icu_vector.S index 224970c..4756038 100644 --- a/sys/amd64/isa/icu_vector.S +++ b/sys/amd64/isa/icu_vector.S @@ -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 */ diff --git a/sys/amd64/isa/icu_vector.s b/sys/amd64/isa/icu_vector.s index 224970c..4756038 100644 --- a/sys/amd64/isa/icu_vector.s +++ b/sys/amd64/isa/icu_vector.s @@ -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 */ diff --git a/sys/i386/i386/apic_vector.s b/sys/i386/i386/apic_vector.s index edd8225..2db57da 100644 --- a/sys/i386/i386/apic_vector.s +++ b/sys/i386/i386/apic_vector.s @@ -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: diff --git a/sys/i386/include/asnames.h b/sys/i386/include/asnames.h index 37cd14b..bae87b5 100644 --- a/sys/i386/include/asnames.h +++ b/sys/i386/include/asnames.h @@ -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 diff --git a/sys/i386/include/ipl.h b/sys/i386/include/ipl.h index bfe5c31..3984109 100644 --- a/sys/i386/include/ipl.h +++ b/sys/i386/include/ipl.h @@ -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. diff --git a/sys/i386/isa/apic_ipl.s b/sys/i386/isa/apic_ipl.s index fa83c9f..5bbdca6 100644 --- a/sys/i386/isa/apic_ipl.s +++ b/sys/i386/isa/apic_ipl.s @@ -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 diff --git a/sys/i386/isa/apic_vector.s b/sys/i386/isa/apic_vector.s index edd8225..2db57da 100644 --- a/sys/i386/isa/apic_vector.s +++ b/sys/i386/isa/apic_vector.s @@ -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: diff --git a/sys/i386/isa/atpic_vector.s b/sys/i386/isa/atpic_vector.s index 224970c..4756038 100644 --- a/sys/i386/isa/atpic_vector.s +++ b/sys/i386/isa/atpic_vector.s @@ -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 */ diff --git a/sys/i386/isa/icu_ipl.s b/sys/i386/isa/icu_ipl.s index 54ec5d8d..4d91725 100644 --- a/sys/i386/isa/icu_ipl.s +++ b/sys/i386/isa/icu_ipl.s @@ -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 diff --git a/sys/i386/isa/icu_vector.s b/sys/i386/isa/icu_vector.s index 224970c..4756038 100644 --- a/sys/i386/isa/icu_vector.s +++ b/sys/i386/isa/icu_vector.s @@ -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 */ diff --git a/sys/i386/isa/ipl.s b/sys/i386/isa/ipl.s index 55cb847..e6f4eb0 100644 --- a/sys/i386/isa/ipl.s +++ b/sys/i386/isa/ipl.s @@ -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 diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c index f55a0da..03dc49b 100644 --- a/sys/kern/kern_intr.c +++ b/sys/kern/kern_intr.c @@ -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__ */ diff --git a/sys/sys/interrupt.h b/sys/sys/interrupt.h index 5c915f7..5db9081 100644 --- a/sys/sys/interrupt.h +++ b/sys/sys/interrupt.h @@ -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 |