pub struct EntryOwner<C: PageTableConfig> {
pub node: Option<NodeOwner<C>>,
pub frame: Option<FrameEntryOwner>,
pub locked: Option<Ghost<Seq<FrameView<C>>>>,
pub absent: bool,
pub path: TreePath<CONST_NR_ENTRIES>,
pub parent_level: PagingLevel,
}Fields§
§node: Option<NodeOwner<C>>§frame: Option<FrameEntryOwner>§locked: Option<Ghost<Seq<FrameView<C>>>>§absent: bool§path: TreePath<CONST_NR_ENTRIES>§parent_level: PagingLevelImplementations§
Source§impl<C: PageTableConfig> EntryOwner<C>
impl<C: PageTableConfig> EntryOwner<C>
Sourcepub open spec fn new_absent_spec(parent_level: PagingLevel) -> Self
pub open spec fn new_absent_spec(parent_level: PagingLevel) -> Self
{
EntryOwner {
node: None,
frame: None,
locked: None,
absent: true,
path: TreePath::new(Seq::empty()),
parent_level,
}
}Sourcepub open spec fn new_frame_spec(
paddr: Paddr,
parent_level: PagingLevel,
prop: PageProperty,
) -> Self
pub open spec fn new_frame_spec( paddr: Paddr, parent_level: PagingLevel, prop: PageProperty, ) -> Self
{
EntryOwner {
node: None,
frame: Some(FrameEntryOwner {
mapped_pa: paddr,
size: page_size(parent_level),
prop,
}),
locked: None,
absent: false,
path: TreePath::new(Seq::empty()),
parent_level,
}
}Sourcepub open spec fn new_node_spec(node: NodeOwner<C>) -> Self
pub open spec fn new_node_spec(node: NodeOwner<C>) -> Self
{
EntryOwner {
node: Some(node),
frame: None,
locked: None,
absent: false,
path: TreePath::new(Seq::empty()),
parent_level: (node.level + 1) as PagingLevel,
}
}Sourcepub proof fn new_absent(parent_level: PagingLevel) -> tracked Self
pub proof fn new_absent(parent_level: PagingLevel) -> tracked Self
Sourcepub proof fn new_frame(
paddr: Paddr,
parent_level: PagingLevel,
prop: PageProperty,
) -> tracked Self
pub proof fn new_frame( paddr: Paddr, parent_level: PagingLevel, prop: PageProperty, ) -> tracked Self
Sourcepub open spec fn match_pte(self, pte: C::E, parent_level: PagingLevel) -> bool
pub open spec fn match_pte(self, pte: C::E, parent_level: PagingLevel) -> bool
{
&&& pte.paddr() % PAGE_SIZE() == 0
&&& pte.paddr() < MAX_PADDR()
&&& !pte.is_present() ==> { self.is_absent() }
&&& pte.is_present() && !pte.is_last(parent_level)
==> {
&&& self.is_node()
&&& meta_to_frame(self.node.unwrap().meta_perm.addr()) == pte.paddr()
}
&&& pte.is_present() && pte.is_last(parent_level)
==> {
&&& self.is_frame()
&&& self.frame.unwrap().mapped_pa == pte.paddr()
&&& self.frame.unwrap().prop == pte.prop()
}
}Trait Implementations§
Source§impl<C: PageTableConfig> Inv for EntryOwner<C>
impl<C: PageTableConfig> Inv for EntryOwner<C>
Source§open spec fn inv(self) -> bool
open spec fn inv(self) -> bool
{
&&& self.node is Some
==> {
&&& self.frame is None
&&& self.locked is None
&&& self.node.unwrap().inv()
&&& !self.absent
}
&&& self.frame is Some
==> {
&&& self.node is None
&&& self.locked is None
&&& !self.absent
&&& self.frame.unwrap().mapped_pa % PAGE_SIZE() == 0
&&& self.frame.unwrap().mapped_pa < MAX_PADDR()
}
&&& self.locked is Some
==> {
&&& self.frame is None
&&& self.node is None
&&& !self.absent
}
}Source§impl<C: PageTableConfig> InvView for EntryOwner<C>
impl<C: PageTableConfig> InvView for EntryOwner<C>
Source§proof fn view_preserves_inv(self)
proof fn view_preserves_inv(self)
Source§impl<C: PageTableConfig, const L: usize> TreeNodeValue<L> for EntryOwner<C>
impl<C: PageTableConfig, const L: usize> TreeNodeValue<L> for EntryOwner<C>
Source§open spec fn default(lv: nat) -> Self
open spec fn default(lv: nat) -> Self
{
Self {
path: TreePath::new(Seq::empty()),
parent_level: (INC_LEVELS() - lv + 1) as PagingLevel,
node: None,
frame: None,
locked: None,
absent: true,
}
}Source§proof fn default_preserves_inv()
proof fn default_preserves_inv()
Source§proof fn default_preserves_la_inv()
proof fn default_preserves_la_inv()
Source§open spec fn rel_children(self, child: Option<Self>) -> bool
open spec fn rel_children(self, child: Option<Self>) -> bool
{
if self.is_node() {
&&& child is Some
&&& child.unwrap().parent_level == self.node.unwrap().level
} else {
&&& child is None
}
}Source§proof fn default_preserves_rel_children(self, lv: nat)
proof fn default_preserves_rel_children(self, lv: nat)
Source§impl<C: PageTableConfig> View for EntryOwner<C>
impl<C: PageTableConfig> View for EntryOwner<C>
Source§open spec fn view(&self) -> <Self as View>::V
open spec fn view(&self) -> <Self as View>::V
{
if let Some(frame) = self.frame {
EntryView::Leaf {
leaf: LeafPageTableEntryView {
map_va: vaddr(self.path) as int,
map_to_pa: frame.mapped_pa as int,
level: (self.path.len() + 1) as u8,
prop: frame.prop,
phantom: PhantomData,
},
}
} else if let Some(node) = self.node {
EntryView::Intermediate {
node: IntermediatePageTableEntryView {
map_va: vaddr(self.path) as int,
map_to_pa: meta_to_frame(node.meta_perm.addr()) as int,
level: (self.path.len() + 1) as u8,
phantom: PhantomData,
},
}
} else if let Some(view) = self.locked {
EntryView::LockedSubtree {
views: view@,
}
} else {
EntryView::Absent
}
}type V = EntryView<C>
Auto Trait Implementations§
impl<C> Freeze for EntryOwner<C>
impl<C> !RefUnwindSafe for EntryOwner<C>
impl<C> Send for EntryOwner<C>
impl<C> Sync for EntryOwner<C>
impl<C> Unpin for EntryOwner<C>
impl<C> UnwindSafe for EntryOwner<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