foo
[eightysix] / kern / src / intr.h
1 #ifndef INTR_H_
2 #define INTR_H_
3
4 #include <inttypes.h>
5 #include "asmutil.h"
6
7 #define IRQ_TO_INUM(x)  ((x) + 8)
8 #define INUM_TO_IRQ(x)  ((x) - 8)
9
10 /* general purpose registers, pushed by interrupt entry routine */
11 struct registers {
12         uint16_t di, si, bp, sp;
13         uint16_t bx, dx, cx, ax;
14 } __attribute__((packed));
15
16 struct intr_frame {
17         /* registers pushed by intr_entry_* */
18         struct registers regs;
19         /* interrupt number */
20         uint16_t inum;
21         /* pushed by CPU during interrupt entry */
22         uint16_t ip, cs, flags;
23 } __attribute__((packed));
24
25 typedef void (*intr_func_t)(struct intr_frame *frm);
26
27 void init_intr(void);
28 void dispatch_intr(struct intr_frame frm);
29
30 /* set low level interrupt vector */
31 void set_intr_vect(int n, uint16_t seg, uint16_t offs);
32 /* set interrupt callback */
33 void set_intr(int n, intr_func_t func);
34
35 void mask_irq(int n);
36 void unmask_irq(int n);
37
38 #define end_of_irq(n) \
39         asm volatile( \
40                 "\n\ttest $8, %0" \
41                 "\n\tjz 0f" \
42                 "\n\tmov $0x20, %%ax" \
43                 "\n\tout %%ax, $0xa0" \
44                 "\n0:\tmov $0x20, %%ax" \
45                 "\n\tout %%ax, $0x20" \
46                 :: "a"(n))
47
48 #endif  /* INTR_H_ */