kernel - Fix lockup due to recentn pmap change
[dragonfly.git] / sys / platform / pc64 / x86_64 / msi_vector.s
bloba1cc604ba51288a99b2e10e3fdff7a59aa616156
1 /*
2 * from: vector.s, 386BSD 0.1 unknown origin
3 * $FreeBSD: src/sys/i386/isa/apic_vector.s,v 1.47.2.5 2001/09/01 22:33:38 tegge Exp $
4 */
6 #include <machine/asmacros.h>
7 #include <machine/lock.h>
8 #include <machine/psl.h>
9 #include <machine/trap.h>
10 #include <machine/segments.h>
12 #include "assym.s"
14 #ifdef foo
15 /* convert an absolute IRQ# into bitmask */
16 #define IRQ_LBIT(irq_num) (1UL << (irq_num & 0x3f))
17 #endif
19 #define IRQ_SBITS(irq_num) ((irq_num) & 0x3f)
21 /* convert an absolute IRQ# into gd_ipending index */
22 #define IRQ_LIDX(irq_num) ((irq_num) >> 6)
24 #define MSI_PUSH_FRAME \
25 PUSH_FRAME ; /* 15 regs + space for 5 extras */ \
26 movq $0,TF_XFLAGS(%rsp) ; \
27 movq $0,TF_TRAPNO(%rsp) ; \
28 movq $0,TF_ADDR(%rsp) ; \
29 movq $0,TF_FLAGS(%rsp) ; \
30 movq $0,TF_ERR(%rsp) ; \
31 cld ; \
34 * Interrupt call handlers run in the following sequence:
36 * - Push the trap frame required by doreti
37 * - If we cannot take the interrupt set its ipending bit and
38 * doreti.
39 * - If we can take the interrupt clear its ipending bit,
40 * call the handler and doreti.
42 * YYY can cache gd base opitner instead of using hidden %fs prefixes.
45 #define MSI_HANDLER(irq_num) \
46 .text ; \
47 SUPERALIGN_TEXT ; \
48 IDTVEC(msi_intr##irq_num) ; \
49 MSI_PUSH_FRAME ; \
50 FAKE_MCOUNT(TF_RIP(%rsp)) ; \
51 movq lapic, %rax ; \
52 movl $0, LA_EOI(%rax) ; \
53 movq PCPU(curthread),%rbx ; \
54 testl $-1,TD_NEST_COUNT(%rbx) ; \
55 jne 1f ; \
56 testl $-1,TD_CRITCOUNT(%rbx) ; \
57 je 2f ; \
58 1: ; \
59 /* in critical section, make interrupt pending */ \
60 /* set the pending bit and return, leave interrupt masked */ \
61 movq $1,%rcx ; \
62 shlq $IRQ_SBITS(irq_num),%rcx ; \
63 movq $IRQ_LIDX(irq_num),%rdx ; \
64 orq %rcx,PCPU_E8(ipending,%rdx) ; \
65 orl $RQF_INTPEND,PCPU(reqflags) ; \
66 jmp 5f ; \
67 2: ; \
68 /* clear pending bit, run handler */ \
69 movq $1,%rcx ; \
70 shlq $IRQ_SBITS(irq_num),%rcx ; \
71 notq %rcx ; \
72 movq $IRQ_LIDX(irq_num),%rdx ; \
73 andq %rcx,PCPU_E8(ipending,%rdx) ; \
74 pushq $irq_num ; /* trapframe -> intrframe */ \
75 movq %rsp, %rdi ; /* pass frame by reference */ \
76 incl TD_CRITCOUNT(%rbx) ; \
77 sti ; \
78 call ithread_fast_handler ; \
79 decl TD_CRITCOUNT(%rbx) ; \
80 addq $8, %rsp ; /* intrframe -> trapframe */ \
81 5: ; \
82 MEXITCOUNT ; \
83 jmp doreti ; \
86 MCOUNT_LABEL(bintr)
87 MSI_HANDLER(0)
88 MSI_HANDLER(1)
89 MSI_HANDLER(2)
90 MSI_HANDLER(3)
91 MSI_HANDLER(4)
92 MSI_HANDLER(5)
93 MSI_HANDLER(6)
94 MSI_HANDLER(7)
95 MSI_HANDLER(8)
96 MSI_HANDLER(9)
97 MSI_HANDLER(10)
98 MSI_HANDLER(11)
99 MSI_HANDLER(12)
100 MSI_HANDLER(13)
101 MSI_HANDLER(14)
102 MSI_HANDLER(15)
103 MSI_HANDLER(16)
104 MSI_HANDLER(17)
105 MSI_HANDLER(18)
106 MSI_HANDLER(19)
107 MSI_HANDLER(20)
108 MSI_HANDLER(21)
109 MSI_HANDLER(22)
110 MSI_HANDLER(23)
111 MSI_HANDLER(24)
112 MSI_HANDLER(25)
113 MSI_HANDLER(26)
114 MSI_HANDLER(27)
115 MSI_HANDLER(28)
116 MSI_HANDLER(29)
117 MSI_HANDLER(30)
118 MSI_HANDLER(31)
119 MSI_HANDLER(32)
120 MSI_HANDLER(33)
121 MSI_HANDLER(34)
122 MSI_HANDLER(35)
123 MSI_HANDLER(36)
124 MSI_HANDLER(37)
125 MSI_HANDLER(38)
126 MSI_HANDLER(39)
127 MSI_HANDLER(40)
128 MSI_HANDLER(41)
129 MSI_HANDLER(42)
130 MSI_HANDLER(43)
131 MSI_HANDLER(44)
132 MSI_HANDLER(45)
133 MSI_HANDLER(46)
134 MSI_HANDLER(47)
135 MSI_HANDLER(48)
136 MSI_HANDLER(49)
137 MSI_HANDLER(50)
138 MSI_HANDLER(51)
139 MSI_HANDLER(52)
140 MSI_HANDLER(53)
141 MSI_HANDLER(54)
142 MSI_HANDLER(55)
143 MSI_HANDLER(56)
144 MSI_HANDLER(57)
145 MSI_HANDLER(58)
146 MSI_HANDLER(59)
147 MSI_HANDLER(60)
148 MSI_HANDLER(61)
149 MSI_HANDLER(62)
150 MSI_HANDLER(63)
151 MSI_HANDLER(64)
152 MSI_HANDLER(65)
153 MSI_HANDLER(66)
154 MSI_HANDLER(67)
155 MSI_HANDLER(68)
156 MSI_HANDLER(69)
157 MSI_HANDLER(70)
158 MSI_HANDLER(71)
159 MSI_HANDLER(72)
160 MSI_HANDLER(73)
161 MSI_HANDLER(74)
162 MSI_HANDLER(75)
163 MSI_HANDLER(76)
164 MSI_HANDLER(77)
165 MSI_HANDLER(78)
166 MSI_HANDLER(79)
167 MSI_HANDLER(80)
168 MSI_HANDLER(81)
169 MSI_HANDLER(82)
170 MSI_HANDLER(83)
171 MSI_HANDLER(84)
172 MSI_HANDLER(85)
173 MSI_HANDLER(86)
174 MSI_HANDLER(87)
175 MSI_HANDLER(88)
176 MSI_HANDLER(89)
177 MSI_HANDLER(90)
178 MSI_HANDLER(91)
179 MSI_HANDLER(92)
180 MSI_HANDLER(93)
181 MSI_HANDLER(94)
182 MSI_HANDLER(95)
183 MSI_HANDLER(96)
184 MSI_HANDLER(97)
185 MSI_HANDLER(98)
186 MSI_HANDLER(99)
187 MSI_HANDLER(100)
188 MSI_HANDLER(101)
189 MSI_HANDLER(102)
190 MSI_HANDLER(103)
191 MSI_HANDLER(104)
192 MSI_HANDLER(105)
193 MSI_HANDLER(106)
194 MSI_HANDLER(107)
195 MSI_HANDLER(108)
196 MSI_HANDLER(109)
197 MSI_HANDLER(110)
198 MSI_HANDLER(111)
199 MSI_HANDLER(112)
200 MSI_HANDLER(113)
201 MSI_HANDLER(114)
202 MSI_HANDLER(115)
203 MSI_HANDLER(116)
204 MSI_HANDLER(117)
205 MSI_HANDLER(118)
206 MSI_HANDLER(119)
207 MSI_HANDLER(120)
208 MSI_HANDLER(121)
209 MSI_HANDLER(122)
210 MSI_HANDLER(123)
211 MSI_HANDLER(124)
212 MSI_HANDLER(125)
213 MSI_HANDLER(126)
214 MSI_HANDLER(127)
215 MSI_HANDLER(128)
216 MSI_HANDLER(129)
217 MSI_HANDLER(130)
218 MSI_HANDLER(131)
219 MSI_HANDLER(132)
220 MSI_HANDLER(133)
221 MSI_HANDLER(134)
222 MSI_HANDLER(135)
223 MSI_HANDLER(136)
224 MSI_HANDLER(137)
225 MSI_HANDLER(138)
226 MSI_HANDLER(139)
227 MSI_HANDLER(140)
228 MSI_HANDLER(141)
229 MSI_HANDLER(142)
230 MSI_HANDLER(143)
231 MSI_HANDLER(144)
232 MSI_HANDLER(145)
233 MSI_HANDLER(146)
234 MSI_HANDLER(147)
235 MSI_HANDLER(148)
236 MSI_HANDLER(149)
237 MSI_HANDLER(150)
238 MSI_HANDLER(151)
239 MSI_HANDLER(152)
240 MSI_HANDLER(153)
241 MSI_HANDLER(154)
242 MSI_HANDLER(155)
243 MSI_HANDLER(156)
244 MSI_HANDLER(157)
245 MSI_HANDLER(158)
246 MSI_HANDLER(159)
247 MSI_HANDLER(160)
248 MSI_HANDLER(161)
249 MSI_HANDLER(162)
250 MSI_HANDLER(163)
251 MSI_HANDLER(164)
252 MSI_HANDLER(165)
253 MSI_HANDLER(166)
254 MSI_HANDLER(167)
255 MSI_HANDLER(168)
256 MSI_HANDLER(169)
257 MSI_HANDLER(170)
258 MSI_HANDLER(171)
259 MSI_HANDLER(172)
260 MSI_HANDLER(173)
261 MSI_HANDLER(174)
262 MSI_HANDLER(175)
263 MSI_HANDLER(176)
264 MSI_HANDLER(177)
265 MSI_HANDLER(178)
266 MSI_HANDLER(179)
267 MSI_HANDLER(180)
268 MSI_HANDLER(181)
269 MSI_HANDLER(182)
270 MSI_HANDLER(183)
271 MSI_HANDLER(184)
272 MSI_HANDLER(185)
273 MSI_HANDLER(186)
274 MSI_HANDLER(187)
275 MSI_HANDLER(188)
276 MSI_HANDLER(189)
277 MSI_HANDLER(190)
278 MSI_HANDLER(191)
279 MCOUNT_LABEL(eintr)
281 .data
283 .text