-
Notifications
You must be signed in to change notification settings - Fork 2
/
isr_handler.asm
427 lines (357 loc) · 5.6 KB
/
isr_handler.asm
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
section .text
; Defined in isr.c
[extern irq_wrapper_handler]
[extern isr_wrapper_handler]
; Common ISR code
isr_common_stub:
; 1. Save CPU state
; Pushes edi,esi,ebp,ebx,edx,ecx,eax
push eax
push ecx
push edx
push ebx
push ebp
push esi
push edi
mov ax, ds ; Lower 16-bits of eax = ds.
push eax ; save the data segment descriptor
mov ax, 0x10 ; kernel data segment descriptor
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
; push pointer to interrupt_registers on stack
push esp
; 2. Call C handler
call isr_wrapper_handler
; set new esp
mov esp, eax
; 3. Restore state
pop eax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
pop edi
pop esi
pop ebp
pop ebx
pop edx
pop ecx
pop eax
add esp, 8 ; Cleans up the pushed error code and pushed ISR number
;sti
iret ; pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP
; Common IRQ code. Identical to ISR code except for the 'call'
; and the 'pop ebx'
irq_common_stub:
; Pushes edi,esi,ebp,ebx,edx,ecx,eax
push eax
push ecx
push edx
push ebx
push ebp
push esi
push edi
mov ax, ds
push eax
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
; push pointer to interrupt_registers on stack
push esp
call irq_wrapper_handler ; Different than the ISR code
; set new esp
mov esp, eax
pop ebx ; Different than the ISR code
mov ds, bx
mov es, bx
mov fs, bx
mov gs, bx
pop edi
pop esi
pop ebp
pop ebx
pop edx
pop ecx
pop eax
add esp, 8
;sti
iret
; We don't get information about which interrupt was caller
; when the handler is run, so we will need to have a different handler
; for every interrupt.
; Furthermore, some interrupts push an error code onto the stack but others
; don't, so we will push a dummy error code for those which don't, so that
; we have a consistent stack for all of them.
; First make the ISRs global
global isr0
global isr1
global isr2
global isr3
global isr4
global isr5
global isr6
global isr7
global isr8
global isr9
global isr10
global isr11
global isr12
global isr13
global isr14
global isr15
global isr16
global isr17
global isr18
global isr19
global isr20
global isr21
global isr22
global isr23
global isr24
global isr25
global isr26
global isr27
global isr28
global isr29
global isr30
global isr31
; IRQs
global irq0
global irq1
global irq2
global irq3
global irq4
global irq5
global irq6
global irq7
global irq8
global irq9
global irq10
global irq11
global irq12
global irq13
global irq14
global irq15
; 0: Divide By Zero Exception
isr0:
push byte 0
push byte 0
jmp isr_common_stub
; 1: Debug Exception
isr1:
push byte 0
push byte 1
jmp isr_common_stub
; 2: Non Maskable Interrupt Exception
isr2:
push byte 0
push byte 2
jmp isr_common_stub
; 3: Int 3 Exception
isr3:
push byte 0
push byte 3
jmp isr_common_stub
; 4: INTO Exception
isr4:
push byte 0
push byte 4
jmp isr_common_stub
; 5: Out of Bounds Exception
isr5:
push byte 0
push byte 5
jmp isr_common_stub
; 6: Invalid Opcode Exception
isr6:
push byte 0
push byte 6
jmp isr_common_stub
; 7: Coprocessor Not Available Exception
isr7:
push byte 0
push byte 7
jmp isr_common_stub
; 8: Double Fault Exception (With Error Code!)
isr8:
push byte 8
jmp isr_common_stub
; 9: Coprocessor Segment Overrun Exception
isr9:
push byte 0
push byte 9
jmp isr_common_stub
; 10: Bad TSS Exception (With Error Code!)
isr10:
push byte 10
jmp isr_common_stub
; 11: Segment Not Present Exception (With Error Code!)
isr11:
push byte 11
jmp isr_common_stub
; 12: Stack Fault Exception (With Error Code!)
isr12:
push byte 12
jmp isr_common_stub
; 13: General Protection Fault Exception (With Error Code!)
isr13:
push byte 13
jmp isr_common_stub
; 14: Page Fault Exception (With Error Code!)
isr14:
push byte 14
jmp isr_common_stub
; 15: Reserved Exception
isr15:
push byte 0
push byte 15
jmp isr_common_stub
; 16: Floating Point Exception
isr16:
push byte 0
push byte 16
jmp isr_common_stub
; 17: Alignment Check Exception
isr17:
push byte 0
push byte 17
jmp isr_common_stub
; 18: Machine Check Exception
isr18:
push byte 0
push byte 18
jmp isr_common_stub
; 19: Reserved
isr19:
push byte 0
push byte 19
jmp isr_common_stub
; 20: Reserved
isr20:
push byte 0
push byte 20
jmp isr_common_stub
; 21: Reserved
isr21:
push byte 0
push byte 21
jmp isr_common_stub
; 22: Reserved
isr22:
push byte 0
push byte 22
jmp isr_common_stub
; 23: Reserved
isr23:
push byte 0
push byte 23
jmp isr_common_stub
; 24: Reserved
isr24:
push byte 0
push byte 24
jmp isr_common_stub
; 25: Reserved
isr25:
push byte 0
push byte 25
jmp isr_common_stub
; 26: Reserved
isr26:
push byte 0
push byte 26
jmp isr_common_stub
; 27: Reserved
isr27:
push byte 0
push byte 27
jmp isr_common_stub
; 28: Reserved
isr28:
push byte 0
push byte 28
jmp isr_common_stub
; 29: Reserved
isr29:
push byte 0
push byte 29
jmp isr_common_stub
; 30: Reserved
isr30:
push byte 0
push byte 30
jmp isr_common_stub
; 31: Reserved
isr31:
push byte 0
push byte 31
jmp isr_common_stub
; IRQ handlers
irq0:
push byte 0
push byte 32
jmp irq_common_stub
irq1:
push byte 0
push byte 33
jmp irq_common_stub
irq2:
push byte 0
push byte 34
jmp irq_common_stub
irq3:
push byte 0
push byte 35
jmp irq_common_stub
irq4:
push byte 0
push byte 36
jmp irq_common_stub
irq5:
push byte 0
push byte 37
jmp irq_common_stub
irq6:
push byte 0
push byte 38
jmp irq_common_stub
irq7:
push byte 0
push byte 39
jmp irq_common_stub
irq8:
push byte 0
push byte 40
jmp irq_common_stub
irq9:
push byte 0
push byte 41
jmp irq_common_stub
irq10:
push byte 0
push byte 42
jmp irq_common_stub
irq11:
push byte 0
push byte 43
jmp irq_common_stub
irq12:
push byte 0
push byte 44
jmp irq_common_stub
irq13:
push byte 0
push byte 45
jmp irq_common_stub
irq14:
push byte 0
push byte 46
jmp irq_common_stub
irq15:
push byte 0
push byte 47
jmp irq_common_stub