Make TSS and GDT statics by using spin::Once

This commit is contained in:
Philipp Oppermann
2017-01-02 16:23:52 +01:00
parent 31ffe60052
commit c0d7206249

View File

@@ -9,6 +9,7 @@
use memory::MemoryController; use memory::MemoryController;
use x86::bits64::task::TaskStateSegment; use x86::bits64::task::TaskStateSegment;
use spin::Once;
mod idt; mod idt;
mod gdt; mod gdt;
@@ -90,6 +91,8 @@ macro_rules! handler_with_error_code {
}} }}
} }
const DOUBLE_FAULT_IST_INDEX: usize = 0;
lazy_static! { lazy_static! {
static ref IDT: idt::Idt = { static ref IDT: idt::Idt = {
let mut idt = idt::Idt::new(); let mut idt = idt::Idt::new();
@@ -104,14 +107,26 @@ lazy_static! {
}; };
} }
const DOUBLE_FAULT_IST_INDEX: usize = 0; static TSS: Once<TaskStateSegment> = Once::new();
static GDT: Once<gdt::Gdt> = Once::new();
pub fn init(memory_controller: &mut MemoryController) { pub fn init(memory_controller: &mut MemoryController) {
let double_fault_stack = memory_controller.alloc_stack(1) let double_fault_stack = memory_controller.alloc_stack(1)
.expect("could not allocate double fault stack"); .expect("could not allocate double fault stack");
let mut tss = TaskStateSegment::new(); let tss = TSS.call_once(|| {
tss.ist[DOUBLE_FAULT_IST_INDEX] = double_fault_stack.top() as u64; let mut tss = TaskStateSegment::new();
tss.ist[DOUBLE_FAULT_IST_INDEX] = double_fault_stack.top() as u64;
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(); IDT.load();
} }