Skip to content

Commit 9779ebd

Browse files
committed
refine virt_mem_newer's lemma and format
1 parent 4b4b8f5 commit 9779ebd

22 files changed

Lines changed: 183 additions & 116 deletions

File tree

ostd/specs/mm/page_table/node/child.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ impl<'a, C: PageTableConfig> OwnerOf for ChildRef<'a, C> {
5252
Self::None => owner.is_absent(),
5353
}
5454
}
55-
}
55+
}
5656

5757
impl<C: PageTableConfig> Child<C> {
5858

ostd/specs/mm/page_table/node/entry_owners.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ use vstd_extra::ghost_tree::*;
77
use vstd_extra::ownership::*;
88

99
use crate::mm::frame::meta::mapping::{frame_to_index, meta_to_frame};
10+
use crate::mm::frame::meta::REF_COUNT_UNUSED;
1011
use crate::mm::page_prop::PageProperty;
1112
use crate::mm::page_table::*;
1213
use crate::mm::{Paddr, PagingConstsTrait, PagingLevel, Vaddr};
13-
use crate::mm::frame::meta::REF_COUNT_UNUSED;
1414
use crate::specs::arch::mm::{NR_ENTRIES, NR_LEVELS, PAGE_SIZE};
1515
use crate::specs::arch::paging_consts::PagingConsts;
1616
use crate::specs::arch::*;

ostd/specs/mm/page_table/node/owners.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ impl<C: PageTableConfig> Inv for NodeOwner<C> {
106106
impl<C: PageTableConfig> NodeOwner<C> {
107107
/// Returns a NodeOwner with children_perm updated at the given index.
108108
/// Used to specify the state after storing a new PTE for an allocated child.
109-
pub open spec fn set_children_perm(self, idx: usize, pte: C::E) -> Self;
109+
pub uninterp spec fn set_children_perm(self, idx: usize, pte: C::E) -> Self;
110110

111111
#[verifier::external_body]
112112
pub axiom fn set_children_perm_axiom(self, idx: usize, pte: C::E)

ostd/specs/mm/page_table/owners.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,10 @@ use vstd_extra::ghost_tree::*;
1313
use vstd_extra::ownership::*;
1414
use vstd_extra::prelude::TreeNodeValue;
1515

16-
use crate::mm::{
17-
page_table::EntryOwner,
18-
Paddr, PagingLevel, Vaddr, MAX_NR_LEVELS,
19-
};
16+
use crate::mm::{page_table::EntryOwner, Paddr, PagingLevel, Vaddr, MAX_NR_LEVELS};
2017

2118
use crate::mm::frame::frame_to_index;
22-
use crate::mm::page_table::{PageTableGuard, PageTableEntryTrait};
19+
use crate::mm::page_table::{PageTableEntryTrait, PageTableGuard};
2320

2421
use crate::specs::arch::*;
2522
use crate::specs::mm::frame::meta_region_owners::MetaRegionOwners;

ostd/specs/mm/virt_mem_newer.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -360,10 +360,12 @@ impl MemView {
360360
///
361361
/// ## Preconditions
362362
/// - `this.split_spec(vaddr, len) == (lhs, rhs)`.
363+
/// - Every mapping in `this` starts at or after `vaddr`.
364+
/// - Every physical frame tracked by `this.memory` is reachable from some
365+
/// virtual address at or after `vaddr`.
363366
///
364367
/// ## Postconditions
365-
/// - `this == lhs.join_spec(rhs)`.
366-
#[verifier::external_body]
368+
/// - `lhs.join_spec(rhs)` has the same mappings and memory contents as `this`.
367369
pub proof fn lemma_split_join_identity(
368370
this: MemView,
369371
lhs: MemView,
@@ -373,10 +375,15 @@ impl MemView {
373375
)
374376
requires
375377
this.split_spec(vaddr, len) == (lhs, rhs),
378+
forall|m: Mapping|
379+
#[trigger] this.mappings.contains(m) ==> vaddr <= m.va_range.start < m.va_range.end,
380+
forall|pa: Paddr|
381+
#[trigger] this.memory.contains_key(pa) ==> exists|va: usize|
382+
vaddr <= va && #[trigger] this.is_mapped(va, pa),
376383
ensures
377-
this == lhs.join_spec(rhs),
384+
this.mappings =~= lhs.join_spec(rhs).mappings,
385+
this.memory =~= lhs.join_spec(rhs).memory,
378386
{
379-
// Auto.
380387
}
381388
}
382389

ostd/specs/mm/vm_space.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,6 @@ impl<'a> VmSpaceOwner<'a> {
247247
}
248248
}
249249

250-
/// The basic invariant between a VM space and its owner.
251-
#[deprecated(note = "We removed the `exec` fields in VmSpace so this is no longer needed.")]
252-
pub open spec fn inv_with(&self, vm_space: VmSpace<'a>) -> bool {
253-
true
254-
}
255-
256250
/// Determines whether a new reader can be safely instantiated within the VM address space.
257251
///
258252
/// This specification function enforces memory isolation by ensuring that the

ostd/src/mm/frame/frame_ref.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ impl<M: AnyFrameMeta> FrameRef<'_, M> {
6767
pub(in crate::mm) fn borrow_paddr(raw: Paddr) -> Self {
6868
proof {
6969
broadcast use crate::mm::frame::meta::mapping::group_page_meta;
70+
7071
old(regions).inv_implies_correct_addr(raw);
7172
}
7273

ostd/src/mm/frame/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,8 +417,8 @@ impl<'a, M: AnyFrameMeta> Frame<M> {
417417
pub fn borrow(&self) -> FrameRef<'a, M> {
418418
assert(regions.slot_owners.contains_key(self.index()));
419419
broadcast use crate::mm::frame::meta::mapping::group_page_meta;
420-
421420
// SAFETY: Both the lifetime and the type matches `self`.
421+
422422
#[verus_spec(with Tracked(&perm.points_to))]
423423
let paddr = self.start_paddr();
424424

ostd/src/mm/page_prop.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ impl PageProperty {
4747

4848
#[verifier::when_used_as_spec(new_spec)]
4949
pub fn new(flags: PageFlags, cache: CachePolicy) -> Self
50-
returns Self::new_spec(flags, cache),
50+
returns
51+
Self::new_spec(flags, cache),
5152
{
5253
Self { flags, cache, priv_flags: PrivilegedPageFlags::USER() }
5354
}
@@ -62,7 +63,8 @@ impl PageProperty {
6263

6364
#[verifier::when_used_as_spec(new_absent_spec)]
6465
pub fn new_absent() -> Self
65-
returns Self::new_absent_spec(),
66+
returns
67+
Self::new_absent_spec(),
6668
{
6769
Self {
6870
flags: PageFlags::empty(),

ostd/src/mm/page_table/cursor/mod.rs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ use crate::mm::frame::Frame;
4242
use crate::mm::page_table::*;
4343
use crate::mm::{Paddr, Vaddr, MAX_NR_LEVELS};
4444
use crate::specs::arch::kspace::FRAME_METADATA_RANGE;
45-
use crate::specs::mm::frame::mapping::{frame_to_index, frame_to_meta, meta_to_frame, META_SLOT_SIZE};
45+
use crate::specs::mm::frame::mapping::{
46+
frame_to_index, frame_to_meta, meta_to_frame, META_SLOT_SIZE,
47+
};
4648
use crate::specs::mm::frame::meta_owners::{MetaSlotOwner, REF_COUNT_UNUSED};
4749
use crate::specs::mm::frame::meta_region_owners::MetaRegionOwners;
4850

@@ -1356,7 +1358,6 @@ impl<'rcu, C: PageTableConfig, A: InAtomicMode> CursorMut<'rcu, C, A> {
13561358
self.inner.guard_level == old(self).inner.guard_level,
13571359
)]
13581360
fn map_branch_none(&mut self, cur_entry: &mut Entry<'rcu, C>, rcu_guard: &'rcu A) {
1359-
13601361
let ghost owner0 = *owner;
13611362
let ghost guards0 = *guards;
13621363

@@ -1456,7 +1457,9 @@ impl<'rcu, C: PageTableConfig, A: InAtomicMode> CursorMut<'rcu, C, A> {
14561457
0 <= j < NR_ENTRIES
14571458
&& cont.children[j] is Some implies cont.children[j].unwrap().tree_predicate_map(
14581459
cont.path().push_tail(j as usize), g_region) by {
1459-
assert(OwnerSubtree::implies(f_region, g_region)) by { admit(); }
1460+
assert(OwnerSubtree::implies(f_region, g_region)) by {
1461+
admit();
1462+
}
14601463
OwnerSubtree::map_implies(
14611464
cont.children[j].unwrap(),
14621465
cont.path().push_tail(j as usize),
@@ -1473,7 +1476,9 @@ impl<'rcu, C: PageTableConfig, A: InAtomicMode> CursorMut<'rcu, C, A> {
14731476
&& cont_final.children[j] is Some implies cont_final.children[j].unwrap().tree_predicate_map(
14741477
cont_final.path().push_tail(j as usize), g_region) by {
14751478
if j != idx && cont0.children[j] is Some {
1476-
assert(OwnerSubtree::implies(f_region, g_region)) by { admit(); }
1479+
assert(OwnerSubtree::implies(f_region, g_region)) by {
1480+
admit();
1481+
}
14771482
OwnerSubtree::map_implies(
14781483
cont0.children[j].unwrap(),
14791484
cont0.path().push_tail(j as usize),
@@ -1488,7 +1493,9 @@ impl<'rcu, C: PageTableConfig, A: InAtomicMode> CursorMut<'rcu, C, A> {
14881493
}
14891494

14901495
proof {
1491-
assert(owner.relate_region(*regions)) by { admit(); }
1496+
assert(owner.relate_region(*regions)) by {
1497+
admit();
1498+
}
14921499
}
14931500

14941501
#[verus_spec(with Tracked(owner), Tracked(guard_perm.tracked_unwrap()), Tracked(regions), Tracked(guards))]
@@ -1628,7 +1635,9 @@ impl<'rcu, C: PageTableConfig, A: InAtomicMode> CursorMut<'rcu, C, A> {
16281635
},
16291636
ChildRef::None => {
16301637
proof {
1631-
assert(owner.level > 2) by { admit(); }
1638+
assert(owner.level > 2) by {
1639+
admit();
1640+
}
16321641
}
16331642
#[verus_spec(with Tracked(owner), Tracked(regions), Tracked(guards))]
16341643
self.map_branch_none(&mut cur_entry, rcu_guard);
@@ -1677,8 +1686,7 @@ impl<'rcu, C: PageTableConfig, A: InAtomicMode> CursorMut<'rcu, C, A> {
16771686
&&& self.inner.va % page_size(level) == 0
16781687
&&& self.inner.va + page_size(level) <= self.inner.barrier_va.end
16791688
&&& level < self.inner.guard_level
1680-
&&& (entry_owner.is_absent()
1681-
|| Child::Frame(paddr, level, prop).wf(entry_owner))
1689+
&&& (entry_owner.is_absent() || Child::Frame(paddr, level, prop).wf(entry_owner))
16821690
}
16831691

16841692
pub open spec fn item_not_mapped(item: C::Item, regions: MetaRegionOwners) -> bool {
@@ -2034,16 +2042,17 @@ impl<'rcu, C: PageTableConfig, A: InAtomicMode> CursorMut<'rcu, C, A> {
20342042
!old(owner).popped_too_high,
20352043
new_owner.inv(),
20362044
new_owner.level == old(owner).continuations[old(owner).level - 1].tree_level + 1,
2037-
new_owner.value.parent_level == old(owner).continuations[old(owner).level - 1].child().value.parent_level,
2045+
new_owner.value.parent_level == old(owner).continuations[old(owner).level
2046+
- 1].child().value.parent_level,
20382047
new_owner.value.path == old(owner).continuations[old(owner).level - 1].path().push_tail(
20392048
old(owner).continuations[old(owner).level - 1].idx as usize,
20402049
),
20412050
new_child.wf(new_owner.value),
2042-
new_owner.value.is_node() ==> old(regions).slot_owners[
2043-
frame_to_index(new_owner.value.meta_slot_paddr().unwrap())
2044-
].inner_perms.ref_count.value() != REF_COUNT_UNUSED,
2051+
new_owner.value.is_node() ==> old(regions).slot_owners[frame_to_index(
2052+
new_owner.value.meta_slot_paddr().unwrap(),
2053+
)].inner_perms.ref_count.value() != REF_COUNT_UNUSED,
20452054
new_owner.value.is_node() ==> old(regions).slots.contains_key(
2046-
frame_to_index(new_owner.value.meta_slot_paddr().unwrap())
2055+
frame_to_index(new_owner.value.meta_slot_paddr().unwrap()),
20472056
),
20482057
new_owner.value.in_scope,
20492058
new_owner.value.relate_region(*old(regions)),
@@ -2143,8 +2152,9 @@ impl<'rcu, C: PageTableConfig, A: InAtomicMode> CursorMut<'rcu, C, A> {
21432152

21442153
assert(new_owner.value.meta_slot_paddr() == pre_new_owner_value.meta_slot_paddr());
21452154
let f_neq = |entry: EntryOwner<C>, path: TreePath<NR_ENTRIES>|
2146-
entry.meta_slot_paddr_neq(pre_new_owner_value)
2147-
&& entry.meta_slot_paddr_neq(old_child_owner.value);
2155+
entry.meta_slot_paddr_neq(pre_new_owner_value) && entry.meta_slot_paddr_neq(
2156+
old_child_owner.value,
2157+
);
21482158
let f_region = PageTableOwner::<C>::relate_region_pred(regions0);
21492159
let g_region = PageTableOwner::<C>::relate_region_pred(*regions);
21502160
let f_path = PageTableOwner::<C>::path_tracked_pred(regions0);

0 commit comments

Comments
 (0)