page_walker/walkers/
reader.rs1use core::marker::PhantomData;
5use core::ops::Range;
6use crate::address_space::PageTableMapper;
7use crate::PteType;
8use num_traits::{FromPrimitive, PrimInt, Unsigned};
9
10pub struct PteReader<'a, PTE, Mapper, Error>
16where
17 PTE: FromPrimitive + PrimInt + Unsigned,
18 Mapper: PageTableMapper<PTE, Error>,
19{
20 pub mapper: &'a Mapper,
22 pub pte: Option<PTE>,
24 pub error: PhantomData<Error>,
26}
27
28impl<'a, PTE, Mapper, Error> crate::PageWalker<PTE, Error> for PteReader<'a, PTE, Mapper, Error>
29where
30 PTE: FromPrimitive + PrimInt + Unsigned,
31 Mapper: PageTableMapper<PTE, Error>,
32{
33 fn read_pte(&self, phys_addr: PTE) -> Result<PTE, Error> {
35 self.mapper.read_pte(phys_addr)
36 }
37
38 fn handle_pte(&mut self, pte_type: PteType, _range: Range<usize>, pte: &PTE) -> Result<(), Error> {
40 if pte_type.is_page() {
41 self.pte = Some(*pte);
42 }
43
44 Ok(())
45 }
46}