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_1(self) -> PagingLevel
pub fn arrow_2(self) -> PageProperty
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 exec fn into_pte(self) -> res : C::E
pub exec fn into_pte(self) -> res : C::E
with
Tracked(owner): Tracked<&mut EntryOwner<C>>,
Tracked(regions): Tracked<&mut MetaRegionOwners>,requiresself.invariants(*old(owner), *old(regions)),old(owner).in_scope,ensuresowner.pte_invariants(res, *regions),*regions == old(owner).into_pte_regions_spec(*old(regions)),*owner == old(owner).into_pte_owner_spec(),old(owner).node is Some
==> res
== C::E::new_pt_spec(meta_to_frame(old(owner).node.unwrap().meta_perm.addr())),Converts the child to a raw PTE value.
§Verified Properties
§Preconditions
- Safety Invariants: all safety invariants must hold on the child.
- Safety: the entry’s must be marked as a child, which implies that it has a
raw_countof 0.
§Postconditions
- Safety Invariants: the
PTE’s safety invariants are preserved. - Safety: the entry’s raw count is incremented by 1.
- Safety: No frame other than the target entry’s (if applicable) is impacted by the call.
- Correctness: the
PTEis equivalent to the originalChild.
§Safety
The PTE safety invariants ensure that the raw pointer to the entry is tracked correctly
so that we can guarantee the safety condition on from_pte.
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<&mut EntryOwner<C>>,requiresold(entry_own).pte_invariants(pte, *old(regions)),level == old(entry_own).parent_level,ensuresres.invariants(*entry_own, *regions),res == Child::<C>::from_pte_spec(pte, level, *regions),*entry_own == old(entry_own).from_pte_owner_spec(),*regions == entry_own.from_pte_regions_spec(*old(regions)),Converts a PTE to a Child.
§Verified Properties
§Preconditions
- Safety Invariants: the
PTE’s safety invariants must hold. - Safety:
levelmust match the original level of the child.
§Postconditions
- Safety Invariants: the safety invariants are preserved.
- Safety: the
EntryOwneris aware that it is tracking an entry inChildform. - Safety: No frame other than the target entry’s (if applicable) is impacted by the call.
- Correctness: the
Childis equivalent to the originalPTE.
§Safety
The PTE safety invariants require that the PTE was previously obtained using Self::into_pte
(or another function that calls ManuallyDrop::new, which is sufficient for safety).
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,
}
}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_spec(
pte: C::E,
level: PagingLevel,
regions: MetaRegionOwners,
) -> Self
pub open spec fn from_pte_spec( pte: C::E, level: PagingLevel, regions: MetaRegionOwners, ) -> Self
{
if !pte.is_present() {
Self::None
} else if pte.is_last(level) {
Self::Frame(pte.paddr(), level, pte.prop())
} else {
Self::PageTable(PageTableNode::from_raw_spec(pte.paddr()))
}
}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)) }Sourcepub open spec fn invariants(self, owner: EntryOwner<C>, regions: MetaRegionOwners) -> bool
pub open spec fn invariants(self, owner: EntryOwner<C>, regions: MetaRegionOwners) -> bool
{
&&& owner.inv()
&&& regions.inv()
&&& self.wf(owner)
&&& owner.relate_region(regions)
&&& owner.in_scope
}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()
&&& node.index() == frame_to_index(meta_to_frame(node.ptr.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