summaryrefslogtreecommitdiff
path: root/kernel/cpu/idt.S
blob: 0ba35f8009504212e39342b65370ff0659060bfb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
	.global isr_stub_table

	.extern idt_exception_handler
	.extern idt_pic_timer
	.extern idt_pic_keyboard
	.extern idt_pic_mouse
	.extern idt_pic_eoi

.macro PUSHALL
	pushq	%rax
	pushq 	%rbx
	pushq 	%rcx
	pushq 	%rdx
	pushq 	%rsi
	pushq 	%rdi
	pushq 	%rbp
	pushq 	%r8
	pushq 	%r9
	pushq 	%r10
	pushq 	%r11
	pushq 	%r12
	pushq 	%r13
	pushq 	%r14
	pushq 	%r15
.endm

.macro POPALL
	popq	%r15
	popq 	%r14
	popq 	%r13
	popq 	%r12
	popq 	%r11
	popq 	%r10
	popq 	%r9
	popq 	%r8
	popq 	%rbp
	popq 	%rdi
	popq 	%rsi
	popq 	%rdx
	popq 	%rcx
	popq 	%rbx
	popq 	%rax
.endm

# call the exception handler with the interrupt number
# args: interrupt number
.macro ISRException num
	.align 8
isr_stub_\num:
	PUSHALL
	cld
	movq	$\num, %rdi			# exception number
	movq	$0, %rsi                # placeholder error code
	movq	%rsp, %rdx				# top of stack
	callq	idt_exception_handler
	POPALL
	iretq
.endm

# call the exception handler with the interrupt number
# these exceptions also put an error code on the stack
# args: interrupt number
.macro ISRExceptionCode num
	.align 8
isr_stub_\num:
	# retrieve the error code without corrupting registers
	mov 	%eax, isr_tmp
	popq	%rax
	mov 	%eax, isr_err_code
	movq	isr_tmp, %rax
	PUSHALL
	cld
	movq	$\num, %rdi             # exception number
	movq	isr_err_code, %rsi      # error code
	movq	%rsp, %rdx              # top of stack
	callq	idt_exception_handler
	POPALL
	iretq
.endm

.macro PICGeneric num
	.align 8
isr_stub_\num:
	PUSHALL
	cld
	movq	$\num, %rdi
	callq	idt_pic_eoi
	POPALL
	iretq
.endm

.macro PICTimer num
	.align 8
isr_stub_\num:
	PUSHALL
	cld
	callq	idt_pic_timer
	movq	$\num, %rdi
	callq	idt_pic_eoi
	POPALL
	iretq
.endm

.macro PICKeyboard num
	.align 8
isr_stub_\num:
	PUSHALL
	cld
	callq	idt_pic_keyboard
	movq	$\num, %rdi
	callq	idt_pic_eoi
	POPALL
	iretq
.endm

.macro PICMouse num
	.align 8
isr_stub_\num:
	PUSHALL
	cld
	callq	idt_pic_mouse
	movq	$\num, %rdi
	callq	idt_pic_eoi
	POPALL
	iretq
.endm

# do nothing
# args: interrupt number
.macro ISRIgnore num
	.align 8
isr_stub_\num:
	iretq
.endm

# isr temp storage
	.section .data
isr_tmp:
	.quad 0
isr_err_code:
	.quad 0

# isr stub table
	.section .rodata
	.align 16
	.code64
