use super::{exception_handlers, gdt, interrupt_handlers, InterruptType}; use lazy_static::lazy_static; use x86_64::structures::idt::InterruptDescriptorTable; lazy_static! { static ref IDT: InterruptDescriptorTable = { let mut idt = InterruptDescriptorTable::new(); for i in 32..256 { idt[i].set_handler_fn(dummy_handler); } idt.breakpoint .set_handler_fn(exception_handlers::breakpoint_handler); idt.divide_by_zero .set_handler_fn(exception_handlers::div_zero_handler); idt.segment_not_present .set_handler_fn(exception_handlers::segment_not_present_handler); idt.general_protection_fault .set_handler_fn(exception_handlers::general_protection_fault_handler); unsafe { idt.double_fault .set_handler_fn(exception_handlers::double_fault_handler) .set_stack_index(gdt::DOUBLE_FAULT_IST_INDEX); idt.page_fault .set_handler_fn(exception_handlers::page_fault_handler) .set_stack_index(gdt::PAGE_FAULT_IST_INDEX); } idt[InterruptType::Timer.as_usize()].set_handler_fn(interrupt_handlers::timer_handler); idt }; } pub extern "x86-interrupt" fn dummy_handler( stack_frame: &mut x86_64::structures::idt::InterruptStackFrame, ) { panic!("unhandled interrupt recieved"); } pub fn init() { IDT.load() }