From 27b6e55b4214d9ebb38425da9be0a75c8a194fcc Mon Sep 17 00:00:00 2001 From: Erin Date: Sun, 4 Jun 2017 15:50:10 -0500 Subject: [PATCH] memory::paging::Table: type-system based table level safety --- src/arch/x86_64/memory/paging/table.rs | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/arch/x86_64/memory/paging/table.rs b/src/arch/x86_64/memory/paging/table.rs index b5ec2d5..a0a58be 100644 --- a/src/arch/x86_64/memory/paging/table.rs +++ b/src/arch/x86_64/memory/paging/table.rs @@ -1,12 +1,33 @@ +//! Representation and operations on page tables. + use core::ops::{Index, IndexMut}; +use core::marker::PhantomData; +use ::arch::x86_64::memory::FrameAllocator; use super::entry::*; use super::ENTRY_COUNT; -pub struct Table { +pub trait TableLevel {} +pub enum Level4 {} +pub enum Level3 {} +pub enum Level2 {} +pub enum Level1 {} +impl TableLevel for Level4 {} +impl TableLevel for Level3 {} +impl TableLevel for Level2 {} +impl TableLevel for Level1 {} +trait HierarchicalLevel: TableLevel {type NextLevel: TableLevel;} +impl HierarchicalLevel for Level4 {type NextLevel = Level3;} +impl HierarchicalLevel for Level3 {type NextLevel = Level2;} +impl HierarchicalLevel for Level2 {type NextLevel = Level1;} + +pub const P4: *mut Table = 0xffffffff_fffff000 as *mut _; + +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(); @@ -14,7 +35,8 @@ impl Table { } } -impl Index for Table { + +impl Index for Table where L: TableLevel { type Output = Entry; fn index(&self, index: usize) -> &Entry { @@ -22,7 +44,7 @@ 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] }