1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
//! Helpers to program the task state segment.
//! See Intel 3a, Chapter 7

pub use crate::segmentation;

/// Returns the current value of the task register.
pub fn tr() -> segmentation::SegmentSelector {
    let segment: u16;
    unsafe { asm!("str $0" : "=r" (segment) ) };
    segmentation::SegmentSelector::from_raw(segment)
}

/// Loads the task register.
pub unsafe fn load_tr(sel: segmentation::SegmentSelector) {
    asm!("ltr $0" :: "r" (sel.bits()));
}