aboutsummaryrefslogtreecommitdiff
path: root/src/bits32/segmentation.rs
blob: ff9cc9d3b87dd0f68b5280ee4b43c9280a95706c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#[allow(unused_imports)]
use crate::segmentation::SegmentSelector;

/// Reload code segment register.
/// Note this is special since we can not directly move
/// to %cs. Instead we push the new segment selector
/// and return value on the stack and use lretl
/// to reload cs and continue at 1:.
#[cfg(target_arch = "x86")]
pub unsafe fn load_cs(sel: SegmentSelector) {
    llvm_asm!("pushl $0; \
          pushl $$1f; \
          lretl; \
          1:" :: "ri" (sel.bits() as u32) : "memory");
}