aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar John Ericson <Ericson2314@Yahoo.com> 2016-06-29 22:51:56 -0700
committerGravatar John Ericson <Ericson2314@Yahoo.com> 2016-07-01 14:50:29 -0700
commit5de84ea5c3e5e683eb112b9fff52bd86e3e9e817 (patch)
treee880056ff5fd46911d2c9c0eadf844170ffd8265
parent59db19be0ce5308595c2b52e455803bbe9da8ec9 (diff)
downloadrust-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.rs18
-rw-r--r--src/bits64/mod.rs3
-rw-r--r--src/bits64/rflags.rs56
-rw-r--r--src/bits64/tobba.rs17
-rw-r--r--src/shared/flags.rs102
-rw-r--r--src/shared/mod.rs24
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,