From ff25a7d86c4ae051729d774859e59274432bddc3 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Fri, 25 Jan 2019 13:59:09 +0100 Subject: [PATCH] Reload code and TSS selector registers --- src/gdt.rs | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/gdt.rs b/src/gdt.rs index eae34bf4..de61a7d8 100644 --- a/src/gdt.rs +++ b/src/gdt.rs @@ -1,5 +1,5 @@ use lazy_static::lazy_static; -use x86_64::structures::gdt::{Descriptor, GlobalDescriptorTable}; +use x86_64::structures::gdt::{Descriptor, GlobalDescriptorTable, SegmentSelector}; use x86_64::structures::tss::TaskStateSegment; use x86_64::VirtAddr; @@ -21,14 +21,32 @@ lazy_static! { } lazy_static! { - static ref GDT: GlobalDescriptorTable = { + static ref GDT: (GlobalDescriptorTable, Selectors) = { let mut gdt = GlobalDescriptorTable::new(); - gdt.add_entry(Descriptor::kernel_code_segment()); - gdt.add_entry(Descriptor::tss_segment(&TSS)); - gdt + let code_selector = gdt.add_entry(Descriptor::kernel_code_segment()); + let tss_selector = gdt.add_entry(Descriptor::tss_segment(&TSS)); + ( + gdt, + Selectors { + code_selector, + tss_selector, + }, + ) }; } -pub fn init() { - GDT.load(); +struct Selectors { + code_selector: SegmentSelector, + tss_selector: SegmentSelector, +} + +pub fn init() { + use x86_64::instructions::segmentation::set_cs; + use x86_64::instructions::tables::load_tss; + + GDT.0.load(); + unsafe { + set_cs(GDT.1.code_selector); + load_tss(GDT.1.tss_selector); + } }