pub struct MetaRegionOwners {
pub slots: Map<int, &'static PointsTo<MetaSlot>>,
pub slot_owners: Map<int, MetaSlotOwner>,
}Expand description
Represents the ownership of the meta-frame memory region.
§Verification Design
§Slot owners and permissions
Every metadata slot has its owner (MetaSlotOwner) tracked by the slot_owners map at all times.
Likewise, every slot has an permission stored in slots.
Fields§
§slots: Map<int, &'static PointsTo<MetaSlot>>§slot_owners: Map<int, MetaSlotOwner>Implementations§
Source§impl MetaRegionOwners
impl MetaRegionOwners
Sourcepub open spec fn contains(self, index: int) -> bool
pub open spec fn contains(self, index: int) -> bool
{
&&& self.slot_owners.contains_key(index)
&&& self.slots.contains_key(index)
}Returns whether the slot permission and its corresponding owner are both present.
Sourcepub open spec fn insert_slot_owner(self, paddr: Paddr, owner: MetaSlotOwner) -> Self
pub open spec fn insert_slot_owner(self, paddr: Paddr, owner: MetaSlotOwner) -> Self
{
let index = frame_to_index(paddr);
Self {
slot_owners: self.slot_owners.insert(index, owner),
..self
}
}Sourcepub open spec fn ref_count(self, i: int) -> res : u64
pub open spec fn ref_count(self, i: int) -> res : u64
recommends
0 <= i < max_meta_slots(),{ self.slot_owners[i].ref_count() }Sourcepub open spec fn paddr_range_not_mapped(self, range: Range<Paddr>) -> bool
pub open spec fn paddr_range_not_mapped(self, range: Range<Paddr>) -> bool
recommends
range.start < range.end < MAX_PADDR,{
forall |paddr: Paddr| {
(range.start <= paddr < range.end && paddr % PAGE_SIZE == 0)
==> self.slot_owner(paddr).paths_in_pt.is_empty()
}
}Sourcepub proof fn lemma_contains_valid_frame_paddr(self, paddr: usize)
pub proof fn lemma_contains_valid_frame_paddr(self, paddr: usize)
requires
valid_frame_paddr(paddr),self.inv(),ensuresself.contains(frame_to_index(paddr)),Sourcepub open spec fn slot_owner(self, paddr: Paddr) -> MetaSlotOwner
pub open spec fn slot_owner(self, paddr: Paddr) -> MetaSlotOwner
{ self.slot_owners[frame_to_index(paddr)] }Rertuns the MetaSlotOwner, indexed by frame paddr.
Sourcepub proof fn tracked_borrow_slot(tracked &self, paddr: Paddr) -> tracked &'static PointsTo<MetaSlot>
pub proof fn tracked_borrow_slot(tracked &self, paddr: Paddr) -> tracked &'static PointsTo<MetaSlot>
requires
valid_frame_paddr(paddr),self.inv(),returnsself.slots[frame_to_index(paddr)],Borrows the metadata slot permission, indexed by frame paddr.
Sourcepub proof fn tracked_borrow_slot_owner(tracked &self, paddr: Paddr) -> tracked &MetaSlotOwner
pub proof fn tracked_borrow_slot_owner(tracked &self, paddr: Paddr) -> tracked &MetaSlotOwner
requires
valid_frame_paddr(paddr),self.inv(),returnsself.slot_owner(paddr),Borrows the MetaSlotOwner, indexed by frame paddr.
Sourcepub proof fn tracked_borrow_mut_slot_owner(
tracked &mut self,
paddr: Paddr,
) -> tracked ret : &mut MetaSlotOwner
pub proof fn tracked_borrow_mut_slot_owner( tracked &mut self, paddr: Paddr, ) -> tracked ret : &mut MetaSlotOwner
requires
valid_frame_paddr(paddr),self.inv(),ensures*ret == old(self).slot_owner(paddr),*final(self) == old(self).insert_slot_owner(paddr, *final(ret)),Mutably borrows the MetaSlotOwner, indexed by frame paddr.
Sourcepub open spec fn inc_frame_reference_region_spec(self, paddr: Paddr, post: Self) -> bool
pub open spec fn inc_frame_reference_region_spec(self, paddr: Paddr, post: Self) -> bool
{
let idx = frame_to_index(paddr);
let pre_owner = self.slot_owners[idx];
let post_owner = post.slot_owners[idx];
{
&&& post.ref_count(idx) == self.ref_count(idx) + 1
&&& post_owner.ref_count_perm.id() == pre_owner.ref_count_perm.id()
&&& post_owner.metadata_perm.id() == pre_owner.metadata_perm.id()
&&& post_owner.metadata_perm.frac() + 1 == pre_owner.metadata_perm.frac()
&&& post_owner.metadata_perm@ == pre_owner.metadata_perm@
&&& post_owner.in_list_perm == pre_owner.in_list_perm
&&& post_owner.slot_vaddr == pre_owner.slot_vaddr
&&& post_owner.usage == pre_owner.usage
&&& post_owner.paths_in_pt == pre_owner.paths_in_pt
&&& post =~= self.insert_slot_owner(paddr, post_owner)
}
}The metadata region transition of claiming a currently shared slot.
Trait Implementations§
Source§impl Inv for MetaRegionOwners
impl Inv for MetaRegionOwners
Source§open spec fn inv(self) -> bool
open spec fn inv(self) -> bool
{
&&& {
forall |i: int| {
0 <= i < max_meta_slots() <==> #[trigger] self.slot_owners.contains_key(i)
}
}
&&& {
forall |i: int| {
#[trigger] self.slot_owners.contains_key(i) ==> self.slots.contains_key(i)
}
}
&&& {
forall |i: int| {
#[trigger] self.slots.contains_key(i) ==> 0 <= i < max_meta_slots()
}
}
&&& {
forall |i: int| {
#[trigger] self.slots.contains_key(i)
==> {
&&& self.slot_owners[i].inv()
&&& self.slots[i].is_init()
&&& self.slots[i].addr() == index_to_meta(i)
&&& self.slots[i].value().wf(self.slot_owners[i])
&&& self.slot_owners[i].slot_vaddr == self.slots[i].addr()
}
}
}
}Auto Trait Implementations§
impl !RefUnwindSafe for MetaRegionOwners
impl !UnwindSafe for MetaRegionOwners
impl Freeze for MetaRegionOwners
impl Send for MetaRegionOwners
impl Sync for MetaRegionOwners
impl Unpin for MetaRegionOwners
impl UnsafeUnpin for MetaRegionOwners
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.