diff options
author | 2018-04-30 08:55:58 -0700 | |
---|---|---|
committer | 2018-04-30 08:55:58 -0700 | |
commit | b7f24e4505f96f98ea013ae35ddb10e0b3695567 (patch) | |
tree | 1918914fa337e2a03ae0aecafb664dad72ff3173 /src | |
parent | 57a2bfac28ce1e62ce1051b9de731d81e1c25a8b (diff) | |
download | rust-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.rs | 81 | ||||
-rw-r--r-- | src/bits64/segmentation.rs | 2 | ||||
-rw-r--r-- | src/dtables.rs | 14 | ||||
-rw-r--r-- | src/lib.rs | 1 | ||||
-rw-r--r-- | src/paging.rs | 54 | ||||
-rw-r--r-- | src/segmentation.rs | 2 |
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)". @@ -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)); |