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