@@ -48,12 +48,17 @@ lazy_static! {
4848 static ref IDT : InterruptDescriptorTable = {
4949 let mut idt = InterruptDescriptorTable :: new( ) ;
5050 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 ) ;
5252 unsafe {
5353 idt. double_fault
5454 . set_handler_fn( double_fault_handler)
5555 . set_stack_index( gdt:: DOUBLE_FAULT_IST_INDEX ) ;
5656 }
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) ;
5762
5863 idt[ PIC_1_OFFSET + 0 ] . set_handler_fn( irq_handler_0) ;
5964 idt[ PIC_1_OFFSET + 1 ] . set_handler_fn( irq_handler_1) ;
@@ -76,12 +81,47 @@ lazy_static! {
7681 } ;
7782}
7883
79- // Interrupt handlers.
84+ // CPU exception handlers.
8085
8186extern "x86-interrupt" fn breakpoint_handler ( stack_frame : InterruptStackFrame ) {
8287 println ! ( "EXCEPTION: BREAKPOINT\n {:#?}" , stack_frame) ;
8388}
8489
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+
85125extern "x86-interrupt" fn page_fault_handler (
86126 stack_frame : InterruptStackFrame ,
87127 error_code : PageFaultErrorCode ,
@@ -93,12 +133,7 @@ extern "x86-interrupt" fn page_fault_handler(
93133 halt_loop ( ) ;
94134}
95135
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.
102137
103138fn timer_interrupt_handler ( _stack_frame : InterruptStackFrame , _irq : u8 ) {
104139 time:: tick ( ) ;
0 commit comments