/
isrs.c
142 lines (134 loc) · 4.02 KB
/
isrs.c
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
#include "idt.h"
#include "base.h"
#include "asm.h"
#include "terminal.h"
#include "system.h"
extern void _isr0();
extern void _isr1();
extern void _isr2();
extern void _isr3();
extern void _isr4();
extern void _isr5();
extern void _isr6();
extern void _isr7();
extern void _isr8();
extern void _isr9();
extern void _isr10();
extern void _isr11();
extern void _isr12();
extern void _isr13();
extern void _isr14();
extern void _isr15();
extern void _isr16();
extern void _isr17();
extern void _isr18();
extern void _isr19();
extern void _isr20();
extern void _isr21();
extern void _isr22();
extern void _isr23();
extern void _isr24();
extern void _isr25();
extern void _isr26();
extern void _isr27();
extern void _isr28();
extern void _isr29();
extern void _isr30();
extern void _isr31();
extern void _isr32();
extern void _isr33();
void isrs_install()
{
idt_set_gate(0, KERNEL_CODE_SELECTOR, (uint32_t)&_isr0, 0x8E);
idt_set_gate(1, KERNEL_CODE_SELECTOR, (uint32_t)&_isr1, 0x8E);
idt_set_gate(2, KERNEL_CODE_SELECTOR, (uint32_t)&_isr2, 0x8E);
idt_set_gate(3, KERNEL_CODE_SELECTOR, (uint32_t)&_isr3, 0x8E);
idt_set_gate(4, KERNEL_CODE_SELECTOR, (uint32_t)&_isr4, 0x8E);
idt_set_gate(5, KERNEL_CODE_SELECTOR, (uint32_t)&_isr5, 0x8E);
idt_set_gate(6, KERNEL_CODE_SELECTOR, (uint32_t)&_isr6, 0x8E);
idt_set_gate(7, KERNEL_CODE_SELECTOR, (uint32_t)&_isr7, 0x8E);
idt_set_gate(8, KERNEL_CODE_SELECTOR, (uint32_t)&_isr8, 0x8E);
idt_set_gate(9, KERNEL_CODE_SELECTOR, (uint32_t)&_isr9, 0x8E);
idt_set_gate(10, KERNEL_CODE_SELECTOR, (uint32_t)&_isr10, 0x8E);
idt_set_gate(11, KERNEL_CODE_SELECTOR, (uint32_t)&_isr11, 0x8E);
idt_set_gate(12, KERNEL_CODE_SELECTOR, (uint32_t)&_isr12, 0x8E);
idt_set_gate(13, KERNEL_CODE_SELECTOR, (uint32_t)&_isr13, 0x8E);
idt_set_gate(14, KERNEL_CODE_SELECTOR, (uint32_t)&_isr14, 0x8E);
idt_set_gate(15, KERNEL_CODE_SELECTOR, (uint32_t)&_isr15, 0x8E);
idt_set_gate(16, KERNEL_CODE_SELECTOR, (uint32_t)&_isr16, 0x8E);
idt_set_gate(17, KERNEL_CODE_SELECTOR, (uint32_t)&_isr17, 0x8E);
idt_set_gate(18, KERNEL_CODE_SELECTOR, (uint32_t)&_isr18, 0x8E);
idt_set_gate(19, KERNEL_CODE_SELECTOR, (uint32_t)&_isr19, 0x8E);
idt_set_gate(20, KERNEL_CODE_SELECTOR, (uint32_t)&_isr20, 0x8E);
idt_set_gate(21, KERNEL_CODE_SELECTOR, (uint32_t)&_isr21, 0x8E);
idt_set_gate(22, KERNEL_CODE_SELECTOR, (uint32_t)&_isr22, 0x8E);
idt_set_gate(23, KERNEL_CODE_SELECTOR, (uint32_t)&_isr23, 0x8E);
idt_set_gate(24, KERNEL_CODE_SELECTOR, (uint32_t)&_isr24, 0x8E);
idt_set_gate(25, KERNEL_CODE_SELECTOR, (uint32_t)&_isr25, 0x8E);
idt_set_gate(26, KERNEL_CODE_SELECTOR, (uint32_t)&_isr26, 0x8E);
idt_set_gate(27, KERNEL_CODE_SELECTOR, (uint32_t)&_isr27, 0x8E);
idt_set_gate(28, KERNEL_CODE_SELECTOR, (uint32_t)&_isr28, 0x8E);
idt_set_gate(29, KERNEL_CODE_SELECTOR, (uint32_t)&_isr29, 0x8E);
idt_set_gate(30, KERNEL_CODE_SELECTOR, (uint32_t)&_isr30, 0x8E);
idt_set_gate(31, KERNEL_CODE_SELECTOR, (uint32_t)&_isr31, 0x8E);
idt_set_gate(32, KERNEL_CODE_SELECTOR, (uint32_t)&_isr33, 0x8E);
}
void idt_install()
{
idt_load();
isrs_install();
irq_install();
sti();
}
const char *exception_messages[] =
{
"Division By Zero",
"Debug Exception",
"No maskable Exception",
"Breakpoint Exception",
"Overflow Exception",
"Out of Bounds Exception",
"Invalid Opcode Exception",
"No Coprocessor Exception",
"Double Fault Exception",
"Coprocessor Segment Overrun Exception",
"Bad TSS Exception",
"Segment Not Present",
"Stack fault Exception",
"General protection",
"Page fault",
"Unkonw",
"Coproessor Fault Exception",
"Align Check Exception",
"Machine Check Exception",
"Resverd"
"Resverd"
"Resverd"
"Resverd"
"Resverd"
"Resverd"
"Resverd"
"Resverd"
"Resverd"
"Resverd"
"Resverd"
"Resverd"
"Resverd"
};
void fault_handler(struct idt_info* ptr)
{
if (ptr->code < 32)
{
die("fault_handler:%s, code=%d, error=%d\n",
exception_messages[ptr->code],
ptr->code, ptr->error);
}
switch (ptr->code)
{
default:
{
terminal_printf("defualt isr handler:code=%d, error=%d\n",
ptr->code, ptr->error);
}
}
}