kernel - Add MDS mitigation support for Intel side-channel attack
[dragonfly.git] / sys / platform / pc64 / x86_64 / msi.c
1 #include <sys/param.h>
2
3 #include <machine/intr_machdep.h>
4 #include <machine/msi_machdep.h>
5 #include <machine/msi_var.h>
6 #include <machine/md_var.h>
7
8 #include <machine_base/apic/apicreg.h>
9 #include <machine_base/apic/lapic.h>
10
11 /* MSI address */
12 #define MSI_X86_ADDR_DEST               0x000ff000
13 #define MSI_X86_ADDR_RH                 0x00000008
14 # define MSI_X86_ADDR_RH_ON             0x00000008
15 # define MSI_X86_ADDR_RH_OFF            0x00000000
16 #define MSI_X86_ADDR_DM                 0x00000004
17 # define MSI_X86_ADDR_DM_PHYSICAL       0x00000000
18 # define MSI_X86_ADDR_DM_LOGICAL        0x00000004
19
20 /* MSI data */
21 #define MSI_X86_DATA_TRGRMOD            IOART_TRGRMOD   /* Trigger mode. */
22 # define MSI_X86_DATA_TRGREDG           IOART_TRGREDG
23 # define MSI_X86_DATA_TRGRLVL           IOART_TRGRLVL
24 #define MSI_X86_DATA_LEVEL              0x00004000      /* Polarity. */
25 # define MSI_X86_DATA_DEASSERT          0x00000000
26 # define MSI_X86_DATA_ASSERT            0x00004000
27 #define MSI_X86_DATA_DELMOD             IOART_DELMOD    /* Delivery mode. */
28 # define MSI_X86_DATA_DELFIXED          IOART_DELFIXED
29 # define MSI_X86_DATA_DELLOPRI          IOART_DELLOPRI
30 # define MSI_X86_DATA_DELSMI            IOART_DELSMI
31 # define MSI_X86_DATA_DELNMI            IOART_DELNMI
32 # define MSI_X86_DATA_DELINIT           IOART_DELINIT
33 # define MSI_X86_DATA_DELEXINT          IOART_DELEXINT
34
35 #define MSI_X86_ADDR(lapic_id) \
36         (MSI_X86_ADDR_BASE | (lapic_id) << 12 | \
37          MSI_X86_ADDR_RH_OFF | MSI_X86_ADDR_DM_PHYSICAL)
38 #define MSI_X86_DATA(vector) \
39         (MSI_X86_DATA_TRGREDG | MSI_X86_DATA_DELFIXED | (vector))
40
41 extern inthand_t
42         IDTVEC(msi_intr0),
43         IDTVEC(msi_intr1),
44         IDTVEC(msi_intr2),
45         IDTVEC(msi_intr3),
46         IDTVEC(msi_intr4),
47         IDTVEC(msi_intr5),
48         IDTVEC(msi_intr6),
49         IDTVEC(msi_intr7),
50         IDTVEC(msi_intr8),
51         IDTVEC(msi_intr9),
52         IDTVEC(msi_intr10),
53         IDTVEC(msi_intr11),
54         IDTVEC(msi_intr12),
55         IDTVEC(msi_intr13),
56         IDTVEC(msi_intr14),
57         IDTVEC(msi_intr15),
58         IDTVEC(msi_intr16),
59         IDTVEC(msi_intr17),
60         IDTVEC(msi_intr18),
61         IDTVEC(msi_intr19),
62         IDTVEC(msi_intr20),
63         IDTVEC(msi_intr21),
64         IDTVEC(msi_intr22),
65         IDTVEC(msi_intr23),
66         IDTVEC(msi_intr24),
67         IDTVEC(msi_intr25),
68         IDTVEC(msi_intr26),
69         IDTVEC(msi_intr27),
70         IDTVEC(msi_intr28),
71         IDTVEC(msi_intr29),
72         IDTVEC(msi_intr30),
73         IDTVEC(msi_intr31),
74         IDTVEC(msi_intr32),
75         IDTVEC(msi_intr33),
76         IDTVEC(msi_intr34),
77         IDTVEC(msi_intr35),
78         IDTVEC(msi_intr36),
79         IDTVEC(msi_intr37),
80         IDTVEC(msi_intr38),
81         IDTVEC(msi_intr39),
82         IDTVEC(msi_intr40),
83         IDTVEC(msi_intr41),
84         IDTVEC(msi_intr42),
85         IDTVEC(msi_intr43),
86         IDTVEC(msi_intr44),
87         IDTVEC(msi_intr45),
88         IDTVEC(msi_intr46),
89         IDTVEC(msi_intr47),
90         IDTVEC(msi_intr48),
91         IDTVEC(msi_intr49),
92         IDTVEC(msi_intr50),
93         IDTVEC(msi_intr51),
94         IDTVEC(msi_intr52),
95         IDTVEC(msi_intr53),
96         IDTVEC(msi_intr54),
97         IDTVEC(msi_intr55),
98         IDTVEC(msi_intr56),
99         IDTVEC(msi_intr57),
100         IDTVEC(msi_intr58),
101         IDTVEC(msi_intr59),
102         IDTVEC(msi_intr60),
103         IDTVEC(msi_intr61),
104         IDTVEC(msi_intr62),
105         IDTVEC(msi_intr63),
106         IDTVEC(msi_intr64),
107         IDTVEC(msi_intr65),
108         IDTVEC(msi_intr66),
109         IDTVEC(msi_intr67),
110         IDTVEC(msi_intr68),
111         IDTVEC(msi_intr69),
112         IDTVEC(msi_intr70),
113         IDTVEC(msi_intr71),
114         IDTVEC(msi_intr72),
115         IDTVEC(msi_intr73),
116         IDTVEC(msi_intr74),
117         IDTVEC(msi_intr75),
118         IDTVEC(msi_intr76),
119         IDTVEC(msi_intr77),
120         IDTVEC(msi_intr78),
121         IDTVEC(msi_intr79),
122         IDTVEC(msi_intr80),
123         IDTVEC(msi_intr81),
124         IDTVEC(msi_intr82),
125         IDTVEC(msi_intr83),
126         IDTVEC(msi_intr84),
127         IDTVEC(msi_intr85),
128         IDTVEC(msi_intr86),
129         IDTVEC(msi_intr87),
130         IDTVEC(msi_intr88),
131         IDTVEC(msi_intr89),
132         IDTVEC(msi_intr90),
133         IDTVEC(msi_intr91),
134         IDTVEC(msi_intr92),
135         IDTVEC(msi_intr93),
136         IDTVEC(msi_intr94),
137         IDTVEC(msi_intr95),
138         IDTVEC(msi_intr96),
139         IDTVEC(msi_intr97),
140         IDTVEC(msi_intr98),
141         IDTVEC(msi_intr99),
142         IDTVEC(msi_intr100),
143         IDTVEC(msi_intr101),
144         IDTVEC(msi_intr102),
145         IDTVEC(msi_intr103),
146         IDTVEC(msi_intr104),
147         IDTVEC(msi_intr105),
148         IDTVEC(msi_intr106),
149         IDTVEC(msi_intr107),
150         IDTVEC(msi_intr108),
151         IDTVEC(msi_intr109),
152         IDTVEC(msi_intr110),
153         IDTVEC(msi_intr111),
154         IDTVEC(msi_intr112),
155         IDTVEC(msi_intr113),
156         IDTVEC(msi_intr114),
157         IDTVEC(msi_intr115),
158         IDTVEC(msi_intr116),
159         IDTVEC(msi_intr117),
160         IDTVEC(msi_intr118),
161         IDTVEC(msi_intr119),
162         IDTVEC(msi_intr120),
163         IDTVEC(msi_intr121),
164         IDTVEC(msi_intr122),
165         IDTVEC(msi_intr123),
166         IDTVEC(msi_intr124),
167         IDTVEC(msi_intr125),
168         IDTVEC(msi_intr126),
169         IDTVEC(msi_intr127),
170         IDTVEC(msi_intr128),
171         IDTVEC(msi_intr129),
172         IDTVEC(msi_intr130),
173         IDTVEC(msi_intr131),
174         IDTVEC(msi_intr132),
175         IDTVEC(msi_intr133),
176         IDTVEC(msi_intr134),
177         IDTVEC(msi_intr135),
178         IDTVEC(msi_intr136),
179         IDTVEC(msi_intr137),
180         IDTVEC(msi_intr138),
181         IDTVEC(msi_intr139),
182         IDTVEC(msi_intr140),
183         IDTVEC(msi_intr141),
184         IDTVEC(msi_intr142),
185         IDTVEC(msi_intr143),
186         IDTVEC(msi_intr144),
187         IDTVEC(msi_intr145),
188         IDTVEC(msi_intr146),
189         IDTVEC(msi_intr147),
190         IDTVEC(msi_intr148),
191         IDTVEC(msi_intr149),
192         IDTVEC(msi_intr150),
193         IDTVEC(msi_intr151),
194         IDTVEC(msi_intr152),
195         IDTVEC(msi_intr153),
196         IDTVEC(msi_intr154),
197         IDTVEC(msi_intr155),
198         IDTVEC(msi_intr156),
199         IDTVEC(msi_intr157),
200         IDTVEC(msi_intr158),
201         IDTVEC(msi_intr159),
202         IDTVEC(msi_intr160),
203         IDTVEC(msi_intr161),
204         IDTVEC(msi_intr162),
205         IDTVEC(msi_intr163),
206         IDTVEC(msi_intr164),
207         IDTVEC(msi_intr165),
208         IDTVEC(msi_intr166),
209         IDTVEC(msi_intr167),
210         IDTVEC(msi_intr168),
211         IDTVEC(msi_intr169),
212         IDTVEC(msi_intr170),
213         IDTVEC(msi_intr171),
214         IDTVEC(msi_intr172),
215         IDTVEC(msi_intr173),
216         IDTVEC(msi_intr174),
217         IDTVEC(msi_intr175),
218         IDTVEC(msi_intr176),
219         IDTVEC(msi_intr177),
220         IDTVEC(msi_intr178),
221         IDTVEC(msi_intr179),
222         IDTVEC(msi_intr180),
223         IDTVEC(msi_intr181),
224         IDTVEC(msi_intr182),
225         IDTVEC(msi_intr183),
226         IDTVEC(msi_intr184),
227         IDTVEC(msi_intr185),
228         IDTVEC(msi_intr186),
229         IDTVEC(msi_intr187),
230         IDTVEC(msi_intr188),
231         IDTVEC(msi_intr189),
232         IDTVEC(msi_intr190),
233         IDTVEC(msi_intr191);
234
235 static inthand_t *msi_intr[IDT_HWI_VECTORS] = {
236         &IDTVEC(msi_intr0),
237         &IDTVEC(msi_intr1),
238         &IDTVEC(msi_intr2),
239         &IDTVEC(msi_intr3),
240         &IDTVEC(msi_intr4),
241         &IDTVEC(msi_intr5),
242         &IDTVEC(msi_intr6),
243         &IDTVEC(msi_intr7),
244         &IDTVEC(msi_intr8),
245         &IDTVEC(msi_intr9),
246         &IDTVEC(msi_intr10),
247         &IDTVEC(msi_intr11),
248         &IDTVEC(msi_intr12),
249         &IDTVEC(msi_intr13),
250         &IDTVEC(msi_intr14),
251         &IDTVEC(msi_intr15),
252         &IDTVEC(msi_intr16),
253         &IDTVEC(msi_intr17),
254         &IDTVEC(msi_intr18),
255         &IDTVEC(msi_intr19),
256         &IDTVEC(msi_intr20),
257         &IDTVEC(msi_intr21),
258         &IDTVEC(msi_intr22),
259         &IDTVEC(msi_intr23),
260         &IDTVEC(msi_intr24),
261         &IDTVEC(msi_intr25),
262         &IDTVEC(msi_intr26),
263         &IDTVEC(msi_intr27),
264         &IDTVEC(msi_intr28),
265         &IDTVEC(msi_intr29),
266         &IDTVEC(msi_intr30),
267         &IDTVEC(msi_intr31),
268         &IDTVEC(msi_intr32),
269         &IDTVEC(msi_intr33),
270         &IDTVEC(msi_intr34),
271         &IDTVEC(msi_intr35),
272         &IDTVEC(msi_intr36),
273         &IDTVEC(msi_intr37),
274         &IDTVEC(msi_intr38),
275         &IDTVEC(msi_intr39),
276         &IDTVEC(msi_intr40),
277         &IDTVEC(msi_intr41),
278         &IDTVEC(msi_intr42),
279         &IDTVEC(msi_intr43),
280         &IDTVEC(msi_intr44),
281         &IDTVEC(msi_intr45),
282         &IDTVEC(msi_intr46),
283         &IDTVEC(msi_intr47),
284         &IDTVEC(msi_intr48),
285         &IDTVEC(msi_intr49),
286         &IDTVEC(msi_intr50),
287         &IDTVEC(msi_intr51),
288         &IDTVEC(msi_intr52),
289         &IDTVEC(msi_intr53),
290         &IDTVEC(msi_intr54),
291         &IDTVEC(msi_intr55),
292         &IDTVEC(msi_intr56),
293         &IDTVEC(msi_intr57),
294         &IDTVEC(msi_intr58),
295         &IDTVEC(msi_intr59),
296         &IDTVEC(msi_intr60),
297         &IDTVEC(msi_intr61),
298         &IDTVEC(msi_intr62),
299         &IDTVEC(msi_intr63),
300         &IDTVEC(msi_intr64),
301         &IDTVEC(msi_intr65),
302         &IDTVEC(msi_intr66),
303         &IDTVEC(msi_intr67),
304         &IDTVEC(msi_intr68),
305         &IDTVEC(msi_intr69),
306         &IDTVEC(msi_intr70),
307         &IDTVEC(msi_intr71),
308         &IDTVEC(msi_intr72),
309         &IDTVEC(msi_intr73),
310         &IDTVEC(msi_intr74),
311         &IDTVEC(msi_intr75),
312         &IDTVEC(msi_intr76),
313         &IDTVEC(msi_intr77),
314         &IDTVEC(msi_intr78),
315         &IDTVEC(msi_intr79),
316         &IDTVEC(msi_intr80),
317         &IDTVEC(msi_intr81),
318         &IDTVEC(msi_intr82),
319         &IDTVEC(msi_intr83),
320         &IDTVEC(msi_intr84),
321         &IDTVEC(msi_intr85),
322         &IDTVEC(msi_intr86),
323         &IDTVEC(msi_intr87),
324         &IDTVEC(msi_intr88),
325         &IDTVEC(msi_intr89),
326         &IDTVEC(msi_intr90),
327         &IDTVEC(msi_intr91),
328         &IDTVEC(msi_intr92),
329         &IDTVEC(msi_intr93),
330         &IDTVEC(msi_intr94),
331         &IDTVEC(msi_intr95),
332         &IDTVEC(msi_intr96),
333         &IDTVEC(msi_intr97),
334         &IDTVEC(msi_intr98),
335         &IDTVEC(msi_intr99),
336         &IDTVEC(msi_intr100),
337         &IDTVEC(msi_intr101),
338         &IDTVEC(msi_intr102),
339         &IDTVEC(msi_intr103),
340         &IDTVEC(msi_intr104),
341         &IDTVEC(msi_intr105),
342         &IDTVEC(msi_intr106),
343         &IDTVEC(msi_intr107),
344         &IDTVEC(msi_intr108),
345         &IDTVEC(msi_intr109),
346         &IDTVEC(msi_intr110),
347         &IDTVEC(msi_intr111),
348         &IDTVEC(msi_intr112),
349         &IDTVEC(msi_intr113),
350         &IDTVEC(msi_intr114),
351         &IDTVEC(msi_intr115),
352         &IDTVEC(msi_intr116),
353         &IDTVEC(msi_intr117),
354         &IDTVEC(msi_intr118),
355         &IDTVEC(msi_intr119),
356         &IDTVEC(msi_intr120),
357         &IDTVEC(msi_intr121),
358         &IDTVEC(msi_intr122),
359         &IDTVEC(msi_intr123),
360         &IDTVEC(msi_intr124),
361         &IDTVEC(msi_intr125),
362         &IDTVEC(msi_intr126),
363         &IDTVEC(msi_intr127),
364         &IDTVEC(msi_intr128),
365         &IDTVEC(msi_intr129),
366         &IDTVEC(msi_intr130),
367         &IDTVEC(msi_intr131),
368         &IDTVEC(msi_intr132),
369         &IDTVEC(msi_intr133),
370         &IDTVEC(msi_intr134),
371         &IDTVEC(msi_intr135),
372         &IDTVEC(msi_intr136),
373         &IDTVEC(msi_intr137),
374         &IDTVEC(msi_intr138),
375         &IDTVEC(msi_intr139),
376         &IDTVEC(msi_intr140),
377         &IDTVEC(msi_intr141),
378         &IDTVEC(msi_intr142),
379         &IDTVEC(msi_intr143),
380         &IDTVEC(msi_intr144),
381         &IDTVEC(msi_intr145),
382         &IDTVEC(msi_intr146),
383         &IDTVEC(msi_intr147),
384         &IDTVEC(msi_intr148),
385         &IDTVEC(msi_intr149),
386         &IDTVEC(msi_intr150),
387         &IDTVEC(msi_intr151),
388         &IDTVEC(msi_intr152),
389         &IDTVEC(msi_intr153),
390         &IDTVEC(msi_intr154),
391         &IDTVEC(msi_intr155),
392         &IDTVEC(msi_intr156),
393         &IDTVEC(msi_intr157),
394         &IDTVEC(msi_intr158),
395         &IDTVEC(msi_intr159),
396         &IDTVEC(msi_intr160),
397         &IDTVEC(msi_intr161),
398         &IDTVEC(msi_intr162),
399         &IDTVEC(msi_intr163),
400         &IDTVEC(msi_intr164),
401         &IDTVEC(msi_intr165),
402         &IDTVEC(msi_intr166),
403         &IDTVEC(msi_intr167),
404         &IDTVEC(msi_intr168),
405         &IDTVEC(msi_intr169),
406         &IDTVEC(msi_intr170),
407         &IDTVEC(msi_intr171),
408         &IDTVEC(msi_intr172),
409         &IDTVEC(msi_intr173),
410         &IDTVEC(msi_intr174),
411         &IDTVEC(msi_intr175),
412         &IDTVEC(msi_intr176),
413         &IDTVEC(msi_intr177),
414         &IDTVEC(msi_intr178),
415         &IDTVEC(msi_intr179),
416         &IDTVEC(msi_intr180),
417         &IDTVEC(msi_intr181),
418         &IDTVEC(msi_intr182),
419         &IDTVEC(msi_intr183),
420         &IDTVEC(msi_intr184),
421         &IDTVEC(msi_intr185),
422         &IDTVEC(msi_intr186),
423         &IDTVEC(msi_intr187),
424         &IDTVEC(msi_intr188),
425         &IDTVEC(msi_intr189),
426         &IDTVEC(msi_intr190),
427         &IDTVEC(msi_intr191)
428 };
429
430 void
431 msi_setup(int intr, int cpuid)
432 {
433         setidt(IDT_OFFSET + intr, msi_intr[intr],
434             SDT_SYSIGT, SEL_KPL, 0, cpuid);
435 }
436
437 void
438 msi_map(int intr, uint64_t *addr, uint32_t *data, int cpuid)
439 {
440         int vector, lapic_id;
441
442         vector = IDT_OFFSET + intr;
443         lapic_id = CPUID_TO_APICID(cpuid);
444
445         *addr = MSI_X86_ADDR(lapic_id);
446         *data = MSI_X86_DATA(vector);
447 }