use alloc::boxed::Box;
use core::arch::global_asm;
use x86_64::{
structures::idt::{Entry, HandlerFunc, InterruptDescriptorTable},
PrivilegeLevel,
};
global_asm!(include_str!("trap.S"));
pub fn init() {
extern "C" {
#[link_name = "trap_handler_table"]
static VECTORS: [HandlerFunc; 256];
}
let idt = Box::leak(Box::new(InterruptDescriptorTable::new()));
let entries: &'static mut [Entry<HandlerFunc>; 256] =
unsafe { core::mem::transmute_copy(&idt) };
for i in 0..256 {
let opt = unsafe { entries[i].set_handler_fn(VECTORS[i]) };
if i == 3 || i == 4 {
opt.set_privilege_level(PrivilegeLevel::Ring3);
}
}
idt.load();
}