1#![no_std]
4#![deny(warnings, missing_docs)]
5
6mod space;
7
8pub extern crate page_table;
9pub use space::AddressSpace;
10
11use core::ptr::NonNull;
12use page_table::{Pte, VmFlags, VmMeta, PPN};
13
14pub trait PageManager<Meta: VmMeta> {
16 fn new_root() -> Self;
18
19 fn root_ptr(&self) -> NonNull<Pte<Meta>>;
21
22 #[inline]
24 fn root_ppn(&self) -> PPN<Meta> {
25 self.v_to_p(self.root_ptr())
26 }
27
28 fn p_to_v<T>(&self, ppn: PPN<Meta>) -> NonNull<T>;
30
31 fn v_to_p<T>(&self, ptr: NonNull<T>) -> PPN<Meta>;
33
34 fn check_owned(&self, pte: Pte<Meta>) -> bool;
36
37 fn allocate(&mut self, len: usize, flags: &mut VmFlags<Meta>) -> NonNull<u8>;
39
40 fn deallocate(&mut self, pte: Pte<Meta>, len: usize) -> usize;
42
43 fn drop_root(&mut self);
45}