summaryrefslogtreecommitdiff
path: root/kernel/src/interrupts/idt.rs
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/interrupts/idt.rs')
-rw-r--r--kernel/src/interrupts/idt.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/kernel/src/interrupts/idt.rs b/kernel/src/interrupts/idt.rs
new file mode 100644
index 0000000..9541f22
--- /dev/null
+++ b/kernel/src/interrupts/idt.rs
@@ -0,0 +1,26 @@
+use lazy_static::lazy_static;
+use x86_64::structures::idt::InterruptDescriptorTable;
+
+lazy_static! {
+ static ref IDT: InterruptDescriptorTable = {
+ let mut idt = InterruptDescriptorTable::new();
+ idt.breakpoint
+ .set_handler_fn(super::exceptions::breakpoint_handler);
+ idt.segment_not_present
+ .set_handler_fn(super::exceptions::segment_not_present_handler);
+ unsafe {
+ idt.double_fault
+ .set_handler_fn(super::exceptions::double_fault_handler)
+ .set_stack_index(super::gdt::DOUBLE_FAULT_IST_INDEX);
+ idt.page_fault
+ .set_handler_fn(super::exceptions::page_fault_handler)
+ .set_stack_index(super::gdt::PAGE_FAULT_IST_INDEX);
+ }
+
+ idt
+ };
+}
+
+pub fn init() {
+ IDT.load()
+}