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_TFRIP ;	/* 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 ;						\
48IDTVEC(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 ;							\
581: ;									\
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 ;							\
672: ;									\
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 */	\
815: ;									\
82	MEXITCOUNT ;							\
83	jmp	doreti ;						\
84
85
86MCOUNT_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)
279MCOUNT_LABEL(eintr)
280
281	.data
282
283	.text
284