From d267ac1c98e996da154811c4e83a10b2730c0503 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Wed, 9 Dec 2015 00:21:10 +0100 Subject: [PATCH] Define the next_table methods only for P4, P3, and P2 tables --- src/memory/paging/table.rs | 50 ++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/src/memory/paging/table.rs b/src/memory/paging/table.rs index 4ede5f9e..baad8523 100644 --- a/src/memory/paging/table.rs +++ b/src/memory/paging/table.rs @@ -1,20 +1,26 @@ use memory::paging::entry::*; use memory::paging::ENTRY_COUNT; use core::ops::{Index, IndexMut}; +use core::marker::PhantomData; -pub const P4: *mut Table = 0xffffffff_fffff000 as *mut _; +pub const P4: *mut Table = 0xffffffff_fffff000 as *mut _; -pub struct Table { +pub struct Table { entries: [Entry; ENTRY_COUNT], + level: PhantomData, } -impl Table { +impl Table where L: TableLevel +{ pub fn zero(&mut self) { for entry in self.entries.iter_mut() { entry.set_unused(); } } +} +impl Table where L: HierachicalLevel +{ fn next_table_address(&self, index: usize) -> Option { let entry_flags = self[index].flags(); if entry_flags.contains(PRESENT) && !entry_flags.contains(HUGE_PAGE) { @@ -25,18 +31,19 @@ impl Table { } } - pub unsafe fn next_table(&self, index: usize) -> Option<&Table> { + pub 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> { + pub 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 { +impl Index for Table where L: TableLevel +{ type Output = Entry; fn index(&self, index: usize) -> &Entry { @@ -44,8 +51,37 @@ impl Index for Table { } } -impl IndexMut for Table { +impl IndexMut for Table where L: TableLevel +{ fn index_mut(&mut self, index: usize) -> &mut Entry { &mut self.entries[index] } } + +pub trait TableLevel {} + +pub enum Level4 {} +enum Level3 {} +enum Level2 {} +enum Level1 {} + +impl TableLevel for Level4 {} +impl TableLevel for Level3 {} +impl TableLevel for Level2 {} +impl TableLevel for Level1 {} + +trait HierachicalLevel: TableLevel { + type NextLevel: TableLevel; +} + +impl HierachicalLevel for Level4 { + type NextLevel = Level3; +} + +impl HierachicalLevel for Level3 { + type NextLevel = Level2; +} + +impl HierachicalLevel for Level2 { + type NextLevel = Level1; +}