proka_kernel/interrupts/
idt.rs1use crate::interrupts::gdt;
2use crate::interrupts::handler;
3use crate::interrupts::pic::{PIC_1_OFFSET, PIC_2_OFFSET}; use lazy_static::lazy_static;
5use x86_64::structures::idt::InterruptDescriptorTable;
6#[allow(dead_code)]
8pub const PICS_EVT_COUNT: u8 = 16; pub const SPURIOUS_APIC_VECTOR: u8 = 0xFF; lazy_static! {
12 pub static ref IDT: InterruptDescriptorTable = {
13 let mut idt = InterruptDescriptorTable::new();
14 idt[SPURIOUS_APIC_VECTOR].set_handler_fn(handler::spurious_interrupt_handler);
16
17 idt.divide_error.set_handler_fn(handler::divide_error_handler);
19 idt.debug.set_handler_fn(handler::debug_handler);
20 idt.non_maskable_interrupt.set_handler_fn(handler::nmi_handler);
21 idt.breakpoint.set_handler_fn(handler::breakpoint_handler);
22 idt.overflow.set_handler_fn(handler::overflow_handler);
23 idt.bound_range_exceeded.set_handler_fn(handler::bound_range_handler);
24 idt.invalid_opcode.set_handler_fn(handler::invalid_opcode_handler);
25 idt.device_not_available.set_handler_fn(handler::device_not_available_handler);
26 idt.x87_floating_point.set_handler_fn(handler::x87_floating_point_handler);
27 idt.invalid_tss.set_handler_fn(handler::invalid_tss_handler);
29 idt.segment_not_present.set_handler_fn(handler::segment_not_present_handler);
30 idt.stack_segment_fault.set_handler_fn(handler::stack_segment_handler);
31 idt.general_protection_fault.set_handler_fn(handler::general_protection_handler);
32 idt.alignment_check.set_handler_fn(handler::alignment_check_handler);
33 idt.cp_protection_exception.set_handler_fn(handler::control_protection_handler);
34 idt.page_fault.set_handler_fn(handler::pagefault_handler);
36 idt.machine_check.set_handler_fn(handler::machine_check_handler);
37 unsafe {
38 idt.double_fault
39 .set_handler_fn(handler::double_fault_handler)
40 .set_stack_index(gdt::DOUBLE_FAULT_IST_INDEX);
41 }
42 idt[PIC_1_OFFSET].set_handler_fn(handler::pic_interrupt_handler_0); idt[PIC_1_OFFSET + 1].set_handler_fn(handler::pic_interrupt_handler_1); idt[PIC_1_OFFSET + 2].set_handler_fn(handler::pic_interrupt_handler_2); idt[PIC_1_OFFSET + 3].set_handler_fn(handler::pic_interrupt_handler_3); idt[PIC_1_OFFSET + 4].set_handler_fn(handler::pic_interrupt_handler_4); idt[PIC_1_OFFSET + 5].set_handler_fn(handler::pic_interrupt_handler_5); idt[PIC_1_OFFSET + 6].set_handler_fn(handler::pic_interrupt_handler_6); idt[PIC_1_OFFSET + 7].set_handler_fn(handler::pic_interrupt_handler_7); idt[PIC_2_OFFSET].set_handler_fn(handler::pic_interrupt_handler_8); idt[PIC_2_OFFSET + 1].set_handler_fn(handler::pic_interrupt_handler_9); idt[PIC_2_OFFSET + 2].set_handler_fn(handler::pic_interrupt_handler_10); idt[PIC_2_OFFSET + 3].set_handler_fn(handler::pic_interrupt_handler_11); idt[PIC_2_OFFSET + 4].set_handler_fn(handler::pic_interrupt_handler_12); idt[PIC_2_OFFSET + 5].set_handler_fn(handler::pic_interrupt_handler_13); idt[PIC_2_OFFSET + 6].set_handler_fn(handler::pic_interrupt_handler_14); idt[PIC_2_OFFSET + 7].set_handler_fn(handler::pic_interrupt_handler_15); idt
61 };
62}
63pub fn init_idt() {
64 IDT.load();
65}