Reload code segment register and load TSS

This commit is contained in:
Philipp Oppermann
2017-01-02 16:24:57 +01:00
parent c0d7206249
commit 006619920e

View File

@@ -111,6 +111,9 @@ static TSS: Once<TaskStateSegment> = Once::new();
static GDT: Once<gdt::Gdt> = Once::new();
pub fn init(memory_controller: &mut MemoryController) {
use x86::shared::segmentation::{SegmentSelector, set_cs};
use x86::shared::task::load_tr;
let double_fault_stack = memory_controller.alloc_stack(1)
.expect("could not allocate double fault stack");
@@ -120,14 +123,23 @@ pub fn init(memory_controller: &mut MemoryController) {
tss
});
let mut code_selector = SegmentSelector::empty();
let mut tss_selector = SegmentSelector::empty();
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));
code_selector = gdt.add_entry(gdt::Descriptor::kernel_code_segment());
tss_selector = gdt.add_entry(gdt::Descriptor::tss_segment(&tss));
gdt
});
gdt.load();
unsafe {
// reload code segment register
set_cs(code_selector);
// load TSS
load_tr(tss_selector);
}
IDT.load();
}