24 lines
754 B
Rust
24 lines
754 B
Rust
use x86_64::instructions::segmentation::{Segment, SS, CS};
|
|
use x86_64::structures::gdt::{Descriptor, DescriptorFlags, GlobalDescriptorTable};
|
|
|
|
static mut GDT: GlobalDescriptorTable = GlobalDescriptorTable::new();
|
|
|
|
fn kernel_data_segment() -> Descriptor {
|
|
use self::DescriptorFlags as Flags;
|
|
|
|
let flags = Flags::USER_SEGMENT | Flags::PRESENT | Flags::WRITABLE;
|
|
Descriptor::UserSegment(flags.bits())
|
|
}
|
|
|
|
pub fn load() {
|
|
unsafe {
|
|
let cs = GDT.add_entry(Descriptor::kernel_code_segment());
|
|
GDT.add_entry(Descriptor::user_code_segment());
|
|
GDT.add_entry(Descriptor::user_data_segment());
|
|
let ss = GDT.add_entry(kernel_data_segment());
|
|
GDT.load();
|
|
CS::set_reg(cs);
|
|
SS::set_reg(ss);
|
|
}
|
|
}
|