pub struct NodeOwner<C: PageTableConfig> {
pub meta_own: PageMetaOwner,
pub meta_perm: MetaPerm<PageTablePageMeta<C>>,
pub children_perm: PointsTo<C::E, NR_ENTRIES>,
pub level: PagingLevel,
pub tree_level: int,
}Fields§
§meta_own: PageMetaOwner§meta_perm: MetaPerm<PageTablePageMeta<C>>§children_perm: PointsTo<C::E, NR_ENTRIES>§level: PagingLevel§tree_level: intImplementations§
Source§impl<C: PageTableConfig> NodeOwner<C>
impl<C: PageTableConfig> NodeOwner<C>
Sourcepub uninterp fn set_children_perm(self, idx: usize, pte: C::E) -> Self
pub uninterp fn set_children_perm(self, idx: usize, pte: C::E) -> Self
Returns a NodeOwner with children_perm updated at the given index. Used to specify the state after storing a new PTE for an allocated child.
Sourcepub proof fn set_children_perm_axiom(self, idx: usize, pte: C::E)
pub proof fn set_children_perm_axiom(self, idx: usize, pte: C::E)
requires
self.inv(),idx < NR_ENTRIES,ensuresself.set_children_perm(idx, pte).inv(),self.set_children_perm(idx, pte).meta_perm == self.meta_perm,self.set_children_perm(idx, pte).meta_own == self.meta_own,self.set_children_perm(idx, pte).level == self.level,self.set_children_perm(idx, pte).tree_level == self.tree_level,self.set_children_perm(idx, pte).children_perm.addr() == self.children_perm.addr(),self.set_children_perm(idx, pte).children_perm.value()
== self.children_perm.value().update(idx as int, pte),Source§impl<'rcu, C: PageTableConfig> NodeOwner<C>
impl<'rcu, C: PageTableConfig> NodeOwner<C>
Sourcepub open spec fn relate_guard_perm(self, guard_perm: GuardPerm<'rcu, C>) -> bool
pub open spec fn relate_guard_perm(self, guard_perm: GuardPerm<'rcu, C>) -> bool
{
&&& guard_perm.is_init()
&&& guard_perm.value().inner.inner@.ptr.addr() == self.meta_perm.addr()
&&& guard_perm.value().inner.inner@.ptr.addr() == self.meta_perm.points_to.addr()
&&& guard_perm.value().inner.inner@.wf(self)
&&& self.meta_perm.is_init()
&&& self.meta_perm.wf(&self.meta_perm.inner_perms)
}Trait Implementations§
Source§impl<C: PageTableConfig> Inv for NodeOwner<C>
impl<C: PageTableConfig> Inv for NodeOwner<C>
Source§open spec fn inv(self) -> bool
open spec fn inv(self) -> bool
{
&&& self.meta_perm.points_to.is_init()
&&& self.meta_perm.addr() == self.meta_perm.points_to.addr()
&&& self.meta_own.inv()
&&& self.meta_perm.value().metadata.wf(self.meta_own)
&&& self.meta_perm.is_init()
&&& self.meta_perm.wf(&self.meta_perm.inner_perms)
&&& FRAME_METADATA_RANGE.start <= self.meta_perm.addr() < FRAME_METADATA_RANGE.end
&&& self.meta_perm.addr() % META_SLOT_SIZE == 0
&&& meta_to_frame(self.meta_perm.addr())
< VMALLOC_BASE_VADDR - LINEAR_MAPPING_BASE_VADDR
&&& meta_to_frame(self.meta_perm.addr()) < MAX_PADDR
&&& meta_to_frame(self.meta_perm.addr()) == self.children_perm.addr()
&&& self.meta_own.nr_children.id()
== self.meta_perm.value().metadata.nr_children.id()
&&& 0 <= self.meta_own.nr_children.value() <= NR_ENTRIES
&&& 1 <= self.level <= NR_LEVELS
&&& self.children_perm.is_init_all()
&&& self.children_perm.addr() == paddr_to_vaddr(meta_to_frame(self.meta_perm.addr()))
&&& self.level == self.meta_perm.value().metadata.level
&&& self.tree_level == INC_LEVELS - self.level
}Source§impl<C: PageTableConfig> InvView for NodeOwner<C>
impl<C: PageTableConfig> InvView for NodeOwner<C>
Source§proof fn view_preserves_inv(self)
proof fn view_preserves_inv(self)
Auto Trait Implementations§
impl<C> Freeze for NodeOwner<C>
impl<C> !RefUnwindSafe for NodeOwner<C>
impl<C> Send for NodeOwner<C>
impl<C> Sync for NodeOwner<C>
impl<C> Unpin for NodeOwner<C>
impl<C> UnwindSafe for NodeOwner<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