summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/amd64/amd64/apic_vector.S15
-rw-r--r--sys/amd64/isa/atpic_vector.S11
-rw-r--r--sys/amd64/isa/icu_ipl.S7
-rw-r--r--sys/amd64/isa/icu_ipl.s7
-rw-r--r--sys/amd64/isa/icu_vector.S11
-rw-r--r--sys/amd64/isa/icu_vector.s11
-rw-r--r--sys/i386/i386/apic_vector.s15
-rw-r--r--sys/i386/include/asnames.h5
-rw-r--r--sys/i386/include/ipl.h3
-rw-r--r--sys/i386/isa/apic_ipl.s24
-rw-r--r--sys/i386/isa/apic_vector.s15
-rw-r--r--sys/i386/isa/atpic_vector.s11
-rw-r--r--sys/i386/isa/icu_ipl.s7
-rw-r--r--sys/i386/isa/icu_vector.s11
-rw-r--r--sys/i386/isa/ipl.s43
-rw-r--r--sys/kern/kern_intr.c103
-rw-r--r--sys/sys/interrupt.h15
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
OpenPOWER on IntegriCloud