Add unsafe next_table methods

This commit is contained in:
Philipp Oppermann
2015-12-09 00:12:55 +01:00
parent e071c24680
commit e5a4114262

View File

@@ -14,6 +14,26 @@ impl Table {
entry.set_unused(); entry.set_unused();
} }
} }
fn next_table_address(&self, index: usize) -> Option<usize> {
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<usize> for Table { impl Index<usize> for Table {