pub enum Child<C: PageTableConfig> {
PageTable(PageTableNode<C>),
Frame(Paddr, PagingLevel, PageProperty),
None,
}Expand description
A page table entry that owns the child of a page table node if present.
Variants§
PageTable(PageTableNode<C>)
A child page table node.
Frame(Paddr, PagingLevel, PageProperty)
Physical address of a mapped physical frame.
It is associated with the virtual page property and the level of the mapping node, which decides the size of the frame.
None
Implementations§
Source§impl<C: PageTableConfig> Child<C>
impl<C: PageTableConfig> Child<C>
pub fn arrow_2(self) -> PageProperty
pub fn arrow_1(self) -> PagingLevel
pub fn arrow_PageTable_0(self) -> PageTableNode<C>
pub fn arrow_Frame_0(self) -> Paddr
pub fn arrow_Frame_1(self) -> PagingLevel
pub fn arrow_Frame_2(self) -> PageProperty
Source§impl<C: PageTableConfig> Child<C>
impl<C: PageTableConfig> Child<C>
Sourcepub open spec fn get_node(self) -> Option<PageTableNode<C>>
pub open spec fn get_node(self) -> Option<PageTableNode<C>>
{
match self {
Self::PageTable(node) => Some(node),
_ => None,
}
}Sourcepub open spec fn get_frame_tuple(self) -> Option<(Paddr, PagingLevel, PageProperty)>
pub open spec fn get_frame_tuple(self) -> Option<(Paddr, PagingLevel, PageProperty)>
{
match self {
Self::Frame(paddr, level, prop) => Some((paddr, level, prop)),
_ => None,
}
}Source§impl<C: PageTableConfig> Child<C>
impl<C: PageTableConfig> Child<C>
Sourcepub exec fn into_pte(self) -> res : C::E
pub exec fn into_pte(self) -> res : C::E
with
Tracked(owner): Tracked <& EntryOwner <C>>,
Tracked(regions): Tracked <& mut MetaRegionOwners>,requiresowner.inv(),old(regions).inv(),self.wf(*owner),ensuresregions.inv(),res.paddr() % PAGE_SIZE() == 0,res.paddr() < MAX_PADDR(),owner.match_pte(res, owner.parent_level),Sourcepub exec fn from_pte(pte: C::E, level: PagingLevel) -> res : Self
pub exec fn from_pte(pte: C::E, level: PagingLevel) -> res : Self
with
Tracked(regions): Tracked <& mut MetaRegionOwners>,
Tracked(entry_own): Tracked <& EntryOwner <C>>,requirespte.paddr() % PAGE_SIZE() == 0,pte.paddr() < MAX_PADDR(),old(regions).inv(),entry_own.inv(),entry_own.is_node() ==> entry_own.node.unwrap().relate_region(*old(regions)),ensuresregions.inv(),res.wf(*entry_own),!pte.is_present() ==> res == Child::<C>::None,pte.is_present() && pte.is_last(level)
==> res == Child::<C>::from_pte_frame_spec(pte, level),pte.is_present() && !pte.is_last(level)
==> res == Child::<C>::from_pte_pt_spec(pte.paddr(), *regions),entry_own.is_node() ==> entry_own.node.unwrap().relate_region(*regions),§Safety
The provided PTE must be the output of Self::into_pte, and the PTE:
The level must match the original level of the child.
Source§impl<C: PageTableConfig> Child<C>
impl<C: PageTableConfig> Child<C>
Sourcepub open spec fn into_pte_pt_spec(self, slot_own: MetaSlotOwner) -> C::E
pub open spec fn into_pte_pt_spec(self, slot_own: MetaSlotOwner) -> C::E
{ C::E::new_pt_spec(meta_to_frame(slot_own.self_addr)) }Sourcepub open spec fn into_pte_frame_spec(
self,
tuple: (Paddr, PagingLevel, PageProperty),
) -> C::E
pub open spec fn into_pte_frame_spec( self, tuple: (Paddr, PagingLevel, PageProperty), ) -> C::E
{
let (paddr, level, prop) = tuple;
C::E::new_page_spec(paddr, level, prop)
}Sourcepub open spec fn into_pte_none_spec(self) -> C::E
pub open spec fn into_pte_none_spec(self) -> C::E
{ C::E::new_absent_spec() }Sourcepub open spec fn from_pte_frame_spec(pte: C::E, level: PagingLevel) -> Self
pub open spec fn from_pte_frame_spec(pte: C::E, level: PagingLevel) -> Self
{ Self::Frame(pte.paddr(), level, pte.prop()) }Sourcepub open spec fn from_pte_pt_spec(paddr: Paddr, regions: MetaRegionOwners) -> Self
pub open spec fn from_pte_pt_spec(paddr: Paddr, regions: MetaRegionOwners) -> Self
{ Self::PageTable(PageTableNode::from_raw_spec(paddr)) }Trait Implementations§
Source§impl<C: PageTableConfig> OwnerOf for Child<C>
impl<C: PageTableConfig> OwnerOf for Child<C>
Source§open spec fn wf(self, owner: Self::Owner) -> bool
open spec fn wf(self, owner: Self::Owner) -> bool
{
match self {
Self::PageTable(node) => (
&&& owner.is_node()
&&& node.ptr.addr() == owner.node.unwrap().meta_perm.addr()
),
Self::Frame(paddr, level, prop) => (
&&& owner.is_frame()
&&& owner.frame.unwrap().mapped_pa == paddr
&&& owner.frame.unwrap().prop == prop
&&& level == owner.parent_level
),
Self::None => owner.is_absent(),
}
}Source§type Owner = EntryOwner<C>
type Owner = EntryOwner<C>
The owner of the concrete type.
The Owner must implement
Inv, indicating that it must
has a consistent state.Auto Trait Implementations§
impl<C> Freeze for Child<C>
impl<C> !RefUnwindSafe for Child<C>
impl<C> Send for Child<C>
impl<C> Sync for Child<C>
impl<C> Unpin for Child<C>where
C: Unpin,
impl<C> UnwindSafe for Child<C>where
C: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more