@@ -48,12 +48,17 @@ lazy_static! {
48
48
static ref IDT : InterruptDescriptorTable = {
49
49
let mut idt = InterruptDescriptorTable :: new( ) ;
50
50
idt. breakpoint. set_handler_fn( breakpoint_handler) ;
51
- idt. page_fault . set_handler_fn( page_fault_handler ) ;
51
+ idt. invalid_opcode . set_handler_fn( invalid_opcode_handler ) ;
52
52
unsafe {
53
53
idt. double_fault
54
54
. set_handler_fn( double_fault_handler)
55
55
. set_stack_index( gdt:: DOUBLE_FAULT_IST_INDEX ) ;
56
56
}
57
+ idt. segment_not_present
58
+ . set_handler_fn( segment_not_present_handler) ;
59
+ idt. general_protection_fault
60
+ . set_handler_fn( general_protection_fault_handler) ;
61
+ idt. page_fault. set_handler_fn( page_fault_handler) ;
57
62
58
63
idt[ PIC_1_OFFSET + 0 ] . set_handler_fn( irq_handler_0) ;
59
64
idt[ PIC_1_OFFSET + 1 ] . set_handler_fn( irq_handler_1) ;
@@ -76,12 +81,47 @@ lazy_static! {
76
81
} ;
77
82
}
78
83
79
- // Interrupt handlers.
84
+ // CPU exception handlers.
80
85
81
86
extern "x86-interrupt" fn breakpoint_handler ( stack_frame : InterruptStackFrame ) {
82
87
println ! ( "EXCEPTION: BREAKPOINT\n {:#?}" , stack_frame) ;
83
88
}
84
89
90
+ extern "x86-interrupt" fn invalid_opcode_handler ( stack_frame : InterruptStackFrame ) {
91
+ panic ! ( "EXCEPTION: INVALID OPCODE\n {:#?}" , stack_frame) ;
92
+ }
93
+
94
+ extern "x86-interrupt" fn double_fault_handler (
95
+ stack_frame : InterruptStackFrame ,
96
+ _error_code : u64 ,
97
+ ) -> ! {
98
+ panic ! ( "EXCEPTION: DOUBLE FAULT\n {:#?}" , stack_frame) ;
99
+ }
100
+
101
+ extern "x86-interrupt" fn segment_not_present_handler (
102
+ stack_frame : InterruptStackFrame ,
103
+ error_code : u64 ,
104
+ ) {
105
+ panic ! (
106
+ "EXCEPTION: SEGMENT NOT PRESENT: index {}\n {:#?}" ,
107
+ error_code, stack_frame
108
+ ) ;
109
+ }
110
+
111
+ extern "x86-interrupt" fn general_protection_fault_handler (
112
+ stack_frame : InterruptStackFrame ,
113
+ error_code : u64 ,
114
+ ) {
115
+ if error_code != 0 {
116
+ panic ! (
117
+ "EXCEPTION: GENERAL PROTECTION FAULT: segment index {}\n {:#?}" ,
118
+ error_code, stack_frame
119
+ ) ;
120
+ } else {
121
+ panic ! ( "EXCEPTION: GENERAL PROTECTION FAULT:\n {:#?}" , stack_frame) ;
122
+ }
123
+ }
124
+
85
125
extern "x86-interrupt" fn page_fault_handler (
86
126
stack_frame : InterruptStackFrame ,
87
127
error_code : PageFaultErrorCode ,
@@ -93,12 +133,7 @@ extern "x86-interrupt" fn page_fault_handler(
93
133
halt_loop ( ) ;
94
134
}
95
135
96
- extern "x86-interrupt" fn double_fault_handler (
97
- stack_frame : InterruptStackFrame ,
98
- _error_code : u64 ,
99
- ) -> ! {
100
- panic ! ( "EXCEPTION: DOUBLE FAULT\n {:#?}" , stack_frame) ;
101
- }
136
+ // IRQ handlers.
102
137
103
138
fn timer_interrupt_handler ( _stack_frame : InterruptStackFrame , _irq : u8 ) {
104
139
time:: tick ( ) ;
0 commit comments