From e5a4114262731a720d17179a20469f05372ce2a5 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 9 Dec 2015 00:12:55 +0100 Subject: [PATCH] Add unsafe next_table methods --- src/memory/paging/table.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/memory/paging/table.rs b/src/memory/paging/table.rs index 41d92742..4ede5f9e 100644 --- a/src/memory/paging/table.rs +++ b/src/memory/paging/table.rs @@ -14,6 +14,26 @@ impl Table { entry.set_unused(); } } + + fn next_table_address(&self, index: usize) -> Option { + let entry_flags = self[index].flags(); + if entry_flags.contains(PRESENT) && !entry_flags.contains(HUGE_PAGE) { + let table_address = self as *const _ as usize; + Some((table_address << 9) | (index << 12)) + } else { + None + } + } + + pub unsafe fn next_table(&self, index: usize) -> Option<&Table> { + self.next_table_address(index) + .map(|t| unsafe { &*(t as *const _) }) + } + + pub unsafe fn next_table_mut(&mut self, index: usize) -> Option<&mut Table> { + self.next_table_address(index) + .map(|t| unsafe { &mut *(t as *mut _) }) + } } impl Index for Table {