diff --git a/src/interrupts/mod.rs b/src/interrupts/mod.rs index 78f4be85..b3608ad4 100644 --- a/src/interrupts/mod.rs +++ b/src/interrupts/mod.rs @@ -2,6 +2,7 @@ use x86_64::VirtualAddress; use x86_64::structures::idt::{Idt, ExceptionStackFrame}; use x86_64::structures::tss::TaskStateSegment; use memory::MemoryController; +use spin::Once; mod gdt; @@ -14,15 +15,30 @@ lazy_static! { }; } +static TSS: Once = Once::new(); +static GDT: Once = Once::new(); + const DOUBLE_FAULT_IST_INDEX: usize = 0; pub fn init(memory_controller: &mut MemoryController) { let double_fault_stack = memory_controller.alloc_stack(1) .expect("could not allocate double fault stack"); - let mut tss = TaskStateSegment::new(); - tss.interrupt_stack_table[DOUBLE_FAULT_IST_INDEX] = VirtualAddress( - double_fault_stack.top()); + let tss = TSS.call_once(|| { + let mut tss = TaskStateSegment::new(); + tss.interrupt_stack_table[DOUBLE_FAULT_IST_INDEX] = VirtualAddress( + double_fault_stack.top()); + tss + }); + + let gdt = GDT.call_once(|| { + let mut gdt = gdt::Gdt::new(); + let code_selector = gdt.add_entry(gdt::Descriptor:: + kernel_code_segment()); + let tss_selector = gdt.add_entry(gdt::Descriptor::tss_segment(&tss)); + gdt + }); + gdt.load(); IDT.load(); }