27
27
#include <sys/protect.h>
28
28
#include <sys/irpts.h>
29
29
30
- static void FATAL (const char * str , struct irpt_regs * regs ) {
30
+ static void FATAL (const char * str , uint32_t errcode , struct irpt_regs * regs ) {
31
+ printk ("current:%x\n" , regs );
31
32
printk ("EIP: %x:%x\nEFLAGS: %x\nESP: %x:%x\n" ,
32
33
regs -> cs , regs -> eip , regs -> eflags , regs -> es , regs -> uesp );
34
+ printk ("ES:%x\n" , regs -> es );
33
35
for (;;) ;
34
36
}
35
37
36
- void _do_divide0_error (struct irpt_regs * regs ) {
37
- FATAL ("int0: divide 0 error" , regs );
38
+ void _do_divide0_error (uint32_t errcode , struct irpt_regs * regs ) {
39
+ FATAL ("int0: divide 0 error" , errcode , regs );
38
40
}
39
41
40
- void _do_debug (struct irpt_regs * regs ) {
41
- FATAL ("int1: debug" , regs );
42
+ void _do_debug (uint32_t errcode , struct irpt_regs * regs ) {
43
+ FATAL ("int1: debug" , errcode , regs );
42
44
}
43
45
44
- void _do_nmi (struct irpt_regs * regs ) {
45
- FATAL ("int2: nmi" , regs );
46
+ void _do_nmi (uint32_t errcode , struct irpt_regs * regs ) {
47
+ FATAL ("int2: nmi" , errcode , regs );
46
48
}
47
49
48
- void _do_debug_break (struct irpt_regs * regs ) {
49
- FATAL ("int3: break" , regs );
50
+ void _do_debug_break (uint32_t errcode , struct irpt_regs * regs ) {
51
+ FATAL ("int3: break" , errcode , regs );
50
52
}
51
53
52
- void _do_overflow (struct irpt_regs * regs ) {
53
- FATAL ("int4: overflow" , regs );
54
+ void _do_overflow (uint32_t errcode , struct irpt_regs * regs ) {
55
+ FATAL ("int4: overflow" , errcode , regs );
54
56
}
55
57
56
- void _do_bounds_check (struct irpt_regs * regs ) {
57
- FATAL ("int5: bounds_check" , regs );
58
+ void _do_bounds_check (uint32_t errcode , struct irpt_regs * regs ) {
59
+ FATAL ("int5: bounds_check" , errcode , regs );
58
60
}
59
61
60
- void _do_invalid_op (struct irpt_regs * regs ) {
61
- FATAL ("int6: invalid op" , regs );
62
+ void _do_invalid_op (uint32_t errcode , struct irpt_regs * regs ) {
63
+ FATAL ("int6: invalid op" , errcode , regs );
62
64
}
63
65
64
- void _do_device_fail (struct irpt_regs * regs ) {
65
- FATAL ("int7: device fail" , regs );
66
+ void _do_device_fail (uint32_t errcode , struct irpt_regs * regs ) {
67
+ FATAL ("int7: device fail" , errcode , regs );
66
68
}
67
69
68
- void _do_double_fault (struct irpt_regs * regs ) {
69
- FATAL ("int8: double fault" , regs );
70
+ void _do_double_fault (uint32_t errcode , struct irpt_regs * regs ) {
71
+ FATAL ("int8: double fault" , errcode , regs );
70
72
}
71
73
72
- void _do_cop_segment (struct irpt_regs * regs ) {
73
- FATAL ("int9: coprocesser segment" , regs );
74
+ void _do_cop_segment (uint32_t errcode , struct irpt_regs * regs ) {
75
+ FATAL ("int9: coprocesser segment" , errcode , regs );
74
76
}
75
77
76
- void _do_tss_inval (struct irpt_regs * regs ) {
77
- FATAL ("int10: tss invalid" , regs );
78
+ void _do_tss_inval (uint32_t errcode , struct irpt_regs * regs ) {
79
+ FATAL ("int10: tss invalid" , errcode , regs );
78
80
}
79
81
80
- void _do_segment_unpresent (struct irpt_regs * regs ) {
81
- FATAL ("int11: segment unpresent" , regs );
82
+ void _do_segment_unpresent (uint32_t errcode , struct irpt_regs * regs ) {
83
+ FATAL ("int11: segment unpresent" , errcode , regs );
82
84
}
83
85
84
- void _do_stack_segment (struct irpt_regs * regs ) {
85
- FATAL ("int12: stack segment unpresent or overflow" , regs );
86
+ void _do_stack_segment (uint32_t errcode , struct irpt_regs * regs ) {
87
+ FATAL ("int12: stack segment unpresent or overflow" , errcode , regs );
86
88
}
87
89
88
- void _do_general_protection (struct irpt_regs * regs ) {
89
- FATAL ("int13: general protection" , regs );
90
+ void _do_general_protection (uint32_t errcode , struct irpt_regs * regs ) {
91
+ FATAL ("int13: general protection" , errcode , regs );
90
92
}
91
93
92
- void _do_page_fault (struct irpt_regs * regs ) {
93
- FATAL ("int14: page fault" , regs );
94
+ void _do_page_fault (uint32_t errcode , struct irpt_regs * regs ) {
95
+ FATAL ("int14: page fault" , errcode , regs );
94
96
}
95
97
96
- void _do_reserved (struct irpt_regs * regs ) {
97
- FATAL ("int15: reserved" , regs );
98
+ void _do_reserved (uint32_t errcode , struct irpt_regs * regs ) {
99
+ FATAL ("int15: reserved" , errcode , regs );
98
100
}
99
101
100
- void _do_cop_error (struct irpt_regs * regs ) {
101
- FATAL ("int16: coprocesser error" , regs );
102
+ void _do_cop_error (uint32_t errcode , struct irpt_regs * regs ) {
103
+ FATAL ("int16: coprocesser error" , errcode , regs );
102
104
}
103
105
104
106
@@ -120,8 +122,25 @@ static void set_idt(uint32_t idx, uint32_t base, uint16_t selector, uint8_t flag
120
122
}
121
123
122
124
extern const uint16_t kernel_code_selector ;
123
- void divide0_error ();
124
- void general_protection ();
125
+
126
+ extern void divide0_error ();
127
+ extern void debug ();
128
+ extern void nmi ();
129
+ extern void debug_break ();
130
+ extern void overflow ();
131
+ extern void bounds_check ();
132
+ extern void invalid_op ();
133
+ extern void device_fail ();
134
+ extern void double_fault ();
135
+ extern void cop_segment ();
136
+ extern void tss_inval ();
137
+ extern void segment_unpresent ();
138
+ extern void stack_segment ();
139
+ extern void general_protection ();
140
+ extern void page_fault ();
141
+ extern void reserved ();
142
+ extern void cop_error ();
143
+ extern void exception_handler ();
125
144
126
145
void setup_idt () {
127
146
memset (& idts , 0 , sizeof (idts ));
@@ -130,6 +149,9 @@ void setup_idt() {
130
149
idtptr .limit = sizeof (idts ) - 1 ;
131
150
132
151
set_idt (0 , (uint32_t ) & divide0_error , kernel_code_selector , IDT_DPL0 | IDT_TRAP );
152
+ set_idt (1 , (uint32_t ) & debug , kernel_code_selector , IDT_DPL0 | IDT_TRAP );
153
+ set_idt (2 , (uint32_t ) & nmi , kernel_code_selector , IDT_DPL0 | IDT_TRAP );
154
+ set_idt (3 , (uint32_t ) & debug_break , kernel_code_selector , IDT_DPL0 | IDT_TRAP );
133
155
set_idt (13 , (uint32_t ) & general_protection , kernel_code_selector , IDT_DPL0 | IDT_IRPT );
134
156
135
157
idt_load ();
0 commit comments