abyss/x86_64/interrupt.rs
1//! Interrupt.
2
3use super::segmentation::SegmentSelector;
4/// Type of exception
5pub enum ExceptionType {
6 Trap,
7 Interrupt,
8}
9
10/// Exception vector enumeration of the x86_64.
11///
12/// See Intel 64 and IA-32 Architectures Software Developer’s Manual, Volume
13/// 3A: System Programming Guide, Part 1, Chapter 6.15.
14#[allow(dead_code)]
15#[derive(Clone, Copy, PartialEq, Eq, Debug)]
16#[repr(u8)]
17pub enum ExceptionVector {
18 /// Interrupt 0 - Divide Error Exception (#DE)
19 DivideError = 0,
20 /// Interrupt 1 - Debug Exception (#DB)
21 Debug = 1,
22 /// Interrupt 2 - NonMaskableInterrupt Interrupt
23 NonMaskableInterrupt = 2,
24 /// Interrupt 3 - Breakpoint Exception (#BP)
25 Breakpoint = 3,
26 /// Interrupt 4 - Overflow Exception (#OF)
27 OverflowException = 4,
28 /// Interrupt 5 - Bound Range Exceeded Exception (#BR)
29 BoundRangeExceeded = 5,
30 /// Interrupt 6 - Invalid Opcode Exception (#UD)
31 InvalidOpcode = 6,
32 /// Interrupt 7 - Device Not Available Exception (#NM)
33 DeviceNotAvailable = 7,
34 /// Interrupt 8 - Double Fault Exception (#DF)
35 DoubleFault = 8,
36 /// Interrupt 9 - Coprocessor Segment Overrun
37 CoprocessorSegmentOverrun = 9,
38 /// Interrupt 10 - Invalid TSS Exception (#TS)
39 InvalidTss = 10,
40 /// Interrupt 11 - Segment Not Present (#NP)
41 SegmentNotPresent = 11,
42 /// Interrupt 12 - Stack Fault Exception (#SS)
43 StackFault = 12,
44 /// Interrupt 13 - General Protection Exception (#GP)
45 GeneralProtection = 13,
46 /// Interrupt 14 - Page-Fault Exception (#PF)
47 PageFault = 14,
48 /// Interrupt 15 - Reserved.
49 _Reserved0 = 15,
50 /// Interrupt 16 - x87 FPU Floating-Point Error (#MF)
51 X87FpuFloatingPointError = 16,
52 /// Interrupt 17 - Alignment Check Exception (#AC)
53 AlignmentCheckException = 17,
54 /// Interrupt 18 - Machine-Check Exception (#MC)
55 MachineCheckException = 18,
56 /// Interrupt 19 - SIMD Floating-Point Exception (#XM)
57 SimdFloatingPointException = 19,
58 /// Interrupt 20 - Virtualization Exception (#VE)
59 VirtualizationException = 20,
60 /// Interrupt 21 - Reserved1.
61 _Reserved1 = 21,
62 /// Interrupt 22 - Reserved2.
63 _Reserved2 = 22,
64 /// Interrupt 23 - Reserved3.
65 _Reserved3 = 23,
66 /// Interrupt 24 - Reserved4.
67 _Reserved4 = 24,
68 /// Interrupt 25 - Reserved5.
69 _Reserved5 = 25,
70 /// Interrupt 26 - Reserved6.
71 _Reserved6 = 26,
72 /// Interrupt 27 - Reserved7.
73 _Reserved7 = 27,
74 /// Interrupt 28 - Reserved8.
75 _Reserved8 = 28,
76 /// Interrupt 29 - Reserved9.
77 _Reserved9 = 29,
78 /// Interrupt 30 - Reserved10.
79 _Reserved10 = 30,
80 /// Interrupt 31 - Reserved11.
81 _Reserved11 = 31,
82 /// Interrupt 32 - User Defined Interrupt0
83 UserDefined0 = 32,
84 /// Interrupt 33 - User Defined Interrupt1
85 UserDefined1 = 33,
86 /// Interrupt 34 - User Defined Interrupt2
87 UserDefined2 = 34,
88 /// Interrupt 35 - User Defined Interrupt3
89 UserDefined3 = 35,
90 /// Interrupt 36 - User Defined Interrupt4
91 UserDefined4 = 36,
92 /// Interrupt 37 - User Defined Interrupt5
93 UserDefined5 = 37,
94 /// Interrupt 38 - User Defined Interrupt6
95 UserDefined6 = 38,
96 /// Interrupt 39 - User Defined Interrupt7
97 UserDefined7 = 39,
98 /// Interrupt 40 - User Defined Interrupt8
99 UserDefined8 = 40,
100 /// Interrupt 41 - User Defined Interrupt9
101 UserDefined9 = 41,
102 /// Interrupt 42 - User Defined Interrupt10
103 UserDefined10 = 42,
104 /// Interrupt 43 - User Defined Interrupt11
105 UserDefined11 = 43,
106 /// Interrupt 44 - User Defined Interrupt12
107 UserDefined12 = 44,
108 /// Interrupt 45 - User Defined Interrupt13
109 UserDefined13 = 45,
110 /// Interrupt 46 - User Defined Interrupt14
111 UserDefined14 = 46,
112 /// Interrupt 47 - User Defined Interrupt15
113 UserDefined15 = 47,
114 /// Interrupt 48 - User Defined Interrupt16
115 UserDefined16 = 48,
116 /// Interrupt 49 - User Defined Interrupt17
117 UserDefined17 = 49,
118 /// Interrupt 50 - User Defined Interrupt18
119 UserDefined18 = 50,
120 /// Interrupt 51 - User Defined Interrupt19
121 UserDefined19 = 51,
122 /// Interrupt 52 - User Defined Interrupt20
123 UserDefined20 = 52,
124 /// Interrupt 53 - User Defined Interrupt21
125 UserDefined21 = 53,
126 /// Interrupt 54 - User Defined Interrupt22
127 UserDefined22 = 54,
128 /// Interrupt 55 - User Defined Interrupt23
129 UserDefined23 = 55,
130 /// Interrupt 56 - User Defined Interrupt24
131 UserDefined24 = 56,
132 /// Interrupt 57 - User Defined Interrupt25
133 UserDefined25 = 57,
134 /// Interrupt 58 - User Defined Interrupt26
135 UserDefined26 = 58,
136 /// Interrupt 59 - User Defined Interrupt27
137 UserDefined27 = 59,
138 /// Interrupt 60 - User Defined Interrupt28
139 UserDefined28 = 60,
140 /// Interrupt 61 - User Defined Interrupt29
141 UserDefined29 = 61,
142 /// Interrupt 62 - User Defined Interrupt30
143 UserDefined30 = 62,
144 /// Interrupt 63 - User Defined Interrupt31
145 UserDefined31 = 63,
146 /// Interrupt 64 - User Defined Interrupt32
147 UserDefined32 = 64,
148 /// Interrupt 65 - User Defined Interrupt33
149 UserDefined33 = 65,
150 /// Interrupt 66 - User Defined Interrupt34
151 UserDefined34 = 66,
152 /// Interrupt 67 - User Defined Interrupt35
153 UserDefined35 = 67,
154 /// Interrupt 68 - User Defined Interrupt36
155 UserDefined36 = 68,
156 /// Interrupt 69 - User Defined Interrupt37
157 UserDefined37 = 69,
158 /// Interrupt 70 - User Defined Interrupt38
159 UserDefined38 = 70,
160 /// Interrupt 71 - User Defined Interrupt39
161 UserDefined39 = 71,
162 /// Interrupt 72 - User Defined Interrupt40
163 UserDefined40 = 72,
164 /// Interrupt 73 - User Defined Interrupt41
165 UserDefined41 = 73,
166 /// Interrupt 74 - User Defined Interrupt42
167 UserDefined42 = 74,
168 /// Interrupt 75 - User Defined Interrupt43
169 UserDefined43 = 75,
170 /// Interrupt 76 - User Defined Interrupt44
171 UserDefined44 = 76,
172 /// Interrupt 77 - User Defined Interrupt45
173 UserDefined45 = 77,
174 /// Interrupt 78 - User Defined Interrupt46
175 UserDefined46 = 78,
176 /// Interrupt 79 - User Defined Interrupt47
177 UserDefined47 = 79,
178 /// Interrupt 80 - User Defined Interrupt48
179 UserDefined48 = 80,
180 /// Interrupt 81 - User Defined Interrupt49
181 UserDefined49 = 81,
182 /// Interrupt 82 - User Defined Interrupt50
183 UserDefined50 = 82,
184 /// Interrupt 83 - User Defined Interrupt51
185 UserDefined51 = 83,
186 /// Interrupt 84 - User Defined Interrupt52
187 UserDefined52 = 84,
188 /// Interrupt 85 - User Defined Interrupt53
189 UserDefined53 = 85,
190 /// Interrupt 86 - User Defined Interrupt54
191 UserDefined54 = 86,
192 /// Interrupt 87 - User Defined Interrupt55
193 UserDefined55 = 87,
194 /// Interrupt 88 - User Defined Interrupt56
195 UserDefined56 = 88,
196 /// Interrupt 89 - User Defined Interrupt57
197 UserDefined57 = 89,
198 /// Interrupt 90 - User Defined Interrupt58
199 UserDefined58 = 90,
200 /// Interrupt 91 - User Defined Interrupt59
201 UserDefined59 = 91,
202 /// Interrupt 92 - User Defined Interrupt60
203 UserDefined60 = 92,
204 /// Interrupt 93 - User Defined Interrupt61
205 UserDefined61 = 93,
206 /// Interrupt 94 - User Defined Interrupt62
207 UserDefined62 = 94,
208 /// Interrupt 95 - User Defined Interrupt63
209 UserDefined63 = 95,
210 /// Interrupt 96 - User Defined Interrupt64
211 UserDefined64 = 96,
212 /// Interrupt 97 - User Defined Interrupt65
213 UserDefined65 = 97,
214 /// Interrupt 98 - User Defined Interrupt66
215 UserDefined66 = 98,
216 /// Interrupt 99 - User Defined Interrupt67
217 UserDefined67 = 99,
218 /// Interrupt 100 - User Defined Interrupt68
219 UserDefined68 = 100,
220 /// Interrupt 101 - User Defined Interrupt69
221 UserDefined69 = 101,
222 /// Interrupt 102 - User Defined Interrupt70
223 UserDefined70 = 102,
224 /// Interrupt 103 - User Defined Interrupt71
225 UserDefined71 = 103,
226 /// Interrupt 104 - User Defined Interrupt72
227 UserDefined72 = 104,
228 /// Interrupt 105 - User Defined Interrupt73
229 UserDefined73 = 105,
230 /// Interrupt 106 - User Defined Interrupt74
231 UserDefined74 = 106,
232 /// Interrupt 107 - User Defined Interrupt75
233 UserDefined75 = 107,
234 /// Interrupt 108 - User Defined Interrupt76
235 UserDefined76 = 108,
236 /// Interrupt 109 - User Defined Interrupt77
237 UserDefined77 = 109,
238 /// Interrupt 110 - User Defined Interrupt78
239 UserDefined78 = 110,
240 /// Interrupt 111 - User Defined Interrupt79
241 UserDefined79 = 111,
242 /// Interrupt 112 - User Defined Interrupt80
243 UserDefined80 = 112,
244 /// Interrupt 113 - User Defined Interrupt81
245 UserDefined81 = 113,
246 /// Interrupt 114 - User Defined Interrupt82
247 UserDefined82 = 114,
248 /// Interrupt 115 - User Defined Interrupt83
249 UserDefined83 = 115,
250 /// Interrupt 116 - User Defined Interrupt84
251 UserDefined84 = 116,
252 /// Interrupt 117 - User Defined Interrupt85
253 UserDefined85 = 117,
254 /// Interrupt 118 - User Defined Interrupt86
255 UserDefined86 = 118,
256 /// Interrupt 119 - User Defined Interrupt87
257 UserDefined87 = 119,
258 /// Interrupt 120 - User Defined Interrupt88
259 UserDefined88 = 120,
260 /// Interrupt 121 - User Defined Interrupt89
261 UserDefined89 = 121,
262 /// Interrupt 122 - User Defined Interrupt90
263 UserDefined90 = 122,
264 /// Interrupt 123 - User Defined Interrupt91
265 UserDefined91 = 123,
266 /// Interrupt 124 - User Defined Interrupt92
267 UserDefined92 = 124,
268 /// Interrupt 125 - User Defined Interrupt93
269 UserDefined93 = 125,
270 /// Interrupt 126 - User Defined Interrupt94
271 UserDefined94 = 126,
272 /// Interrupt 127 - User Defined Interrupt95
273 UserDefined95 = 127,
274 /// Interrupt 128 - User Defined Interrupt96
275 UserDefined96 = 128,
276 /// Interrupt 129 - User Defined Interrupt97
277 UserDefined97 = 129,
278 /// Interrupt 130 - User Defined Interrupt98
279 UserDefined98 = 130,
280 /// Interrupt 131 - User Defined Interrupt99
281 UserDefined99 = 131,
282 /// Interrupt 132 - User Defined Interrupt100
283 UserDefined100 = 132,
284 /// Interrupt 133 - User Defined Interrupt101
285 UserDefined101 = 133,
286 /// Interrupt 134 - User Defined Interrupt102
287 UserDefined102 = 134,
288 /// Interrupt 135 - User Defined Interrupt103
289 UserDefined103 = 135,
290 /// Interrupt 136 - User Defined Interrupt104
291 UserDefined104 = 136,
292 /// Interrupt 137 - User Defined Interrupt105
293 UserDefined105 = 137,
294 /// Interrupt 138 - User Defined Interrupt106
295 UserDefined106 = 138,
296 /// Interrupt 139 - User Defined Interrupt107
297 UserDefined107 = 139,
298 /// Interrupt 140 - User Defined Interrupt108
299 UserDefined108 = 140,
300 /// Interrupt 141 - User Defined Interrupt109
301 UserDefined109 = 141,
302 /// Interrupt 142 - User Defined Interrupt110
303 UserDefined110 = 142,
304 /// Interrupt 143 - User Defined Interrupt111
305 UserDefined111 = 143,
306 /// Interrupt 144 - User Defined Interrupt112
307 UserDefined112 = 144,
308 /// Interrupt 145 - User Defined Interrupt113
309 UserDefined113 = 145,
310 /// Interrupt 146 - User Defined Interrupt114
311 UserDefined114 = 146,
312 /// Interrupt 147 - User Defined Interrupt115
313 UserDefined115 = 147,
314 /// Interrupt 148 - User Defined Interrupt116
315 UserDefined116 = 148,
316 /// Interrupt 149 - User Defined Interrupt117
317 UserDefined117 = 149,
318 /// Interrupt 150 - User Defined Interrupt118
319 UserDefined118 = 150,
320 /// Interrupt 151 - User Defined Interrupt119
321 UserDefined119 = 151,
322 /// Interrupt 152 - User Defined Interrupt120
323 UserDefined120 = 152,
324 /// Interrupt 153 - User Defined Interrupt121
325 UserDefined121 = 153,
326 /// Interrupt 154 - User Defined Interrupt122
327 UserDefined122 = 154,
328 /// Interrupt 155 - User Defined Interrupt123
329 UserDefined123 = 155,
330 /// Interrupt 156 - User Defined Interrupt124
331 UserDefined124 = 156,
332 /// Interrupt 157 - User Defined Interrupt125
333 UserDefined125 = 157,
334 /// Interrupt 158 - User Defined Interrupt126
335 UserDefined126 = 158,
336 /// Interrupt 159 - User Defined Interrupt127
337 UserDefined127 = 159,
338 /// Interrupt 160 - User Defined Interrupt128
339 UserDefined128 = 160,
340 /// Interrupt 161 - User Defined Interrupt129
341 UserDefined129 = 161,
342 /// Interrupt 162 - User Defined Interrupt130
343 UserDefined130 = 162,
344 /// Interrupt 163 - User Defined Interrupt131
345 UserDefined131 = 163,
346 /// Interrupt 164 - User Defined Interrupt132
347 UserDefined132 = 164,
348 /// Interrupt 165 - User Defined Interrupt133
349 UserDefined133 = 165,
350 /// Interrupt 166 - User Defined Interrupt134
351 UserDefined134 = 166,
352 /// Interrupt 167 - User Defined Interrupt135
353 UserDefined135 = 167,
354 /// Interrupt 168 - User Defined Interrupt136
355 UserDefined136 = 168,
356 /// Interrupt 169 - User Defined Interrupt137
357 UserDefined137 = 169,
358 /// Interrupt 170 - User Defined Interrupt138
359 UserDefined138 = 170,
360 /// Interrupt 171 - User Defined Interrupt139
361 UserDefined139 = 171,
362 /// Interrupt 172 - User Defined Interrupt140
363 UserDefined140 = 172,
364 /// Interrupt 173 - User Defined Interrupt141
365 UserDefined141 = 173,
366 /// Interrupt 174 - User Defined Interrupt142
367 UserDefined142 = 174,
368 /// Interrupt 175 - User Defined Interrupt143
369 UserDefined143 = 175,
370 /// Interrupt 176 - User Defined Interrupt144
371 UserDefined144 = 176,
372 /// Interrupt 177 - User Defined Interrupt145
373 UserDefined145 = 177,
374 /// Interrupt 178 - User Defined Interrupt146
375 UserDefined146 = 178,
376 /// Interrupt 179 - User Defined Interrupt147
377 UserDefined147 = 179,
378 /// Interrupt 180 - User Defined Interrupt148
379 UserDefined148 = 180,
380 /// Interrupt 181 - User Defined Interrupt149
381 UserDefined149 = 181,
382 /// Interrupt 182 - User Defined Interrupt150
383 UserDefined150 = 182,
384 /// Interrupt 183 - User Defined Interrupt151
385 UserDefined151 = 183,
386 /// Interrupt 184 - User Defined Interrupt152
387 UserDefined152 = 184,
388 /// Interrupt 185 - User Defined Interrupt153
389 UserDefined153 = 185,
390 /// Interrupt 186 - User Defined Interrupt154
391 UserDefined154 = 186,
392 /// Interrupt 187 - User Defined Interrupt155
393 UserDefined155 = 187,
394 /// Interrupt 188 - User Defined Interrupt156
395 UserDefined156 = 188,
396 /// Interrupt 189 - User Defined Interrupt157
397 UserDefined157 = 189,
398 /// Interrupt 190 - User Defined Interrupt158
399 UserDefined158 = 190,
400 /// Interrupt 191 - User Defined Interrupt159
401 UserDefined159 = 191,
402 /// Interrupt 192 - User Defined Interrupt160
403 UserDefined160 = 192,
404 /// Interrupt 193 - User Defined Interrupt161
405 UserDefined161 = 193,
406 /// Interrupt 194 - User Defined Interrupt162
407 UserDefined162 = 194,
408 /// Interrupt 195 - User Defined Interrupt163
409 UserDefined163 = 195,
410 /// Interrupt 196 - User Defined Interrupt164
411 UserDefined164 = 196,
412 /// Interrupt 197 - User Defined Interrupt165
413 UserDefined165 = 197,
414 /// Interrupt 198 - User Defined Interrupt166
415 UserDefined166 = 198,
416 /// Interrupt 199 - User Defined Interrupt167
417 UserDefined167 = 199,
418 /// Interrupt 200 - User Defined Interrupt168
419 UserDefined168 = 200,
420 /// Interrupt 201 - User Defined Interrupt169
421 UserDefined169 = 201,
422 /// Interrupt 202 - User Defined Interrupt170
423 UserDefined170 = 202,
424 /// Interrupt 203 - User Defined Interrupt171
425 UserDefined171 = 203,
426 /// Interrupt 204 - User Defined Interrupt172
427 UserDefined172 = 204,
428 /// Interrupt 205 - User Defined Interrupt173
429 UserDefined173 = 205,
430 /// Interrupt 206 - User Defined Interrupt174
431 UserDefined174 = 206,
432 /// Interrupt 207 - User Defined Interrupt175
433 UserDefined175 = 207,
434 /// Interrupt 208 - User Defined Interrupt176
435 UserDefined176 = 208,
436 /// Interrupt 209 - User Defined Interrupt177
437 UserDefined177 = 209,
438 /// Interrupt 210 - User Defined Interrupt178
439 UserDefined178 = 210,
440 /// Interrupt 211 - User Defined Interrupt179
441 UserDefined179 = 211,
442 /// Interrupt 212 - User Defined Interrupt180
443 UserDefined180 = 212,
444 /// Interrupt 213 - User Defined Interrupt181
445 UserDefined181 = 213,
446 /// Interrupt 214 - User Defined Interrupt182
447 UserDefined182 = 214,
448 /// Interrupt 215 - User Defined Interrupt183
449 UserDefined183 = 215,
450 /// Interrupt 216 - User Defined Interrupt184
451 UserDefined184 = 216,
452 /// Interrupt 217 - User Defined Interrupt185
453 UserDefined185 = 217,
454 /// Interrupt 218 - User Defined Interrupt186
455 UserDefined186 = 218,
456 /// Interrupt 219 - User Defined Interrupt187
457 UserDefined187 = 219,
458 /// Interrupt 220 - User Defined Interrupt188
459 UserDefined188 = 220,
460 /// Interrupt 221 - User Defined Interrupt189
461 UserDefined189 = 221,
462 /// Interrupt 222 - User Defined Interrupt190
463 UserDefined190 = 222,
464 /// Interrupt 223 - User Defined Interrupt191
465 UserDefined191 = 223,
466 /// Interrupt 224 - User Defined Interrupt192
467 UserDefined192 = 224,
468 /// Interrupt 225 - User Defined Interrupt193
469 UserDefined193 = 225,
470 /// Interrupt 226 - User Defined Interrupt194
471 UserDefined194 = 226,
472 /// Interrupt 227 - User Defined Interrupt195
473 UserDefined195 = 227,
474 /// Interrupt 228 - User Defined Interrupt196
475 UserDefined196 = 228,
476 /// Interrupt 229 - User Defined Interrupt197
477 UserDefined197 = 229,
478 /// Interrupt 230 - User Defined Interrupt198
479 UserDefined198 = 230,
480 /// Interrupt 231 - User Defined Interrupt199
481 UserDefined199 = 231,
482 /// Interrupt 232 - User Defined Interrupt200
483 UserDefined200 = 232,
484 /// Interrupt 233 - User Defined Interrupt201
485 UserDefined201 = 233,
486 /// Interrupt 234 - User Defined Interrupt202
487 UserDefined202 = 234,
488 /// Interrupt 235 - User Defined Interrupt203
489 UserDefined203 = 235,
490 /// Interrupt 236 - User Defined Interrupt204
491 UserDefined204 = 236,
492 /// Interrupt 237 - User Defined Interrupt205
493 UserDefined205 = 237,
494 /// Interrupt 238 - User Defined Interrupt206
495 UserDefined206 = 238,
496 /// Interrupt 239 - User Defined Interrupt207
497 UserDefined207 = 239,
498 /// Interrupt 240 - User Defined Interrupt208
499 UserDefined208 = 240,
500 /// Interrupt 241 - User Defined Interrupt209
501 UserDefined209 = 241,
502 /// Interrupt 242 - User Defined Interrupt210
503 UserDefined210 = 242,
504 /// Interrupt 243 - User Defined Interrupt211
505 UserDefined211 = 243,
506 /// Interrupt 244 - User Defined Interrupt212
507 UserDefined212 = 244,
508 /// Interrupt 245 - User Defined Interrupt213
509 UserDefined213 = 245,
510 /// Interrupt 246 - User Defined Interrupt214
511 UserDefined214 = 246,
512 /// Interrupt 247 - User Defined Interrupt215
513 UserDefined215 = 247,
514 /// Interrupt 248 - User Defined Interrupt216
515 UserDefined216 = 248,
516 /// Interrupt 249 - User Defined Interrupt217
517 UserDefined217 = 249,
518 /// Interrupt 250 - User Defined Interrupt218
519 UserDefined218 = 250,
520 /// Interrupt 251 - User Defined Interrupt219
521 UserDefined219 = 251,
522 /// Interrupt 252 - User Defined Interrupt220
523 UserDefined220 = 252,
524 /// Interrupt 253 - User Defined Interrupt221
525 UserDefined221 = 253,
526 /// Interrupt 254 - User Defined Interrupt222
527 UserDefined222 = 254,
528 /// Interrupt 255 - User Defined Interrupt223
529 UserDefined223 = 255,
530}
531
532impl ExceptionVector {
533 /// Create a new ExceptionVector from usize.
534 #[inline(always)]
535 pub fn new(x: usize) -> Option<Self> {
536 x.try_into()
537 .ok()
538 .map(|n: u8| unsafe { core::mem::transmute(n) })
539 }
540
541 /// Cast the ExceptionVector into usize.
542 #[inline(always)]
543 pub const fn into_raw(self) -> usize {
544 self as usize
545 }
546}
547
548/// Stack frame on interrupt.
549#[derive(Clone, Copy)]
550#[repr(C)]
551pub struct InterruptStackFrame {
552 pub rip: usize,
553 pub cs: SegmentSelector,
554 #[doc(hidden)]
555 pub __pad0: u16,
556 #[doc(hidden)]
557 pub __pad1: u32,
558 pub rflags: crate::x86_64::Rflags,
559 pub rsp: usize,
560 pub ss: SegmentSelector,
561 #[doc(hidden)]
562 pub __pad2: u16,
563 #[doc(hidden)]
564 pub __pad3: u32,
565}
566
567impl core::fmt::Debug for InterruptStackFrame {
568 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> Result<(), core::fmt::Error> {
569 #[repr(transparent)]
570 pub struct HexFormatter(usize);
571
572 impl core::fmt::Debug for HexFormatter {
573 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> Result<(), core::fmt::Error> {
574 write!(f, "{:x}", self.0)
575 }
576 }
577
578 f.debug_struct("InterruptStackFrame")
579 .field("rip", &HexFormatter(self.rip))
580 .field("cs", &self.cs)
581 .field("rflags", &self.rflags)
582 .field("rsp", &HexFormatter(self.rsp))
583 .field("ss", &self.ss)
584 .finish()
585 }
586}
587
588/// X86_64's IDT table.
589#[repr(C)]
590#[derive(Clone, Copy)]
591pub struct InterruptGateDescriptor<F> {
592 lo: u16,
593 selector: u16,
594 options: u16,
595 mid: u16,
596 hi: u32,
597 _rev: u32,
598 _ty: core::marker::PhantomData<F>,
599}
600
601impl<F> InterruptGateDescriptor<F> {
602 /// Empty this gate entry.
603 #[inline(always)]
604 pub const fn empty() -> Self {
605 InterruptGateDescriptor {
606 lo: 0,
607 selector: 0,
608 options: 0,
609 mid: 0,
610 hi: 0,
611 _rev: 0,
612 _ty: core::marker::PhantomData,
613 }
614 }
615}
616
617macro_rules! define_interrupt_handler {
618 ($(#[$attr:meta])* $handler:ident = $alias:ty; $($t:tt)*) => {
619 $(#[$attr])*
620 pub type $handler = $alias;
621 impl InterruptGateDescriptor<$handler> {
622 /// Set this gate entry.
623 #[inline(always)]
624 pub fn set(&mut self, ss: SegmentSelector, ty_: ExceptionType, f: $handler) {
625 *self = InterruptGateDescriptor {
626 lo: f as usize as u16,
627 selector: (ss.index() << 3) as u16,
628 options: ((1 << 15)
629 | (ss.dpl() as u16) << 13
630 | if matches!(ty_, ExceptionType::Trap) {
631 0xf << 8
632 } else {
633 0xe << 8 // Interrupt.
634 }),
635 mid: ((f as usize as u64) >> 16) as u16,
636 hi: ((f as usize as u64) >> 32) as u32,
637 _rev: 0,
638 _ty: core::marker::PhantomData,
639 };
640 }
641 }
642
643 define_interrupt_handler!($($t)*);
644 };
645 () => {}
646}
647
648bitflags::bitflags! {
649 /// List of error codes on page fault.
650 #[repr(transparent)]
651 pub struct PFErrorCode: u64 {
652 /// When set, the page fault was caused by a page-protection violation. When not set, it was caused by a non-present page.
653 const PRESENT = 1 << 0;
654 /// When set, the page fault was caused by a write access. When not set, it was caused by a read access.
655 const WRITE_ACCESS = 1 << 1;
656 /// When set, the page fault was caused while CPL = 3. This does not necessarily mean that the page fault was a privilege violation.
657 const USER = 1 << 2;
658 /// When set, one or more page directory entries contain reserved bits which are set to 1. This only applies when the PSE or PAE flags in CR4 are set to 1.
659 const RESERVED_WRITE = 1 << 3;
660 /// When set, the page fault was caused by an instruction fetch. This only applies when the No-Execute bit is supported and enabled.
661 const INSTRCUTION_FETCH = 1 << 4;
662 }
663}
664
665/// Must be zero.
666#[repr(transparent)]
667pub struct MustbeZero(u64);
668
669define_interrupt_handler!(
670 /// Normal handler without error code.
671 Handler = unsafe extern "x86-interrupt" fn(&mut InterruptStackFrame);
672 /// Handler that push SegmentSelector as Error code.
673 /// General Protection Fault.
674 /// Invalid TSS Exception.
675 /// Segment Not Present Exception Handler.
676 /// Stack Fault Exception Handler.
677 HandlerWithSegmentSelectorErrorCode =
678 unsafe extern "x86-interrupt" fn(&mut InterruptStackFrame, SegmentSelector);
679 /// Page-Fault Handler.
680 HandlerPageFault = unsafe extern "x86-interrupt" fn(&mut InterruptStackFrame, PFErrorCode);
681 /// Align Check Exception Handler.
682 HandlerAlignCheck = unsafe extern "x86-interrupt" fn(&mut InterruptStackFrame, MustbeZero);
683 /// Double fault Exception. Abort.
684 AbortDoubleFault = unsafe extern "x86-interrupt" fn(&mut InterruptStackFrame, MustbeZero) -> !;
685 /// Machine Check Exception. Abort.
686 AbortMachineCheck = unsafe extern "x86-interrupt" fn(&mut InterruptStackFrame) -> !;
687);
688
689use crate::x86_64::table::InterruptDescriptorTable;
690/// The unique kernel IDT.
691pub static mut IDT: InterruptDescriptorTable = InterruptDescriptorTable::empty();