diff options
author | 2016-06-29 22:51:56 -0700 | |
---|---|---|
committer | 2016-07-01 14:50:29 -0700 | |
commit | 5de84ea5c3e5e683eb112b9fff52bd86e3e9e817 (patch) | |
tree | e880056ff5fd46911d2c9c0eadf844170ffd8265 | |
parent | 59db19be0ce5308595c2b52e455803bbe9da8ec9 (diff) | |
download | rust-x86-5de84ea5c3e5e683eb112b9fff52bd86e3e9e817.tar.gz rust-x86-5de84ea5c3e5e683eb112b9fff52bd86e3e9e817.tar.zst rust-x86-5de84ea5c3e5e683eb112b9fff52bd86e3e9e817.zip |
Combine Interface: (|E|R)Flags; libcpu: assembly load/store functions
-rw-r--r-- | src/bits32/mod.rs | 18 | ||||
-rw-r--r-- | src/bits64/mod.rs | 3 | ||||
-rw-r--r-- | src/bits64/rflags.rs | 56 | ||||
-rw-r--r-- | src/bits64/tobba.rs | 17 | ||||
-rw-r--r-- | src/shared/flags.rs | 102 | ||||
-rw-r--r-- | src/shared/mod.rs | 24 |
6 files changed, 103 insertions, 117 deletions
diff --git a/src/bits32/mod.rs b/src/bits32/mod.rs index ac872d7..e98b862 100644 --- a/src/bits32/mod.rs +++ b/src/bits32/mod.rs @@ -1,24 +1,6 @@ -#![allow(non_upper_case_globals)] - pub mod irq; pub mod task; -pub use shared::Flags; - -#[inline(always)] -pub fn get_flags() -> Flags { - unsafe { - let r: usize; - asm!("pushfd; pop $0" : "=r"(r) ::: "intel"); - Flags::from_bits_truncate(r) - } -} - -#[inline(always)] -pub unsafe fn set_flags(val: Flags) { - asm!("push $0; popfd" :: "r"(val.bits()) : "flags" : "volatile", "intel"); -} - #[inline(always)] pub unsafe fn stack_jmp(stack: *mut (), ip: *const ()) -> ! { asm!("mov esp, $0; jmp $1" :: "rg"(stack), "r"(ip) :: "volatile", "intel"); diff --git a/src/bits64/mod.rs b/src/bits64/mod.rs index 413d3cf..63ebac2 100644 --- a/src/bits64/mod.rs +++ b/src/bits64/mod.rs @@ -33,7 +33,6 @@ macro_rules! check_bit_fn { pub mod msr; pub mod time; pub mod irq; -pub mod rflags; pub mod paging; pub mod task; pub mod syscall; @@ -44,5 +43,3 @@ pub mod cpuid { pub use raw_cpuid::*; } pub mod tlb; - -pub mod tobba; diff --git a/src/bits64/rflags.rs b/src/bits64/rflags.rs deleted file mode 100644 index 7cf4bbd..0000000 --- a/src/bits64/rflags.rs +++ /dev/null @@ -1,56 +0,0 @@ -//! Description of RFlag values that store the results of operations and the state of the processor. - -/// RFLAGS description. -bitflags! { - pub flags RFlags: u64 { - /// ID Flag (ID) - const RFLAGS_ID = 1 << 21, - /// Virtual Interrupt Pending (VIP) - const RFLAGS_VIP = 1 << 20, - /// Virtual Interrupt Flag (VIF) - const RFLAGS_VIF = 1 << 19, - /// Alignment Check (AC) - const RFLAGS_AC = 1 << 18, - /// Virtual-8086 Mode (VM) - const RFLAGS_VM = 1 << 17, - /// Resume Flag (RF) - const RFLAGS_RF = 1 << 16, - /// Nested Task (NT) - const RFLAGS_NT = 1 << 14, - /// I/O Privilege Level (IOPL) 0 - const RFLAGS_IOPL0 = 0 << 12, - /// I/O Privilege Level (IOPL) 1 - const RFLAGS_IOPL1 = 1 << 12, - /// I/O Privilege Level (IOPL) 2 - const RFLAGS_IOPL2 = 2 << 12, - /// I/O Privilege Level (IOPL) 3 - const RFLAGS_IOPL3 = 3 << 12, - /// Overflow Flag (OF) - const RFLAGS_OF = 1 << 11, - /// Direction Flag (DF) - const RFLAGS_DF = 1 << 10, - /// Interrupt Enable Flag (IF) - const RFLAGS_IF = 1 << 9, - /// Trap Flag (TF) - const RFLAGS_TF = 1 << 8, - /// Sign Flag (SF) - const RFLAGS_SF = 1 << 7, - /// Zero Flag (ZF) - const RFLAGS_ZF = 1 << 6, - /// Auxiliary Carry Flag (AF) - const RFLAGS_AF = 1 << 4, - /// Parity Flag (PF) - const RFLAGS_PF = 1 << 2, - /// Bit 1 is always 1. - const RFLAGS_A1 = 1 << 1, - /// Carry Flag (CF) - const RFLAGS_CF = 1 << 0, - } -} - -impl RFlags { - /// Creates a new RFlags entry. Ensures bit 1 is set. - pub fn new() -> RFlags { - RFLAGS_A1 - } -} diff --git a/src/bits64/tobba.rs b/src/bits64/tobba.rs deleted file mode 100644 index 3e3231e..0000000 --- a/src/bits64/tobba.rs +++ /dev/null @@ -1,17 +0,0 @@ -#![allow(non_upper_case_globals)] - -pub use shared::*; - -#[inline(always)] -pub fn get_flags() -> Flags { - unsafe { - let r: usize; - asm!("pushfq; pop $0" : "=r"(r) ::: "intel"); - Flags::from_bits_truncate(r) - } -} - -#[inline(always)] -pub unsafe fn set_flags(val: Flags) { - asm!("push $0; popfq" :: "r"(val.bits()) : "flags" : "volatile", "intel"); -} diff --git a/src/shared/flags.rs b/src/shared/flags.rs new file mode 100644 index 0000000..55dad6d --- /dev/null +++ b/src/shared/flags.rs @@ -0,0 +1,102 @@ +//! Processor state stored in the FLAGS, EFLAGS, or RFLAGS register. + +use shared::PrivilegeLevel; + +/// The RFLAGS register. All variants are backwards compatable so only one +/// bitflags struct needed. +bitflags! { + pub flags Flags: usize { + /// ID Flag (ID) + const FLAGS_ID = 1 << 21, + /// Virtual Interrupt Pending (VIP) + const FLAGS_VIP = 1 << 20, + /// Virtual Interrupt Flag (VIF) + const FLAGS_VIF = 1 << 19, + /// Alignment Check (AC) + const FLAGS_AC = 1 << 18, + /// Virtual-8086 Mode (VM) + const FLAGS_VM = 1 << 17, + /// Resume Flag (RF) + const FLAGS_RF = 1 << 16, + /// Nested Task (NT) + const FLAGS_NT = 1 << 14, + /// I/O Privilege Level (IOPL) 0 + const FLAGS_IOPL0 = 0 << 12, + /// I/O Privilege Level (IOPL) 1 + const FLAGS_IOPL1 = 1 << 12, + /// I/O Privilege Level (IOPL) 2 + const FLAGS_IOPL2 = 2 << 12, + /// I/O Privilege Level (IOPL) 3 + const FLAGS_IOPL3 = 3 << 12, + /// Overflow Flag (OF) + const FLAGS_OF = 1 << 11, + /// Direction Flag (DF) + const FLAGS_DF = 1 << 10, + /// Interrupt Enable Flag (IF) + const FLAGS_IF = 1 << 9, + /// Trap Flag (TF) + const FLAGS_TF = 1 << 8, + /// Sign Flag (SF) + const FLAGS_SF = 1 << 7, + /// Zero Flag (ZF) + const FLAGS_ZF = 1 << 6, + /// Auxiliary Carry Flag (AF) + const FLAGS_AF = 1 << 4, + /// Parity Flag (PF) + const FLAGS_PF = 1 << 2, + /// Bit 1 is always 1. + const FLAGS_A1 = 1 << 1, + /// Carry Flag (CF) + const FLAGS_CF = 1 << 0, + } +} + +impl Flags { + /// Creates a new Flags entry. Ensures bit 1 is set. + pub const fn new() -> Flags { + FLAGS_A1 + } + + /// Creates a new Flags with the given I/O privilege level. + pub const fn from_priv(iopl: PrivilegeLevel) -> Flags { + Flags { bits: (iopl as usize) << 12 } + } +} + +pub fn flags() -> Flags { + + #[cfg(target_arch="x86")] + #[inline(always)] + unsafe fn inner() -> Flags { + let r: usize; + asm!("pushfl; popl $0" : "=r"(r) :: "memory"); + Flags::from_bits_truncate(r) + } + + #[cfg(target_arch="x86_64")] + #[inline(always)] + unsafe fn inner() -> Flags { + let r: usize; + asm!("pushfq; popq $0" : "=r"(r) :: "memory"); + Flags::from_bits_truncate(r) + } + + unsafe { inner() } +} + +pub fn set(val: Flags) { + + #[cfg(target_arch="x86")] + #[inline(always)] + unsafe fn inner(val: Flags) { + asm!("pushl $0; popfl" :: "r"(val.bits()) : "memory" "flags"); + } + + #[cfg(target_arch="x86_64")] + #[inline(always)] + unsafe fn inner(val: Flags) { + asm!("pushq $0; popfq" :: "r"(val.bits()) : "memory" "flags"); + } + + unsafe { inner(val) } +} diff --git a/src/shared/mod.rs b/src/shared/mod.rs index d6190d0..167d7d3 100644 --- a/src/shared/mod.rs +++ b/src/shared/mod.rs @@ -6,32 +6,10 @@ pub mod dtables; pub mod io; pub mod irq; pub mod paging; +pub mod flags; pub mod segmentation; pub mod task; -bitflags! { - pub flags Flags: usize { - const CarryFlag = 1 << 0, - const ParityFlag = 1 << 2, - const AdjustFlag = 1 << 4, - const ZeroFlag = 1 << 6, - const SignFlag = 1 << 7, - const TrapFlag = 1 << 8, - const InterruptFlag = 1 << 9, - const DirectionFlag = 1 << 10, - const OverflowFlag = 1 << 11, - const Iopl1 = 1 << 12, - const Iopl2 = 1 << 13, - const NestedTaskFlag = 1 << 14, - const ResumeFlag = 1 << 16, - const Virtual8086Flag = 1 << 17, - const AlignmentFlag = 1 << 18, - const VirtualInterruptFlag = 1 << 19, - const VirtualInterruptPending = 1 << 20, - const CpuIdFlag = 1 << 21 - } -} - bitflags!( pub flags Features: u64 { const Fpu = 1 << 0, |