msi: Generate vectors 0~15
[dragonfly.git] / sys / platform / pc64 / x86_64 / msi_vector.s
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  */
5
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>
11
12 #include "assym.s"
13
14 #ifdef foo
15 /* convert an absolute IRQ# into bitmask */
16 #define IRQ_LBIT(irq_num)       (1UL << (irq_num & 0x3f))
17 #endif
18
19 #define IRQ_SBITS(irq_num)      ((irq_num) & 0x3f)
20
21 /* convert an absolute IRQ# into gd_ipending index */
22 #define IRQ_LIDX(irq_num)       ((irq_num) >> 6)
23
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 ;                                                           \
32
33 /*
34  * Interrupt call handlers run in the following sequence:
35  *
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.
41  *
42  * YYY can cache gd base opitner instead of using hidden %fs prefixes.
43  */
44
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 ;                                                \
84
85
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)
280
281         .data
282
283         .text