From 3bb62e4dc4ae7e07ba8a373e804c86b96137f2ec Mon Sep 17 00:00:00 2001 From: Erin Date: Sun, 4 Jun 2017 15:54:12 -0500 Subject: [PATCH] memory::paging::Page: impl useful functions --- src/arch/x86_64/memory/paging/mod.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/arch/x86_64/memory/paging/mod.rs b/src/arch/x86_64/memory/paging/mod.rs index 7cd63be..99c123e 100644 --- a/src/arch/x86_64/memory/paging/mod.rs +++ b/src/arch/x86_64/memory/paging/mod.rs @@ -40,3 +40,32 @@ impl ActivePageTable { pub struct Page { index: usize, } + +impl Page { + /// Retrieves the page containing a given virtual address. + pub fn containing_address(address: VirtualAddress) -> Page { + assert!(address < 0x0000_8000_0000_0000 || + address >= 0xffff_8000_0000_0000, + "invalid address: 0x{:x}", address); + + Page { index: address / PAGE_SIZE } + } + + /// Returns the start (virtual) address of a page + pub fn start_address(&self) -> VirtualAddress { + self.index * PAGE_SIZE + } + + fn p4_index(&self) -> usize { + (self.index >> 27) & 0o777 + } + fn p3_index(&self) -> usize { + (self.index >> 18) & 0o777 + } + fn p2_index(&self) -> usize { + (self.index >> 9) & 0o777 + } + fn p1_index(&self) -> usize { + (self.index >> 0) & 0o777 + } +}