Browse Source

memory::paging::Table: type-system based table level safety

master
3moon 8 years ago
parent
commit
27b6e55b42
1 changed files with 26 additions and 4 deletions
  1. +26
    -4
      src/arch/x86_64/memory/paging/table.rs

+ 26
- 4
src/arch/x86_64/memory/paging/table.rs View File

@ -1,12 +1,33 @@
//! Representation and operations on page tables.
use core::ops::{Index, IndexMut}; use core::ops::{Index, IndexMut};
use core::marker::PhantomData;
use ::arch::x86_64::memory::FrameAllocator;
use super::entry::*; use super::entry::*;
use super::ENTRY_COUNT; 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<Level4> = 0xffffffff_fffff000 as *mut _;
pub struct Table<L: TableLevel> {
entries: [Entry; ENTRY_COUNT], entries: [Entry; ENTRY_COUNT],
level: PhantomData<L>,
} }
impl Table {
impl<L> Table<L> where L: TableLevel {
pub fn zero(&mut self) { pub fn zero(&mut self) {
for entry in self.entries.iter_mut() { for entry in self.entries.iter_mut() {
entry.set_unused(); entry.set_unused();
@ -14,7 +35,8 @@ impl Table {
} }
} }
impl Index<usize> for Table {
impl<L> Index<usize> for Table<L> where L: TableLevel {
type Output = Entry; type Output = Entry;
fn index(&self, index: usize) -> &Entry { fn index(&self, index: usize) -> &Entry {
@ -22,7 +44,7 @@ impl Index<usize> for Table {
} }
} }
impl IndexMut<usize> for Table {
impl<L> IndexMut<usize> for Table<L> where L: TableLevel {
fn index_mut(&mut self, index: usize) -> &mut Entry { fn index_mut(&mut self, index: usize) -> &mut Entry {
&mut self.entries[index] &mut self.entries[index]
} }


Loading…
Cancel
Save