aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Gerd Zellweger <mail@gerdzellweger.com> 2018-04-30 08:55:58 -0700
committerGravatar Gerd Zellweger <mail@gerdzellweger.com> 2018-04-30 08:55:58 -0700
commitb7f24e4505f96f98ea013ae35ddb10e0b3695567 (patch)
tree1918914fa337e2a03ae0aecafb664dad72ff3173 /src
parent57a2bfac28ce1e62ce1051b9de731d81e1c25a8b (diff)
downloadrust-x86-b7f24e4505f96f98ea013ae35ddb10e0b3695567.tar.gz
rust-x86-b7f24e4505f96f98ea013ae35ddb10e0b3695567.tar.zst
rust-x86-b7f24e4505f96f98ea013ae35ddb10e0b3695567.zip
Git rid of mostly too complex x86 types.
Signed-off-by: Gerd Zellweger <mail@gerdzellweger.com>
Diffstat (limited to 'src')
-rw-r--r--src/bits64/paging.rs81
-rw-r--r--src/bits64/segmentation.rs2
-rw-r--r--src/dtables.rs14
-rw-r--r--src/lib.rs1
-rw-r--r--src/paging.rs54
-rw-r--r--src/segmentation.rs2
6 files changed, 35 insertions, 119 deletions
diff --git a/src/bits64/paging.rs b/src/bits64/paging.rs
index ee30f79..5a8068e 100644
--- a/src/bits64/paging.rs
+++ b/src/bits64/paging.rs
@@ -1,53 +1,8 @@
//! Description of the data-structures for IA-32e paging mode.
-use core::fmt;
-
-use ::paging::*;
-
/// Represents a physical memory address
-#[derive(Copy, Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
-pub struct PAddr(u64);
-
-impl PAddr {
- /// Convert to `u64`
- pub const fn as_u64(&self) -> u64 {
- self.0
- }
- /// Convert from `u64`
- pub const fn from_u64(v: u64) -> Self {
- PAddr(v)
- }
-}
-
-impl fmt::Binary for PAddr {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.0.fmt(f)
- }
-}
-
-impl fmt::Display for PAddr {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.0.fmt(f)
- }
-}
-
-impl fmt::LowerHex for PAddr {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.0.fmt(f)
- }
-}
-
-impl fmt::Octal for PAddr {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.0.fmt(f)
- }
-}
-
-impl fmt::UpperHex for PAddr {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.0.fmt(f)
- }
-}
+pub type PAddr = u64;
+pub type VAddr = usize;
pub const BASE_PAGE_SIZE: u64 = 4096; // 4 KiB
pub const LARGE_PAGE_SIZE: u64 = 1024 * 1024 * 2; // 2 MiB
@@ -75,26 +30,26 @@ pub type PT = [PTEntry; 512];
/// Given virtual address calculate corresponding entry in PML4.
#[inline]
-pub fn pml4_index(addr: VAddr) -> u64 {
- (addr.as_u64() >> 39) & 0b111111111
+pub fn pml4_index(addr: VAddr) -> usize {
+ (addr >> 39) & 0b111111111
}
/// Given virtual address calculate corresponding entry in PDPT.
#[inline]
-pub fn pdpt_index(addr: VAddr) -> u64 {
- (addr.as_u64() >> 30) & 0b111111111
+pub fn pdpt_index(addr: VAddr) -> usize {
+ (addr >> 30) & 0b111111111
}
/// Given virtual address calculate corresponding entry in PD.
#[inline]
-pub fn pd_index(addr: VAddr) -> u64 {
- (addr.as_u64() >> 21) & 0b111111111
+pub fn pd_index(addr: VAddr) -> usize {
+ (addr >> 21) & 0b111111111
}
/// Given virtual address calculate corresponding entry in PT.
#[inline]
-pub fn pt_index(addr: VAddr) -> u64 {
- (addr.as_u64() >> 12) & 0b111111111
+pub fn pt_index(addr: VAddr) -> usize {
+ (addr >> 12) & 0b111111111
}
/// PML4 Entry bits description.
@@ -131,14 +86,14 @@ impl PML4Entry {
/// * `pdpt` - The physical address of the pdpt table.
/// * `flags`- Additional flags for the entry.
pub fn new(pdpt: PAddr, flags: PML4Entry) -> PML4Entry {
- let pdpt_val = pdpt.as_u64();
+ let pdpt_val = pdpt;
assert!(pdpt_val % BASE_PAGE_SIZE == 0);
PML4Entry { bits: pdpt_val | flags.bits }
}
/// Retrieves the physical address in this entry.
pub fn get_address(self) -> PAddr {
- PAddr::from_u64(self.bits & ADDRESS_MASK)
+ self.bits & ADDRESS_MASK
}
check_flag!(doc = "Is page present?", is_present, PML4Entry::P);
@@ -197,14 +152,14 @@ impl PDPTEntry {
/// * `pd` - The physical address of the page directory.
/// * `flags`- Additional flags for the entry.
pub fn new(pd: PAddr, flags: PDPTEntry) -> PDPTEntry {
- let pd_val = pd.as_u64();
+ let pd_val = pd;
assert!(pd_val % BASE_PAGE_SIZE == 0);
PDPTEntry { bits: pd_val | flags.bits }
}
/// Retrieves the physical address in this entry.
pub fn get_address(self) -> PAddr {
- PAddr::from_u64(self.bits & ADDRESS_MASK)
+ self.bits & ADDRESS_MASK
}
check_flag!(doc = "Is page present?", is_present, PDPTEntry::P);
@@ -265,14 +220,14 @@ impl PDEntry {
/// * `pt` - The physical address of the page table.
/// * `flags`- Additional flags for the entry.
pub fn new(pt: PAddr, flags: PDEntry) -> PDEntry {
- let pt_val = pt.as_u64();
+ let pt_val = pt;
assert!(pt_val % BASE_PAGE_SIZE == 0);
PDEntry { bits: pt_val | flags.bits }
}
/// Retrieves the physical address in this entry.
pub fn get_address(self) -> PAddr {
- PAddr::from_u64(self.bits & ADDRESS_MASK)
+ self.bits & ADDRESS_MASK
}
check_flag!(doc = "Present; must be 1 to map a 2-MByte page or reference a page table.",
@@ -333,14 +288,14 @@ impl PTEntry {
/// * `page` - The physical address of the backing 4 KiB page.
/// * `flags`- Additional flags for the entry.
pub fn new(page: PAddr, flags: PTEntry) -> PTEntry {
- let page_val = page.as_u64();
+ let page_val = page;
assert!(page_val % BASE_PAGE_SIZE == 0);
PTEntry { bits: page_val | flags.bits }
}
/// Retrieves the physical address in this entry.
pub fn get_address(self) -> PAddr {
- PAddr::from_u64(self.bits & ADDRESS_MASK)
+ self.bits & ADDRESS_MASK
}
check_flag!(doc = "Present; must be 1 to map a 4-KByte page or reference a page table.",
diff --git a/src/bits64/segmentation.rs b/src/bits64/segmentation.rs
index 0c03780..bf39a82 100644
--- a/src/bits64/segmentation.rs
+++ b/src/bits64/segmentation.rs
@@ -16,6 +16,8 @@ pub struct Descriptor64 {
impl Descriptor64 {
+ pub const NULL: Descriptor64 = Descriptor64 { desc32: Descriptor::NULL, lower: 0, upper: 0 };
+
pub(crate) fn apply_builder_settings(&mut self, builder: &DescriptorBuilder) {
self.desc32.apply_builder_settings(builder);
builder.base_limit.map(|(base, limit)| self.set_base_limit(base, limit));
diff --git a/src/dtables.rs b/src/dtables.rs
index 43eb13b..bdc3d9c 100644
--- a/src/dtables.rs
+++ b/src/dtables.rs
@@ -13,7 +13,19 @@ pub struct DescriptorTablePointer<Entry> {
}
impl<T> DescriptorTablePointer<T> {
- pub fn new(slice: &[T]) -> Self {
+ pub fn new(tbl: &T) -> Self {
+ // GDT, LDT, and IDT all expect the limit to be set to "one less".
+ // See Intel 3a, Section 3.5.1 "Segment Descriptor Tables" and
+ // Section 6.10 "Interrupt Descriptor Table (IDT)".
+ let len = size_of::<T>() - 1;
+ assert!(len < 0x10000);
+ DescriptorTablePointer {
+ base: tbl as *const T,
+ limit: len as u16,
+ }
+ }
+
+ pub fn new_from_slice(slice: &[T]) -> Self {
// GDT, LDT, and IDT all expect the limit to be set to "one less".
// See Intel 3a, Section 3.5.1 "Segment Descriptor Tables" and
// Section 6.10 "Interrupt Descriptor Table (IDT)".
diff --git a/src/lib.rs b/src/lib.rs
index 9458f2d..851fddb 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -36,7 +36,6 @@ pub mod dtables;
pub mod io;
pub mod irq;
pub mod msr;
-pub mod paging;
pub mod segmentation;
pub mod task;
pub mod tlb;
diff --git a/src/paging.rs b/src/paging.rs
deleted file mode 100644
index 06c86aa..0000000
--- a/src/paging.rs
+++ /dev/null
@@ -1,54 +0,0 @@
-//! Description of the data-structures for IA-32e paging mode.
-
-use core::fmt;
-
-/// Represent a virtual (linear) memory address
-#[derive(Copy, Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
-pub struct VAddr(usize);
-
-impl VAddr {
- /// Convert to `usize`
- pub const fn as_usize(&self) -> usize {
- self.0
- }
-
- /// Convert from `usize`
- pub const fn from_usize(v: usize) -> Self {
- VAddr(v)
- }
-
- pub const fn as_u64(&self) -> u64 {
- self.0 as u64
- }
-
-}
-
-impl fmt::Binary for VAddr {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.0.fmt(f)
- }
-}
-
-impl fmt::Display for VAddr {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.0.fmt(f)
- }
-}
-
-impl fmt::LowerHex for VAddr {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.0.fmt(f)
- }
-}
-
-impl fmt::Octal for VAddr {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.0.fmt(f)
- }
-}
-
-impl fmt::UpperHex for VAddr {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- self.0.fmt(f)
- }
-}
diff --git a/src/segmentation.rs b/src/segmentation.rs
index 6f17c75..f91a6ec 100644
--- a/src/segmentation.rs
+++ b/src/segmentation.rs
@@ -374,6 +374,8 @@ pub struct Descriptor {
impl Descriptor {
+ pub const NULL: Descriptor = Descriptor { lower: 0, upper: 0 };
+
pub(crate) fn apply_builder_settings(&mut self, builder: &DescriptorBuilder) {
builder.dpl.map(|ring| self.set_dpl(ring));
builder.base_limit.map(|(base, limit)| self.set_base_limit(base as u32, limit as u32));