From 006619920e3f5d10e12ba17521a540866aadd5da Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Mon, 2 Jan 2017 16:24:57 +0100 Subject: [PATCH] Reload code segment register and load TSS --- src/interrupts/mod.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/interrupts/mod.rs b/src/interrupts/mod.rs index cec9dd7e..d059cffe 100644 --- a/src/interrupts/mod.rs +++ b/src/interrupts/mod.rs @@ -111,6 +111,9 @@ static TSS: Once = Once::new(); static GDT: Once = 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(); }