From 2df212f48d027f52f36200aa2dd0fd69316fcdcc Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sun, 6 Sep 2020 13:00:01 -0600 Subject: [PATCH] Add tests to ensure correct constant calculation --- src/arch/mod.rs | 5 ++++- src/arch/x86_64.rs | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/arch/mod.rs b/src/arch/mod.rs index c7a8bf0bb9..3b9075fb39 100644 --- a/src/arch/mod.rs +++ b/src/arch/mod.rs @@ -19,11 +19,14 @@ pub trait Arch { const PAGE_SIZE: usize = 1 << Self::PAGE_SHIFT; const PAGE_OFFSET_MASK: usize = Self::PAGE_SIZE - 1; - const PAGE_ADDRESS_MASK: usize = !Self::PAGE_OFFSET_MASK; + const PAGE_ADDRESS_SHIFT: usize = Self::PAGE_LEVELS * Self::PAGE_ENTRY_SHIFT + Self::PAGE_SHIFT; + const PAGE_ADDRESS_SIZE: usize = 1 << Self::PAGE_ADDRESS_SHIFT; + const PAGE_ADDRESS_MASK: usize = Self::PAGE_ADDRESS_SIZE - 1 - Self::PAGE_OFFSET_MASK; const PAGE_ENTRY_SIZE: usize = 1 << (Self::PAGE_SHIFT - Self::PAGE_ENTRY_SHIFT); const PAGE_ENTRIES: usize = 1 << Self::PAGE_ENTRY_SHIFT; const PAGE_ENTRY_MASK: usize = Self::PAGE_ENTRIES - 1; + //TODO: allow this to differ from page address mask const ENTRY_ADDRESS_MASK: usize = Self::PAGE_ADDRESS_MASK; const ENTRY_FLAGS_MASK: usize = !Self::ENTRY_ADDRESS_MASK; diff --git a/src/arch/x86_64.rs b/src/arch/x86_64.rs index 3554304759..41d674d949 100644 --- a/src/arch/x86_64.rs +++ b/src/arch/x86_64.rs @@ -45,3 +45,24 @@ impl Arch for X8664Arch { unimplemented!(); } } + +#[cfg(test)] +mod tests { + use crate::Arch; + use super::X8664Arch; + + #[test] + fn constants() { + assert_eq!(X8664Arch::PAGE_SIZE, 4096); + assert_eq!(X8664Arch::PAGE_OFFSET_MASK, 0xFFF); + assert_eq!(X8664Arch::PAGE_ADDRESS_SHIFT, 48); + assert_eq!(X8664Arch::PAGE_ADDRESS_SIZE, 0x0001_0000_0000_0000); + assert_eq!(X8664Arch::PAGE_ADDRESS_MASK, 0x0000_FFFF_FFFF_F000); + assert_eq!(X8664Arch::PAGE_ENTRY_SIZE, 8); + assert_eq!(X8664Arch::PAGE_ENTRIES, 512); + assert_eq!(X8664Arch::PAGE_ENTRY_MASK, 0x1FF); + + assert_eq!(X8664Arch::ENTRY_ADDRESS_MASK, 0x0000_FFFF_FFFF_F000); + assert_eq!(X8664Arch::ENTRY_FLAGS_MASK, 0xFFFF_0000_0000_0FFF); + } +}