use axhal::paging::{MappingFlags, PageTable};
use memory_addr::VirtAddr;
use memory_set::MappingBackend;
mod alloc;
mod linear;
#[derive(Clone)]
pub enum Backend {
Linear {
pa_va_offset: usize,
},
Alloc {
populate: bool,
},
}
impl MappingBackend for Backend {
type Addr = VirtAddr;
type Flags = MappingFlags;
type PageTable = PageTable;
fn map(&self, start: VirtAddr, size: usize, flags: MappingFlags, pt: &mut PageTable) -> bool {
match *self {
Self::Linear { pa_va_offset } => self.map_linear(start, size, flags, pt, pa_va_offset),
Self::Alloc { populate } => self.map_alloc(start, size, flags, pt, populate),
}
}
fn unmap(&self, start: VirtAddr, size: usize, pt: &mut PageTable) -> bool {
match *self {
Self::Linear { pa_va_offset } => self.unmap_linear(start, size, pt, pa_va_offset),
Self::Alloc { populate } => self.unmap_alloc(start, size, pt, populate),
}
}
fn protect(
&self,
start: Self::Addr,
size: usize,
new_flags: Self::Flags,
page_table: &mut Self::PageTable,
) -> bool {
page_table
.cursor()
.protect_region(start, size, new_flags)
.is_ok()
}
}
impl Backend {
pub(crate) fn handle_page_fault(
&self,
vaddr: VirtAddr,
orig_flags: MappingFlags,
page_table: &mut PageTable,
) -> bool {
match *self {
Self::Linear { .. } => false, Self::Alloc { populate } => {
self.handle_page_fault_alloc(vaddr, orig_flags, page_table, populate)
}
}
}
}