2 * Copyright (c) 1989, 1990 William F. Jolitz.
3 * Copyright (c) 1990 The Regents of the University of California.
6 * This code is derived from software contributed to Berkeley by
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
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.
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
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 $
44 .long vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7
45 .long vec8, vec9, vec10, vec11, vec12, vec13, vec14, vec15
47 /* interrupt mask enable (all h/w off) */
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
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
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.
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.
108 orl imasks(,%ecx,4),%eax
110 call *_ihandlers(,%ecx,4)
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.
123 popl %eax /* return address */
129 jmp _Xintr0 /* XXX might need _Xfastintr0 */
140 jmp _Xintr8 /* XXX might need _Xfastintr8 */
144 * The 'generic' vector stubs.
147 #define BUILD_VEC(irq_num) \
149 __CONCAT(vec,irq_num): ; \
150 int $ICU_OFFSET + (irq_num) ; \