Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[dragonfly.git] / sys / i386 / isa / icu_ipl.s
1 /*-
2  * Copyright (c) 1989, 1990 William F. Jolitz.
3  * Copyright (c) 1990 The Regents of the University of California.
4  * All rights reserved.
5  *
6  * This code is derived from software contributed to Berkeley by
7  * William Jolitz.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 3. All advertising materials mentioning features or use of this software
18  *    must display the following acknowledgement:
19  *      This product includes software developed by the University of
20  *      California, Berkeley and its contributors.
21  * 4. Neither the name of the University nor the names of its contributors
22  *    may be used to endorse or promote products derived from this software
23  *    without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35  * SUCH DAMAGE.
36  *
37  * $FreeBSD: src/sys/i386/isa/icu_ipl.s,v 1.6 1999/08/28 00:44:42 peter Exp $
38  * $DragonFly: src/sys/i386/isa/Attic/icu_ipl.s,v 1.2 2003/06/17 04:28:37 dillon Exp $
39  */
40
41         .data
42         ALIGN_DATA
43 vec:
44         .long    vec0,  vec1,  vec2,  vec3,  vec4,  vec5,  vec6,  vec7
45         .long    vec8,  vec9, vec10, vec11, vec12, vec13, vec14, vec15
46
47 /* interrupt mask enable (all h/w off) */
48         .globl  _imen
49 _imen:  .long   HWI_MASK
50
51
52 /*
53  * 
54  */
55         .text
56         SUPERALIGN_TEXT
57
58 /*
59  * Interrupt priority mechanism
60  *      -- soft splXX masks with group mechanism (cpl)
61  *      -- h/w masks for currently active or unused interrupts (imen)
62  *      -- ipending = active interrupts currently masked by cpl
63  */
64
65 ENTRY(splz)
66         /*
67          * The caller has restored cpl and checked that (ipending & ~cpl)
68          * is nonzero.  We have to repeat the check since if there is an
69          * interrupt while we're looking, _doreti processing for the
70          * interrupt will handle all the unmasked pending interrupts
71          * because we restored early.  We're repeating the calculation
72          * of (ipending & ~cpl) anyway so that the caller doesn't have
73          * to pass it, so this only costs one "jne".  "bsfl %ecx,%ecx"
74          * is undefined when %ecx is 0 so we can't rely on the secondary
75          * btrl tests.
76          */
77         movl    _cpl,%eax
78 splz_next:
79         /*
80          * We don't need any locking here.  (ipending & ~cpl) cannot grow 
81          * while we're looking at it - any interrupt will shrink it to 0.
82          */
83         movl    %eax,%ecx
84         notl    %ecx
85         andl    _ipending,%ecx
86         jne     splz_unpend
87         ret
88
89         ALIGN_TEXT
90 splz_unpend:
91         bsfl    %ecx,%ecx
92         btrl    %ecx,_ipending
93         jnc     splz_next
94         cmpl    $NHWI,%ecx
95         jae     splz_swi
96         /*
97          * We would prefer to call the intr handler directly here but that
98          * doesn't work for badly behaved handlers that want the interrupt
99          * frame.  Also, there's a problem determining the unit number.
100          * We should change the interface so that the unit number is not
101          * determined at config time.
102          */
103         jmp     *vec(,%ecx,4)
104
105         ALIGN_TEXT
106 splz_swi:
107         pushl   %eax
108         orl     imasks(,%ecx,4),%eax
109         movl    %eax,_cpl
110         call    *_ihandlers(,%ecx,4)
111         popl    %eax
112         movl    %eax,_cpl
113         jmp     splz_next
114
115 /*
116  * Fake clock interrupt(s) so that they appear to come from our caller instead
117  * of from here, so that system profiling works.
118  * XXX do this more generally (for all vectors; look up the C entry point).
119  * XXX frame bogusness stops us from just jumping to the C entry point.
120  */
121         ALIGN_TEXT
122 vec0:
123         popl    %eax                    /* return address */
124         pushfl
125         pushl   $KCSEL
126         pushl   %eax
127         cli
128         MEXITCOUNT
129         jmp     _Xintr0                 /* XXX might need _Xfastintr0 */
130
131 #ifndef PC98
132         ALIGN_TEXT
133 vec8:
134         popl    %eax    
135         pushfl
136         pushl   $KCSEL
137         pushl   %eax
138         cli
139         MEXITCOUNT
140         jmp     _Xintr8                 /* XXX might need _Xfastintr8 */
141 #endif /* PC98 */
142
143 /*
144  * The 'generic' vector stubs.
145  */
146
147 #define BUILD_VEC(irq_num)                      \
148         ALIGN_TEXT ;                            \
149 __CONCAT(vec,irq_num): ;                        \
150         int     $ICU_OFFSET + (irq_num) ;       \
151         ret
152
153         BUILD_VEC(1)
154         BUILD_VEC(2)
155         BUILD_VEC(3)
156         BUILD_VEC(4)
157         BUILD_VEC(5)
158         BUILD_VEC(6)
159         BUILD_VEC(7)
160 #ifdef PC98
161         BUILD_VEC(8)
162 #endif
163         BUILD_VEC(9)
164         BUILD_VEC(10)
165         BUILD_VEC(11)
166         BUILD_VEC(12)
167         BUILD_VEC(13)
168         BUILD_VEC(14)
169         BUILD_VEC(15)