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>>,requiresold(owner).inv_base(),self.wf(*old(owner)),self matches Child::Frame(paddr, level, prop) ==> C::E::new_page_req(paddr, level, prop),ensuresfinal(owner).inv(),final(owner).match_pte(res, final(owner).parent_level),*final(owner) == old(owner).into_pte_owner_spec(),old(owner).is_node()
==> res == C::E::new_pt_spec(meta_to_frame(old(owner).node().slot_vaddr())),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 unsafe exec fn from_pte(pte: C::E, level: PagingLevel) -> res : Self
pub unsafe exec fn from_pte(pte: C::E, level: PagingLevel) -> res : Self
with
Tracked(regions): Tracked<&MetaRegionOwners>,
Tracked(entry_own): Tracked<&mut EntryOwner<C>>,requiresold(entry_own).pte_invariants(pte, *regions),level == old(entry_own).parent_level,ensuresres.invariants(*final(entry_own), *regions),res == Child::<C>::from_pte_spec(pte, level, *regions),*final(entry_own) == old(entry_own).from_pte_owner_spec(),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 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(),
regions
.slots[crate::specs::mm::frame::mapping::frame_to_index(
pte.paddr(),
)],
None,
),
)
}
}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_base()
&&& regions.inv()
&&& self.wf(owner)
&&& match self {
Self::Frame(paddr, level, prop) => C::E::new_page_req(paddr, level, prop),
_ => true,
}
&&& owner.metaregion_sound(regions)
}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().slot_vaddr()
&&& node.index() == meta_to_index(node.ptr.addr())
&&& node.ptr_inv()
),
Self::Frame(paddr, level, prop) => (
&&& owner.is_frame()
&&& owner.frame().mapped_pa == paddr
&&& owner.frame().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> !RefUnwindSafe for Child<C>
impl<C> !UnwindSafe for Child<C>
impl<C> Freeze 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> UnsafeUnpin for Child<C>
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
Causes
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
Causes
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
Causes
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
Causes
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
Causes
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
Causes
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
Causes
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
Causes
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
Formats each item in a sequence. Read more
§impl<T, VERUS_SPEC__A> FromSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: From<T>,
impl<T, VERUS_SPEC__A> FromSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: From<T>,
fn obeys_from_spec() -> bool
fn from_spec(v: T) -> VERUS_SPEC__A
§impl<T, VERUS_SPEC__A> IntoSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: Into<T>,
impl<T, VERUS_SPEC__A> IntoSpec<T> for VERUS_SPEC__Awhere
VERUS_SPEC__A: Into<T>,
fn obeys_into_spec() -> bool
fn into_spec(self) -> T
§impl<T, U> IntoSpecImpl<U> for Twhere
U: From<T>,
impl<T, U> IntoSpecImpl<U> for Twhere
U: From<T>,
fn obeys_into_spec() -> bool
fn into_spec(self) -> U
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Pipes by value. This is generally the method you want to use. Read more
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
Borrows
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
Mutably borrows
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
Borrows
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
Mutably borrows
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
Borrows
self, then passes self.deref() into the pipe function.impl<A> SpecEq<&A> for Awhere
A: ?Sized,
impl<A> SpecEq<&mut A> for Awhere
A: ?Sized,
impl<A> SpecEq<A> for Awhere
A: ?Sized,
impl<A> SpecEq<Ghost<A>> for A
impl<A> SpecEq<Tracked<A>> for A
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Immutable access to the
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
Mutable access to the
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
Immutable access to the
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
Mutable access to the
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Immutable access to the
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Mutable access to the
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
Calls
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
Calls
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
Calls
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
Calls
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
Calls
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
Calls
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
Calls
.tap_deref() only in debug builds, and is erased in release
builds.