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();