nckernel  0.1
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
idt.c
Go to the documentation of this file.
1 #include <slibc.h>
2 #include <sys/types.h>
3 #include <stdio.h>
4 #include <string.h>
5 #include <stddef.h>
6 
7 #include <segment.h>
8 #include <idt.h>
9 
10 #define INSTALL_ISR(idt, t, ptr) do { \
11  (idt).p = IDT_SEGMENT_PRESENT; \
12  (idt).dpl = IDT_KERNEL; \
13  (idt).type = (t); \
14  (idt).d = SIZE32; \
15  (idt).selector = ((DESC_KERNEL_CS << SIZEOF_A_DESC_BIT) | TI(GDT) | KERNEL); \
16  (idt).offset0 = LOW16((unsigned long)ptr); \
17  (idt).offset1 = HIGH16((unsigned long)ptr); \
18 } while (0)
19 
20 #define INSTALL_USER_ISR(idt, t, ptr) do { \
21  (idt).p = IDT_SEGMENT_PRESENT; \
22  (idt).dpl = IDT_USER; \
23  (idt).type = (t); \
24  (idt).d = SIZE32; \
25  (idt).selector = ((DESC_KERNEL_CS << SIZEOF_A_DESC_BIT) | TI(GDT) | KERNEL); \
26  (idt).offset0 = LOW16((unsigned long)ptr); \
27  (idt).offset1 = HIGH16((unsigned long)ptr); \
28 } while (0)
29 
30 static struct interrupt_gate s_idt[IDT_MAX_ENTRY];
31 
32 
33 void isr_div_error(void);
34 void isr_debug(void);
35 void isr_nmi(void);
36 
37 void isr_breakpoint(void);
38 void isr_overflow(void);
39 void isr_bound(void);
40 void isr_invalid_opcode(void);
41 void isr_device(void);
42 void isr_double_fault(void);
43 void isr_coprocessor(void);
44 
45 void isr_invalid_tss(void);
46 void isr_seg_not_present(void);
47 void isr_stack_seg_fault(void);
48 void isr_general_protection(void);
49 void isr_page_fault(void);
50 
51 void isr_math_fault(void);
52 void isr_alignment_check(void);
53 void isr_machine_check(void);
54 void isr_simd_floating(void);
55 
56 void isr_timer(void);
57 void isr_keyboard(void);
58 void isr_irq2(void);
59 void isr_dummy(void);
60 void isr_fdc(void);
61 void isr_rtc(void);
62 void isr_binder(void);
63 void isr_hdc(void);
64 void isr_dummy(void);
65 void isr_sw(void);
66 
67 void interrupt_init(void)
68 {
69  struct idtr idtr;
70 
71  memset(s_idt, 0, sizeof(s_idt[0]) * IDT_MAX_ENTRY);
72  INSTALL_ISR(s_idt[0], TRAP, isr_div_error);
73  INSTALL_ISR(s_idt[1], TRAP, isr_debug);
74  INSTALL_ISR(s_idt[2], INTERRUPT, isr_nmi);
75  INSTALL_ISR(s_idt[3], TRAP, isr_breakpoint);
76  INSTALL_ISR(s_idt[4], TRAP, isr_overflow);
77  INSTALL_ISR(s_idt[5], TRAP, isr_bound);
79  INSTALL_ISR(s_idt[7], TRAP, isr_device);
80  INSTALL_ISR(s_idt[8], TRAP, isr_double_fault);
81  INSTALL_ISR(s_idt[9], TRAP, isr_coprocessor);
82 
83  INSTALL_ISR(s_idt[10], TRAP, isr_invalid_tss);
87  INSTALL_ISR(s_idt[14], TRAP, isr_page_fault);
88 
89  /* 15 */
90 
91  INSTALL_ISR(s_idt[16], TRAP, isr_math_fault);
93  INSTALL_ISR(s_idt[18], TRAP, isr_machine_check);
94  INSTALL_ISR(s_idt[19], TRAP, isr_simd_floating);
95 
96  /* 20 ~ 31 reserved */
97 
98  /* PIC1 mapped to 32 ~ 40, 34 is IRQ binder -> PIC2 */
99  /* IRQ0 Sysmtem Timer */
100  INSTALL_ISR(s_idt[32], INTERRUPT, isr_timer);
101  /* IRQ1 Keyboard */
102  INSTALL_ISR(s_idt[33], INTERRUPT, isr_keyboard);
103  /* IRQ2 Redirectd */
104  INSTALL_ISR(s_idt[34], INTERRUPT, isr_irq2);
105  /* IRQ3 Serial port */
106  INSTALL_ISR(s_idt[35], INTERRUPT, isr_dummy);
107  /* IRQ4 Serial port */
108  INSTALL_ISR(s_idt[36], INTERRUPT, isr_dummy);
109  /* IRQ5 Reserved/Soundcard */
110  INSTALL_ISR(s_idt[37], INTERRUPT, isr_dummy);
111  /* IRQ6 Floppy */
112  INSTALL_ISR(s_idt[38], INTERRUPT, isr_fdc);
113  /* IRQ7 Parallel */
114  INSTALL_ISR(s_idt[39], INTERRUPT, isr_dummy);
115  /* IRQ8 RTC */
116  INSTALL_ISR(s_idt[40], INTERRUPT, isr_rtc);
117  /* IRQ9 Redirectd */
118  INSTALL_ISR(s_idt[41], INTERRUPT, isr_binder);
119  /* IRQ10 - Reserved */
120  INSTALL_ISR(s_idt[42], INTERRUPT, isr_dummy);
121  /* IRQ11 - Reserved */
122  INSTALL_ISR(s_idt[43], INTERRUPT, isr_dummy);
123  /* IRQ12 - Mouse (PS/2) */
124  INSTALL_ISR(s_idt[44], INTERRUPT, isr_dummy);
125  /* IRQ13 - Math */
126  INSTALL_ISR(s_idt[45], INTERRUPT, isr_dummy);
127  /* IRQ14 - HDC */
128  INSTALL_ISR(s_idt[46], INTERRUPT, isr_hdc);
129  /* IRQ15 - Reserved */
130  INSTALL_ISR(s_idt[47], INTERRUPT, isr_dummy);
131  /* 48 - Reserved */
132  INSTALL_USER_ISR(s_idt[49], TRAP, isr_sw);
133 
134  idtr.limit = (sizeof(s_idt[0]) << IDT_MAX_BIT) - 1;
135  idtr.base = (unsigned long)s_idt;
136 
137  asm volatile("lidt (%0)"::"g"(&idtr));
138 }
139 
140 /* End of a file */
141