isr_stub_table:
	.quad isr_stub_0
	.quad isr_stub_1
	.quad isr_stub_2
	.quad isr_stub_3
	.quad isr_stub_4
	.quad isr_stub_5
	.quad isr_stub_6
	.quad isr_stub_7
	.quad isr_stub_8
	.quad isr_stub_9
	.quad isr_stub_10
	.quad isr_stub_11
	.quad isr_stub_12
	.quad isr_stub_13
	.quad isr_stub_14
	.quad isr_stub_15
	.quad isr_stub_16
	.quad isr_stub_17
	.quad isr_stub_18
	.quad isr_stub_19
	.quad isr_stub_20
	.quad isr_stub_21
	.quad isr_stub_22
	.quad isr_stub_23
	.quad isr_stub_24
	.quad isr_stub_25
	.quad isr_stub_26
	.quad isr_stub_27
	.quad isr_stub_28
	.quad isr_stub_29
	.quad isr_stub_30
	.quad isr_stub_31
	.quad isr_stub_32
	.quad isr_stub_33
	.quad isr_stub_34
	.quad isr_stub_35
	.quad isr_stub_36
	.quad isr_stub_37
	.quad isr_stub_38
	.quad isr_stub_39
	.quad isr_stub_40
	.quad isr_stub_41
	.quad isr_stub_42
	.quad isr_stub_43
	.quad isr_stub_44
	.quad isr_stub_45
	.quad isr_stub_46
	.quad isr_stub_47
	.quad isr_stub_48
	.quad isr_stub_49
	.quad isr_stub_50
	.quad isr_stub_51
	.quad isr_stub_52
	.quad isr_stub_53
	.quad isr_stub_54
	.quad isr_stub_55
	.quad isr_stub_56
	.quad isr_stub_57
	.quad isr_stub_58
	.quad isr_stub_59
	.quad isr_stub_60
	.quad isr_stub_61
	.quad isr_stub_62
	.quad isr_stub_63
	.quad isr_stub_64
	.quad isr_stub_65
	.quad isr_stub_66
	.quad isr_stub_67
	.quad isr_stub_68
	.quad isr_stub_69
	.quad isr_stub_70
	.quad isr_stub_71
	.quad isr_stub_72
	.quad isr_stub_73
	.quad isr_stub_74
	.quad isr_stub_75
	.quad isr_stub_76
	.quad isr_stub_77
	.quad isr_stub_78
	.quad isr_stub_79
	.quad isr_stub_80
	.quad isr_stub_81
	.quad isr_stub_82
	.quad isr_stub_83
	.quad isr_stub_84
	.quad isr_stub_85
	.quad isr_stub_86
	.quad isr_stub_87
	.quad isr_stub_88
	.quad isr_stub_89
	.quad isr_stub_90
	.quad isr_stub_91
	.quad isr_stub_92
	.quad isr_stub_93
	.quad isr_stub_94
	.quad isr_stub_95
	.quad isr_stub_96
	.quad isr_stub_97
	.quad isr_stub_98
	.quad isr_stub_99
	.quad isr_stub_100
	.quad isr_stub_101
	.quad isr_stub_102
	.quad isr_stub_103
	.quad isr_stub_104
	.quad isr_stub_105
	.quad isr_stub_106
	.quad isr_stub_107
	.quad isr_stub_108
	.quad isr_stub_109
	.quad isr_stub_110
	.quad isr_stub_111
	.quad isr_stub_112
	.quad isr_stub_113
	.quad isr_stub_114
	.quad isr_stub_115
	.quad isr_stub_116
	.quad isr_stub_117
	.quad isr_stub_118
	.quad isr_stub_119
	.quad isr_stub_120
	.quad isr_stub_121
	.quad isr_stub_122
	.quad isr_stub_123
	.quad isr_stub_124
	.quad isr_stub_125
	.quad isr_stub_126
	.quad isr_stub_127
	.quad isr_stub_128
	.quad isr_stub_129
	.quad isr_stub_130
	.quad isr_stub_131
	.quad isr_stub_132
	.quad isr_stub_133
	.quad isr_stub_134
	.quad isr_stub_135
	.quad isr_stub_136
	.quad isr_stub_137
	.quad isr_stub_138
	.quad isr_stub_139
	.quad isr_stub_140
	.quad isr_stub_141
	.quad isr_stub_142
	.quad isr_stub_143
	.quad isr_stub_144
	.quad isr_stub_145
	.quad isr_stub_146
	.quad isr_stub_147
	.quad isr_stub_148
	.quad isr_stub_149
	.quad isr_stub_150
	.quad isr_stub_151
	.quad isr_stub_152
	.quad isr_stub_153
	.quad isr_stub_154
	.quad isr_stub_155
	.quad isr_stub_156
	.quad isr_stub_157
	.quad isr_stub_158
	.quad isr_stub_159
	.quad isr_stub_160
	.quad isr_stub_161
	.quad isr_stub_162
	.quad isr_stub_163
	.quad isr_stub_164
	.quad isr_stub_165
	.quad isr_stub_166
	.quad isr_stub_167
	.quad isr_stub_168
	.quad isr_stub_169
	.quad isr_stub_170
	.quad isr_stub_171
	.quad isr_stub_172
	.quad isr_stub_173
	.quad isr_stub_174
	.quad isr_stub_175
	.quad isr_stub_176
	.quad isr_stub_177
	.quad isr_stub_178
	.quad isr_stub_179
	.quad isr_stub_180
	.quad isr_stub_181
	.quad isr_stub_182
	.quad isr_stub_183
	.quad isr_stub_184
	.quad isr_stub_185
	.quad isr_stub_186
	.quad isr_stub_187
	.quad isr_stub_188
	.quad isr_stub_189
	.quad isr_stub_190
	.quad isr_stub_191
	.quad isr_stub_192
	.quad isr_stub_193
	.quad isr_stub_194
	.quad isr_stub_195
	.quad isr_stub_196
	.quad isr_stub_197
	.quad isr_stub_198
	.quad isr_stub_199
	.quad isr_stub_200
	.quad isr_stub_201
	.quad isr_stub_202
	.quad isr_stub_203
	.quad isr_stub_204
	.quad isr_stub_205
	.quad isr_stub_206
	.quad isr_stub_207
	.quad isr_stub_208
	.quad isr_stub_209
	.quad isr_stub_210
	.quad isr_stub_211
	.quad isr_stub_212
	.quad isr_stub_213
	.quad isr_stub_214
	.quad isr_stub_215
	.quad isr_stub_216
	.quad isr_stub_217
	.quad isr_stub_218
	.quad isr_stub_219
	.quad isr_stub_220
	.quad isr_stub_221
	.quad isr_stub_222
	.quad isr_stub_223
	.quad isr_stub_224
	.quad isr_stub_225
	.quad isr_stub_226
	.quad isr_stub_227
	.quad isr_stub_228
	.quad isr_stub_229
	.quad isr_stub_230
	.quad isr_stub_231
	.quad isr_stub_232
	.quad isr_stub_233
	.quad isr_stub_234
	.quad isr_stub_235
	.quad isr_stub_236
	.quad isr_stub_237
	.quad isr_stub_238
	.quad isr_stub_239
	.quad isr_stub_240
	.quad isr_stub_241
	.quad isr_stub_242
	.quad isr_stub_243
	.quad isr_stub_244
	.quad isr_stub_245
	.quad isr_stub_246
	.quad isr_stub_247
	.quad isr_stub_248
	.quad isr_stub_249
	.quad isr_stub_250
	.quad isr_stub_251
	.quad isr_stub_252
	.quad isr_stub_253
	.quad isr_stub_254
	.quad isr_stub_255

