aboutsummaryrefslogtreecommitdiff
path: root/src/task.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/task.rs')
-rw-r--r--src/task.rs13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/task.rs b/src/task.rs
index a7b3423..d819e2d 100644
--- a/src/task.rs
+++ b/src/task.rs
@@ -4,9 +4,14 @@
pub use crate::segmentation;
/// Returns the current value of the task register.
-pub fn tr() -> segmentation::SegmentSelector {
+///
+/// # Safety
+/// Needs CPL 0.
+pub unsafe fn tr() -> segmentation::SegmentSelector {
let segment: u16;
- unsafe { llvm_asm!("str $0" : "=r" (segment) ) };
+ asm!("str {0:x}",
+ out(reg) segment,
+ options(att_syntax, nostack, nomem, preserves_flags));
segmentation::SegmentSelector::from_raw(segment)
}
@@ -15,5 +20,7 @@ pub fn tr() -> segmentation::SegmentSelector {
/// # Safety
/// Needs CPL 0.
pub unsafe fn load_tr(sel: segmentation::SegmentSelector) {
- llvm_asm!("ltr $0" :: "r" (sel.bits()));
+ asm!("ltr {0:x}",
+ in(reg) sel.bits(),
+ options(att_syntax, nostack, nomem, preserves_flags));
}