aboutsummaryrefslogtreecommitdiff
path: root/src/shared/mod.rs
diff options
context:
space:
mode:
authorGravatar John Ericson <Ericson2314@Yahoo.com> 2016-06-29 16:19:18 -0700
committerGravatar John Ericson <Ericson2314@Yahoo.com> 2016-07-01 14:50:24 -0700
commitc37a7b580d528f0a4d0721702ddd645a357a405d (patch)
tree4cc74350de6782a702f002d3545378ba4d96c182 /src/shared/mod.rs
parent7234146529386a0d59817055c847b5e906ab605c (diff)
downloadrust-x86-c37a7b580d528f0a4d0721702ddd645a357a405d.tar.gz
rust-x86-c37a7b580d528f0a4d0721702ddd645a357a405d.tar.zst
rust-x86-c37a7b580d528f0a4d0721702ddd645a357a405d.zip
Combine Interface: SegmentSelector; libcpu: permissions parameter
Diffstat (limited to 'src/shared/mod.rs')
-rw-r--r--src/shared/mod.rs55
1 files changed, 3 insertions, 52 deletions
diff --git a/src/shared/mod.rs b/src/shared/mod.rs
index 977dcf4..f110934 100644
--- a/src/shared/mod.rs
+++ b/src/shared/mod.rs
@@ -6,6 +6,9 @@ pub mod dtables;
pub mod io;
pub mod irq;
pub mod paging;
+pub mod segmentation;
+
+use self::segmentation::SegmentSelector;
bitflags! {
pub flags Flags: usize {
@@ -133,64 +136,12 @@ pub enum PrivilegeLevel {
Ring3 = 3,
}
-#[derive(Copy, Clone, PartialEq, Eq)]
-#[repr(C, packed)]
-pub struct SegmentSelector {
- data: u16
-}
-
-impl SegmentSelector {
- #[inline(always)]
- pub fn new(index: u16, rpl: PrivilegeLevel) -> SegmentSelector {
- SegmentSelector {
- data: index << 3 | rpl as u16
- }
- }
-
- pub fn bits(&self) -> u16 {
- self.data
- }
-}
-
#[inline(always)]
pub unsafe fn set_tr(selector: SegmentSelector) {
asm!("ltr $0" :: "r"(selector.bits()) :: "volatile", "intel");
}
#[inline(always)]
-pub unsafe fn set_ss(selector: SegmentSelector) {
- asm!("mov ss, $0" :: "r"(selector.bits()) :: "volatile", "intel");
-}
-
-#[inline(always)]
-pub unsafe fn set_ds(selector: SegmentSelector) {
- asm!("mov ds, $0" :: "r"(selector.bits()) :: "volatile", "intel");
-}
-
-#[inline(always)]
-pub unsafe fn set_es(selector: SegmentSelector) {
- asm!("mov es, $0" :: "r"(selector.bits()) :: "volatile", "intel");
-}
-
-#[inline(always)]
-pub unsafe fn set_gs(selector: SegmentSelector) {
- asm!("mov gs, $0" :: "r"(selector.bits()) :: "volatile", "intel");
-}
-
-#[inline(always)]
-pub unsafe fn set_fs(selector: SegmentSelector) {
- asm!("mov fs, $0" :: "r"(selector.bits()) :: "volatile", "intel");
-}
-
-#[inline(always)]
-pub unsafe fn set_cs(selector: SegmentSelector) {
- asm!("push $0;
- push $$1f
- lret;
- 1:" :: "ri"(selector.bits() as usize) :: "volatile");
-}
-
-#[inline(always)]
pub unsafe fn halt() {
asm!("hlt" :::: "volatile", "intel");
}