# isr stubs
	.section .text
	.code64

ISRException 0
ISRException 1
ISRException 2
ISRException 3
ISRException 4
ISRException 5
ISRException 6
ISRException 7
ISRExceptionCode 8
ISRException 9
ISRExceptionCode 10
ISRExceptionCode 11
ISRExceptionCode 12
ISRExceptionCode 13
ISRExceptionCode 14
ISRException 15
ISRException 16
ISRExceptionCode 17
ISRException 18
ISRException 19
ISRException 20
ISRExceptionCode 21
ISRException 22
ISRException 23
ISRException 24
ISRException 25
ISRException 26
ISRException 27
ISRException 28
ISRExceptionCode 29
ISRExceptionCode 30
ISRException 31

PICTimer    32 # 0
PICKeyboard 33 # 1
PICGeneric  34 # 2
PICGeneric  35 # 3
PICGeneric  36 # 4
PICGeneric  37 # 5
PICGeneric  38 # 6
PICGeneric  39 # 7
PICGeneric  40 # 8
PICGeneric  41 # 9
PICGeneric  42 # 10
PICGeneric  43 # 11
PICMouse    44 # 12
PICGeneric  45 # 13
PICGeneric  46 # 14
PICGeneric  47 # 15

ISRIgnore 48
ISRIgnore 49
ISRIgnore 50
ISRIgnore 51
ISRIgnore 52
ISRIgnore 53
ISRIgnore 54
ISRIgnore 55
ISRIgnore 56
ISRIgnore 57
ISRIgnore 58
ISRIgnore 59
ISRIgnore 60
ISRIgnore 61
ISRIgnore 62
ISRIgnore 63
ISRIgnore 64
ISRIgnore 65
ISRIgnore 66
ISRIgnore 67
ISRIgnore 68
ISRIgnore 69
ISRIgnore 70
ISRIgnore 71
ISRIgnore 72
ISRIgnore 73
ISRIgnore 74
ISRIgnore 75
ISRIgnore 76
ISRIgnore 77
ISRIgnore 78
ISRIgnore 79
ISRIgnore 80
ISRIgnore 81
ISRIgnore 82
ISRIgnore 83
ISRIgnore 84
ISRIgnore 85
ISRIgnore 86
ISRIgnore 87
ISRIgnore 88
ISRIgnore 89
ISRIgnore 90
ISRIgnore 91
ISRIgnore 92
ISRIgnore 93
ISRIgnore 94
ISRIgnore 95
ISRIgnore 96
ISRIgnore 97
ISRIgnore 98
ISRIgnore 99
ISRIgnore 100
ISRIgnore 101
ISRIgnore 102
ISRIgnore 103
ISRIgnore 104
ISRIgnore 105
ISRIgnore 106
ISRIgnore 107
ISRIgnore 108
ISRIgnore 109
ISRIgnore 110
ISRIgnore 111
ISRIgnore 112
ISRIgnore 113
ISRIgnore 114
ISRIgnore 115
ISRIgnore 116
ISRIgnore 117
ISRIgnore 118
ISRIgnore 119
ISRIgnore 120
ISRIgnore 121
ISRIgnore 122
ISRIgnore 123
ISRIgnore 124
ISRIgnore 125
ISRIgnore 126
ISRIgnore 127
ISRIgnore 128
ISRIgnore 129
ISRIgnore 130
ISRIgnore 131
ISRIgnore 132
ISRIgnore 133
ISRIgnore 134
ISRIgnore 135
ISRIgnore 136
ISRIgnore 137
ISRIgnore 138
ISRIgnore 139
ISRIgnore 140
ISRIgnore 141
ISRIgnore 142
ISRIgnore 143
ISRIgnore 144
ISRIgnore 145
ISRIgnore 146
ISRIgnore 147
ISRIgnore 148
ISRIgnore 149
ISRIgnore 150
ISRIgnore 151
ISRIgnore 152
ISRIgnore 153
ISRIgnore 154
ISRIgnore 155
ISRIgnore 156
ISRIgnore 157
ISRIgnore 158
ISRIgnore 159
ISRIgnore 160
ISRIgnore 161
ISRIgnore 162
ISRIgnore 163
ISRIgnore 164
ISRIgnore 165
ISRIgnore 166
ISRIgnore 167
ISRIgnore 168
ISRIgnore 169
ISRIgnore 170
ISRIgnore 171
ISRIgnore 172
ISRIgnore 173
ISRIgnore 174
ISRIgnore 175
ISRIgnore 176
ISRIgnore 177
ISRIgnore 178
ISRIgnore 179
ISRIgnore 180
ISRIgnore 181
ISRIgnore 182
ISRIgnore 183
ISRIgnore 184
ISRIgnore 185
ISRIgnore 186
ISRIgnore 187
ISRIgnore 188
ISRIgnore 189
ISRIgnore 190
ISRIgnore 191
ISRIgnore 192
ISRIgnore 193
ISRIgnore 194
ISRIgnore 195
ISRIgnore 196
ISRIgnore 197
ISRIgnore 198
ISRIgnore 199
ISRIgnore 200
ISRIgnore 201
ISRIgnore 202
ISRIgnore 203
ISRIgnore 204
ISRIgnore 205
ISRIgnore 206
ISRIgnore 207
ISRIgnore 208
ISRIgnore 209
ISRIgnore 210
ISRIgnore 211
ISRIgnore 212
ISRIgnore 213
ISRIgnore 214
ISRIgnore 215
ISRIgnore 216
ISRIgnore 217
ISRIgnore 218
ISRIgnore 219
ISRIgnore 220
ISRIgnore 221
ISRIgnore 222
ISRIgnore 223
ISRIgnore 224
ISRIgnore 225
ISRIgnore 226
ISRIgnore 227
ISRIgnore 228
ISRIgnore 229
ISRIgnore 230
ISRIgnore 231
ISRIgnore 232
ISRIgnore 233
ISRIgnore 234
ISRIgnore 235
ISRIgnore 236
ISRIgnore 237
ISRIgnore 238
ISRIgnore 239
ISRIgnore 240
ISRIgnore 241
ISRIgnore 242
ISRIgnore 243
ISRIgnore 244
ISRIgnore 245
ISRIgnore 246
ISRIgnore 247
ISRIgnore 248
ISRIgnore 249
ISRIgnore 250
ISRIgnore 251
ISRIgnore 252
ISRIgnore 253
ISRIgnore 254
ISRIgnore 255