diff --git a/src/arch/emulate.rs b/src/arch/emulate.rs index 2e290b6810..c4210d631e 100644 --- a/src/arch/emulate.rs +++ b/src/arch/emulate.rs @@ -19,6 +19,7 @@ impl Arch for EmulateArch { const PAGE_ENTRY_SHIFT: usize = X8664Arch::PAGE_ENTRY_SHIFT; const PAGE_LEVELS: usize = X8664Arch::PAGE_LEVELS; + const ENTRY_ADDRESS_SHIFT: usize = X8664Arch::ENTRY_ADDRESS_SHIFT; const ENTRY_FLAG_PRESENT: usize = X8664Arch::ENTRY_FLAG_PRESENT; const ENTRY_FLAG_WRITABLE: usize = X8664Arch::ENTRY_FLAG_WRITABLE; const ENTRY_FLAG_USER: usize = X8664Arch::ENTRY_FLAG_USER; diff --git a/src/arch/mod.rs b/src/arch/mod.rs index 3b9075fb39..1dbd31a096 100644 --- a/src/arch/mod.rs +++ b/src/arch/mod.rs @@ -10,6 +10,7 @@ pub trait Arch { const PAGE_ENTRY_SHIFT: usize; const PAGE_LEVELS: usize; + const ENTRY_ADDRESS_SHIFT: usize; const ENTRY_FLAG_PRESENT: usize; const ENTRY_FLAG_WRITABLE: usize; const ENTRY_FLAG_USER: usize; @@ -21,13 +22,13 @@ pub trait Arch { const PAGE_OFFSET_MASK: usize = Self::PAGE_SIZE - 1; 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_ADDRESS_MASK: usize = Self::PAGE_ADDRESS_SIZE - Self::PAGE_SIZE; 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_ADDRESS_SIZE: usize = 1 << Self::ENTRY_ADDRESS_SHIFT; + const ENTRY_ADDRESS_MASK: usize = Self::ENTRY_ADDRESS_SIZE - Self::PAGE_SIZE; const ENTRY_FLAGS_MASK: usize = !Self::ENTRY_ADDRESS_MASK; unsafe fn init() -> &'static [MemoryArea]; diff --git a/src/arch/x86_64.rs b/src/arch/x86_64.rs index 41d674d949..6197e7cf54 100644 --- a/src/arch/x86_64.rs +++ b/src/arch/x86_64.rs @@ -10,6 +10,7 @@ impl Arch for X8664Arch { const PAGE_ENTRY_SHIFT: usize = 9; // 512 entries, 8 bytes each const PAGE_LEVELS: usize = 4; // PML4, PDP, PD, PT + const ENTRY_ADDRESS_SHIFT: usize = 52; const ENTRY_FLAG_PRESENT: usize = 1 << 0; const ENTRY_FLAG_WRITABLE: usize = 1 << 1; const ENTRY_FLAG_USER: usize = 1 << 2; @@ -62,7 +63,8 @@ mod tests { 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); + assert_eq!(X8664Arch::ENTRY_ADDRESS_SIZE, 0x0010_0000_0000_0000); + assert_eq!(X8664Arch::ENTRY_ADDRESS_MASK, 0x000F_FFFF_FFFF_F000); + assert_eq!(X8664Arch::ENTRY_FLAGS_MASK, 0xFFF0_0000_0000_0FFF); } }