dd35095c2aa7f7490a12df71ef419edb278135c6
[3sys] / sys1 / kern / src / intr.asm
1         bits 32
2         section .text
3
4         extern intr_handler
5
6 PIC1_CMD_PORT   equ 0x20
7 PIC2_CMD_PORT   equ 0xa0
8 OCW2_EOI        equ 0x20
9 OCW3_ISR        equ 0x0b
10
11         global set_idt
12 set_idt:
13         mov eax, [esp + 4]
14         mov [idtbase], eax
15         mov ax, [esp + 8]
16         mov [idtlim], ax
17         lidt [idtlim]
18         ret
19
20         align 4
21         dw 0
22 idtlim  dw 0
23 idtbase dd 0
24
25
26         ; special entry point for IRQ7 to catch and disregard spurious interrupts
27         global intr_entry_irq7_verify
28 intr_entry_irq7_verify:
29         push eax
30         mov al, OCW3_ISR
31         out PIC1_CMD_PORT, al
32         in al, PIC1_CMD_PORT
33         and al, 0x80
34         pop eax
35         jnz intr_entry_irq7
36         iret
37
38         global intr_entry_irq15_verify
39 intr_entry_irq15_verify:
40         ; similarly for IRQ15
41         push eax
42         mov al, OCW3_ISR
43         out PIC2_CMD_PORT, al
44         in al, PIC2_CMD_PORT
45         and al, 0x80
46         jnz .valid
47         ; it was spurious, send EOI to master PIC and iret
48         mov al, OCW2_EOI
49         out PIC1_CMD_PORT, al
50         pop eax
51         iret
52 .valid: pop eax
53         jmp intr_entry_irq15
54
55
56 %macro intr_entry_err 2
57 intr_entry_%2:
58         push dword %1   ; push interrupt number
59         jmp intr_entry_common
60 %endmacro
61
62 %macro intr_entry_noerr 2
63 intr_entry_%2:
64         push dword 0    ; push dummy error code
65         push dword %1   ; push interrupt number
66         jmp intr_entry_common
67 %endmacro
68
69 intr_entry_common:
70         pusha           ; save general purpose registers
71         call intr_handler
72         popa            ; restore general purpose registers
73         add esp, 8      ; remove error code and intr number from the stack
74         iret
75
76         ; interrupt entry points
77         intr_entry_noerr 0, div
78         intr_entry_noerr 1, debug
79         intr_entry_noerr 2, nmi
80         intr_entry_noerr 3, bpt
81         intr_entry_noerr 4, ovf
82         intr_entry_noerr 5, bound
83         intr_entry_noerr 6, ill
84         intr_entry_noerr 7, nodev
85         intr_entry_err 8, dbl
86         intr_entry_noerr 9, copseg
87         intr_entry_err 10, tss
88         intr_entry_err 11, segpres
89         intr_entry_err 12, stack
90         intr_entry_err 13, prot
91         intr_entry_err 14, page
92         intr_entry_noerr 15, rsvd
93         intr_entry_noerr 16, fpu
94         intr_entry_err 17, align
95         intr_entry_noerr 18, mce
96         intr_entry_noerr 19, sse
97         ; remapped IRQs 0-15 -> 32-47
98         intr_entry_noerr 32, irq0
99         intr_entry_noerr 33, irq1
100         intr_entry_noerr 34, irq2
101         intr_entry_noerr 35, irq3
102         intr_entry_noerr 36, irq4
103         intr_entry_noerr 37, irq5
104         intr_entry_noerr 38, irq6
105         intr_entry_noerr 39, irq7
106         intr_entry_noerr 40, irq8
107         intr_entry_noerr 41, irq9
108         intr_entry_noerr 42, irq10
109         intr_entry_noerr 43, irq11
110         intr_entry_noerr 44, irq12
111         intr_entry_noerr 45, irq13
112         intr_entry_noerr 46, irq14
113         intr_entry_noerr 47, irq15
114         ; default handler
115         intr_entry_noerr 255, default
116
117 ; vi:ft=nasm: