foo
[eightysix] / kern / src / intr.c
1 #include "intr.h"
2
3 /* PIC command and data ports */
4 #define PIC1_CMD        0x20
5 #define PIC1_DATA       0x21
6 #define PIC2_CMD        0xa0
7 #define PIC2_DATA       0xa1
8
9 /* PIC initialization command word 1 bits */
10 #define ICW1_ICW4_NEEDED        (1 << 0)
11 #define ICW1_SINGLE                     (1 << 1)
12 #define ICW1_INTERVAL4          (1 << 2)
13 #define ICW1_LEVEL                      (1 << 3)
14 #define ICW1_INIT                       (1 << 4)
15 /* PIC initialization command word 4 bits */
16 #define ICW4_8086                       (1 << 0)
17 #define ICW4_AUTO_EOI           (1 << 1)
18 #define ICW4_BUF_SLAVE          (1 << 3) /* 1000 */
19 #define ICW4_BUF_MASTER         (3 << 2) /* 1100 */
20 #define ICW4_SPECIAL            (1 << 4)
21 /* PIC operation command word 2 bits */
22 #define OCW2_EOI        (1 << 5)
23
24
25 #define MAX_INTR        32
26 static intr_func_t intrfunc[MAX_INTR];
27
28 static void (*intr_unhandled)(struct intr_frame *frm);
29
30 void intr_entry_div();
31 void intr_entry_trap();
32 void intr_entry_nmi();
33 void intr_entry_break();
34 void intr_entry_ovf();
35 void intr_entry_bound();
36 void intr_entry_ill();
37 void intr_entry_irq0();
38 void intr_entry_irq1();
39 void intr_entry_irq2();
40 void intr_entry_irq3();
41 void intr_entry_irq4();
42 void intr_entry_irq5();
43 void intr_entry_irq6();
44 void intr_entry_irq7();
45
46 extern int _kern_start_seg;
47 #define KERN_CS ((uint16_t)(&_kern_start_seg))
48
49
50 void init_intr(void)
51 {
52         int i;
53
54         for(i=0; i<MAX_INTR; i++) {
55                 intrfunc[i] = 0;
56         }
57
58         set_intr_vect(0, KERN_CS, (uint16_t)intr_entry_div);
59 }
60
61 void dispatch_intr(struct intr_frame frm)
62 {
63         intrfunc[frm.inum](&frm);
64 }
65
66 void set_intr_vect(int n, uint16_t seg, uint16_t offs)
67 {
68         uint16_t *ivt = 0;
69
70         ivt[n * 4] = offs;
71         ivt[n * 4 + 1] = seg;
72 }
73
74 void set_intr(int n, intr_func_t func)
75 {
76         intrfunc[n] = func;
77 }
78
79 void mask_irq(int n)
80 {
81         int port;
82         unsigned char mask;
83
84         if(n < 8) {
85                 port = PIC1_DATA;
86         } else {
87                 port = PIC2_DATA;
88                 n -= 8;
89         }
90
91         mask = inp(port) | (1 << n);
92         outp(port, mask);
93 }
94
95 void unmask_irq(int n)
96 {
97         int port;
98         unsigned char mask;
99
100         if(n < 8) {
101                 port = PIC1_DATA;
102         } else {
103                 port = PIC2_DATA;
104                 n -= 8;
105         }
106
107         mask = inp(port) & ~(1 << n);
108         outp(port, mask);
109 }