Skip to content

Commit 9a02520

Browse files
committed
Added more interrupt handlers to aid debugging
Several common CPU exceptions had no handler previously, leading to a double fault if they were triggered. This makes debugging difficult, as we don't know what exactly went wrong. This adds basic panicking handlers for them, so that at least we know the error more specifically. Signed-off-by: SlyMarbo <[email protected]>
1 parent d134a23 commit 9a02520

File tree

1 file changed

+43
-8
lines changed

1 file changed

+43
-8
lines changed

kernel/src/interrupts.rs

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

8186
extern "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+
85125
extern "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

103138
fn timer_interrupt_handler(_stack_frame: InterruptStackFrame, _irq: u8) {
104139
time::tick();

0 commit comments

Comments
 (0)