summaryrefslogtreecommitdiff
path: root/kernel/src/init/cpu/int/idt.rs
blob: 80d42f8a7643ee27cb8b268ef2f5ba144b8f89e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use spin::LazyLock;
use x86_64::structures::idt::{InterruptDescriptorTable, InterruptStackFrame};

use crate::init::earlyprintk::printlnk;

pub static IDT: LazyLock<InterruptDescriptorTable> = LazyLock::new(
    || {
        let mut idt = InterruptDescriptorTable::new();
        idt.breakpoint.set_handler_fn(breakpoint_handler);
        idt.double_fault.set_handler_fn(double_fault_handler);
        idt
    },
);

extern "x86-interrupt" fn double_fault_handler(
    stack_frame: InterruptStackFrame,
    error_code: u64,
) -> ! {
    panic!("EXCEPTION: DOUBLE FAULT\n{stack_frame:#?}\nERROR CODE:{error_code}");
}

extern "x86-interrupt" fn breakpoint_handler(stack_frame: InterruptStackFrame) {
    _ = printlnk!("EXCEPTION: BREAKPOINT\n{stack_frame:#?}");
}