use core::marker::PhantomData;
use core::ops::Range;
use crate::address_space::PageTableMapper;
use crate::PteType;
use num_traits::{FromPrimitive, PrimInt, Unsigned};
pub struct PteWriter<'a, PTE, Mapper, Error>
where
PTE: FromPrimitive + PrimInt + Unsigned,
Mapper: PageTableMapper<PTE, Error>,
{
pub mapper: &'a mut Mapper,
pub pte: PTE,
pub error: PhantomData<Error>,
}
impl<'a, PTE, Mapper, Error> crate::PageWalkerMut<PTE, Error> for PteWriter<'a, PTE, Mapper, Error>
where
PTE: FromPrimitive + PrimInt + Unsigned,
Mapper: PageTableMapper<PTE, Error>,
{
fn read_pte(&self, phys_addr: PTE) -> Result<PTE, Error> {
self.mapper.read_pte(phys_addr)
}
fn write_pte(&mut self, phys_addr: PTE, value: PTE) -> Result<(), Error> {
self.mapper.write_pte(phys_addr, value)
}
fn handle_pte(&mut self, pte_type: PteType, _range: Range<usize>, pte: &mut PTE) -> Result<(), Error> {
if let PteType::Page(_) = pte_type {
*pte = self.pte;
}
Ok(())
}
}