aboutsummaryrefslogtreecommitdiff
path: root/src/bits64
diff options
context:
space:
mode:
Diffstat (limited to 'src/bits64')
-rw-r--r--src/bits64/mod.rs2
-rw-r--r--src/bits64/paging.rs16
-rw-r--r--src/bits64/rflags.rs2
-rw-r--r--src/bits64/segmentation.rs5
4 files changed, 15 insertions, 10 deletions
diff --git a/src/bits64/mod.rs b/src/bits64/mod.rs
index d72b732..6e2a1bd 100644
--- a/src/bits64/mod.rs
+++ b/src/bits64/mod.rs
@@ -21,4 +21,6 @@ pub mod paging;
pub mod segmentation;
pub mod task;
pub mod syscall;
+
+#[cfg(target_arch="x86-64")]
pub mod sgx;
diff --git a/src/bits64/paging.rs b/src/bits64/paging.rs
index 4ec8485..0fda00e 100644
--- a/src/bits64/paging.rs
+++ b/src/bits64/paging.rs
@@ -75,26 +75,26 @@ pub type PT = [PTEntry; 512];
/// Given virtual address calculate corresponding entry in PML4.
#[inline]
-pub fn pml4_index(addr: VAddr) -> usize {
- (addr.as_usize() >> 39) & 0b111111111
+pub fn pml4_index(addr: VAddr) -> u64 {
+ (addr.as_u64() >> 39) & 0b111111111
}
/// Given virtual address calculate corresponding entry in PDPT.
#[inline]
-pub fn pdpt_index(addr: VAddr) -> usize {
- (addr.as_usize() >> 30) & 0b111111111
+pub fn pdpt_index(addr: VAddr) -> u64 {
+ (addr.as_u64() >> 30) & 0b111111111
}
/// Given virtual address calculate corresponding entry in PD.
#[inline]
-pub fn pd_index(addr: VAddr) -> usize {
- (addr.as_usize() >> 21) & 0b111111111
+pub fn pd_index(addr: VAddr) -> u64 {
+ (addr.as_u64() >> 21) & 0b111111111
}
/// Given virtual address calculate corresponding entry in PT.
#[inline]
-pub fn pt_index(addr: VAddr) -> usize {
- (addr.as_usize() >> 12) & 0b111111111
+pub fn pt_index(addr: VAddr) -> u64 {
+ (addr.as_u64() >> 12) & 0b111111111
}
/// PML4 Entry bits description.
diff --git a/src/bits64/rflags.rs b/src/bits64/rflags.rs
index 69e85ee..937d3d3 100644
--- a/src/bits64/rflags.rs
+++ b/src/bits64/rflags.rs
@@ -67,12 +67,14 @@ impl RFlags {
}
}
+#[cfg(target_arch="x86-64")]
pub unsafe fn flags() -> RFlags {
let r: u64;
asm!("pushfq; popq $0" : "=r"(r) :: "memory");
RFlags::from_bits_truncate(r)
}
+#[cfg(target_arch="x86-64")]
pub unsafe fn set(val: RFlags) {
asm!("pushq $0; popfq" :: "r"(val.bits()) : "memory" "flags");
}
diff --git a/src/bits64/segmentation.rs b/src/bits64/segmentation.rs
index 93ac2aa..4c440e9 100644
--- a/src/bits64/segmentation.rs
+++ b/src/bits64/segmentation.rs
@@ -10,6 +10,7 @@ use bits64::task::*;
/// to %cs. Instead we push the new segment selector
/// and return value on the stack and use lretq
/// to reload cs and continue at 1:.
+#[cfg(target_arch="x86-64")]
pub unsafe fn set_cs(sel: SegmentSelector) {
asm!("pushq $0; \
leaq 1f(%rip), %rax; \
@@ -33,7 +34,7 @@ impl SegmentBitness {
}
impl SegmentDescriptor {
- pub fn new_memory(base: u32, limit: u32, ty: Type, accessed: bool, dpl: PrivilegeLevel, bitness: SegmentBitness) -> SegmentDescriptor {
+ pub fn new_memory64(base: u32, limit: u32, ty: Type, accessed: bool, dpl: PrivilegeLevel, bitness: SegmentBitness) -> SegmentDescriptor {
let ty1 = descriptor::Type::SegmentDescriptor {
ty: ty,
accessed: accessed,
@@ -43,7 +44,7 @@ impl SegmentDescriptor {
seg
}
- pub fn new_tss(tss: &TaskStateSegment, dpl: PrivilegeLevel) -> [SegmentDescriptor; 2] {
+ pub fn new_tss64(tss: &TaskStateSegment, dpl: PrivilegeLevel) -> [SegmentDescriptor; 2] {
let tss_ptr = tss as *const TaskStateSegment;
let ty1 = descriptor::Type::SystemDescriptor {
size: true,