Skip to content

Commit 70f7fd4

Browse files
committed
Trivial merge
1 parent 0fafdc8 commit 70f7fd4

25 files changed

Lines changed: 3759 additions & 42 deletions

File tree

lock-protocol/src/exec/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
mod rcu;
2-
mod rw;
1+
// mod rcu;
2+
// mod rw;
33
// mod test_map;
44

55
use vstd::{invariant, prelude::*};

lock-protocol/src/exec/rcu/cursor/locking.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ fn dfs_acquire_lock(
588588
let tracked guard = pt_guard.guard.tracked_unwrap()
589589
let tracked forgot_guard = guard.inner.get();
590590
proof {
591-
forgot_guards.tracked_put(, forgot_guard);
591+
forgot_guards.tracked_put(pt.nid@, forgot_guard);
592592
}
593593
let _ = ManuallyDrop::new(pt_guard);
594594
},
@@ -670,7 +670,7 @@ fn dfs_acquire_lock(
670670
i += 1;
671671
}
672672

673-
Tracked(m)
673+
(Tracked(m), Tracked(forgot_guards))
674674
}
675675

676676
/// Releases the locks for the given range in the sub-tree rooted at the node.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
use core::ops::Range;
2+
use core::mem::size_of;
3+
4+
use vstd::prelude::*;
5+
6+
use crate::mm::lock_protocol_utils::*;
7+
use super::MetaSlot;
8+
9+
verus! {
10+
11+
// global layout MetaSlot is size == 12, align == 12;
12+
pub uninterp spec fn frame_to_meta_spec(paddr: Paddr) -> Vaddr;
13+
14+
/// Converts a physical address of a base frame to the virtual address of the metadata slot.
15+
#[inline(always)]
16+
#[verifier::when_used_as_spec(frame_to_meta_spec)]
17+
#[verifier::external_body]
18+
pub const fn frame_to_meta(paddr: Paddr) -> Vaddr
19+
returns
20+
frame_to_meta_spec(paddr),
21+
{
22+
// let base = FRAME_METADATA_RANGE.start;
23+
// let offset = paddr / PAGE_SIZE;
24+
// base + offset * size_of::<MetaSlot>()
25+
unimplemented!()
26+
}
27+
28+
pub uninterp spec fn meta_to_frame_spec(vaddr: Vaddr) -> Paddr;
29+
30+
/// Converts a virtual address of the metadata slot to the physical address of the frame.
31+
#[inline(always)]
32+
#[verifier::when_used_as_spec(meta_to_frame_spec)]
33+
#[verifier::external_body]
34+
pub const fn meta_to_frame(vaddr: Vaddr) -> Paddr
35+
returns
36+
meta_to_frame_spec(vaddr),
37+
{
38+
// let base = FRAME_METADATA_RANGE.start;
39+
// let offset = (vaddr - base) / size_of::<MetaSlot>();
40+
// offset * PAGE_SIZE
41+
unimplemented!()
42+
}
43+
44+
} // verus!
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
pub mod mapping;
2+
3+
use vstd::prelude::*;
4+
use vstd::raw_ptr::{PointsTo};
5+
6+
use crate::spec::{common::*, utils::*, rcu::*};
7+
use crate::mm::lock_protocol_utils::*;
8+
use crate::mm::page_table::node_concurrent::PageTablePageMeta;
9+
use crate::mm::page_table::PageTableConfig;
10+
11+
pub use mapping::*;
12+
13+
verus! {
14+
15+
pub enum MetaSlotType {
16+
PageTablePageMeta,
17+
Others,
18+
}
19+
20+
struct_with_invariants! {
21+
pub struct MetaSlot<C: PageTableConfig> {
22+
pub usage: MetaSlotType,
23+
pub inner: Option<PageTablePageMeta<C>>,
24+
}
25+
26+
pub open spec fn wf(&self) -> bool {
27+
predicate {
28+
&&& self.usage is PageTablePageMeta <==> self.inner is Some
29+
&&& self.inner is Some ==> self.inner->Some_0.wf()
30+
}
31+
}
32+
}
33+
34+
impl<C: PageTableConfig> MetaSlot<C> {
35+
pub open spec fn is_pt(&self) -> bool {
36+
self.usage is PageTablePageMeta
37+
}
38+
39+
pub open spec fn get_inner_pt_spec(&self) -> PageTablePageMeta<C>
40+
recommends
41+
self.is_pt(),
42+
{
43+
self.inner->Some_0
44+
}
45+
46+
pub fn get_inner_pt(&self) -> (res: &PageTablePageMeta<C>)
47+
requires
48+
self.wf(),
49+
self.is_pt(),
50+
ensures
51+
*res =~= self.get_inner_pt_spec(),
52+
{
53+
self.inner.as_ref().unwrap()
54+
}
55+
}
56+
57+
pub tracked struct MetaSlotPerm<C: PageTableConfig> {
58+
pub inner: PointsTo<MetaSlot<C>>,
59+
pub slot_idx: nat,
60+
}
61+
62+
impl<C: PageTableConfig> MetaSlotPerm<C> {
63+
pub open spec fn relate(&self, ptr: *const MetaSlot<C>) -> bool {
64+
&&& self.inner.ptr() == ptr
65+
}
66+
67+
pub open spec fn wf(&self) -> bool {
68+
//&&& 0 <= self.slot_idx < meta_slot_array.len()
69+
//&&& self.relate(meta_slot_array.vec[self.slot_idx as int])
70+
&&& self.inner.is_init()
71+
&&& self.inner.value().wf()
72+
&&& self.inner.value().is_pt() ==> {
73+
&&& self.frame_paddr() == meta_to_frame(self.meta_vaddr())
74+
&&& frame_to_meta(self.frame_paddr()) == self.meta_vaddr()
75+
}
76+
}
77+
78+
pub open spec fn is_pt(&self) -> bool {
79+
self.inner.value().is_pt()
80+
}
81+
82+
pub open spec fn frame_paddr(&self) -> Paddr {
83+
self.inner.value().get_inner_pt_spec().frame_paddr
84+
}
85+
86+
pub open spec fn meta_vaddr(&self) -> Vaddr {
87+
self.inner.ptr() as usize
88+
}
89+
90+
pub open spec fn value(&self) -> MetaSlot<C> {
91+
self.inner.value()
92+
}
93+
}
94+
95+
} // verus!
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub mod meta;
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
use std::ops::Range;
2+
3+
use vstd::prelude::*;
4+
use vstd::vstd::arithmetic::power2::*;
5+
use vstd::arithmetic::div_mod::*;
6+
use vstd::arithmetic::power2::*;
7+
use vstd::bits::*;
8+
9+
use crate::helpers::bits::*;
10+
use crate::helpers::extern_const::*;
11+
use crate::spec::{common::*, utils::*};
12+
13+
pub use super::configs::*;
14+
pub use crate::mm::{Paddr, Vaddr, PagingLevel};
15+
16+
verus! {
17+
18+
// pub const MAX_FRAME_NUM: u64 = 256;
19+
pub const INVALID_PADDR: Paddr = 0xffff_ffff_ffff_ffff;
20+
21+
// extern_const!(
22+
// pub MAX_RC [MAX_RC_SPEC, CONST_MAX_RC]: u64 = 382);
23+
} // verus!
24+
verus! {
25+
26+
// Maybe introduce a MAX_PADDR constant in the future.
27+
pub open spec fn valid_paddr(pa: Paddr) -> bool {
28+
true
29+
}
30+
31+
pub uninterp spec fn paddr_to_vaddr_spec(pa: Paddr) -> Vaddr;
32+
33+
#[inline(always)]
34+
#[verifier::when_used_as_spec(paddr_to_vaddr_spec)]
35+
#[verifier::external_body]
36+
pub fn paddr_to_vaddr(pa: Paddr) -> (va: Vaddr)
37+
// requires
38+
// valid_paddr(pa),
39+
40+
ensures
41+
va == paddr_to_vaddr_spec(pa),
42+
{
43+
unimplemented!()
44+
}
45+
46+
} // verus!
47+
verus! {
48+
49+
pub open spec fn valid_vaddr(va: Vaddr) -> bool {
50+
0 <= va < (1u64 << 48)
51+
}
52+
53+
pub open spec fn valid_va_range(va: Range<Vaddr>) -> bool {
54+
0 <= va.start <= va.end <= (1u64 << 48)
55+
}
56+
57+
#[verifier::allow_in_spec]
58+
pub fn vaddr_is_aligned(va: Vaddr) -> (res: bool)
59+
requires
60+
valid_vaddr(va),
61+
returns
62+
(va & (low_bits_mask(12) as usize)) == 0,
63+
{
64+
(va & low_bits_mask_usize(12)) == 0
65+
}
66+
67+
pub open spec fn va_level_to_offset(va: Vaddr, level: PagingLevel) -> nat
68+
recommends
69+
valid_vaddr(va),
70+
1 <= level <= 4,
71+
{
72+
((va >> (12 + (level - 1) * 9)) & low_bits_mask(9) as usize) as nat
73+
}
74+
75+
pub fn pte_index(va: Vaddr, level: PagingLevel) -> (res: usize)
76+
requires
77+
valid_vaddr(va),
78+
1 <= level <= 4,
79+
ensures
80+
valid_pte_offset(res as nat),
81+
returns
82+
va_level_to_offset(va, level) as usize,
83+
{
84+
let offset = (va >> (12 + (level - 1) * 9)) & low_bits_mask_usize(9);
85+
86+
proof {
87+
lemma2_to64();
88+
let num = (va >> (12 + (level - 1) * 9));
89+
assert((num & 511) < 512) by (bit_vector);
90+
}
91+
92+
offset
93+
}
94+
95+
pub open spec fn va_level_to_trace(va: Vaddr, level: PagingLevel) -> Seq<nat>
96+
recommends
97+
1 <= level <= 4,
98+
{
99+
Seq::new((4 - level) as nat, |i| va_level_to_offset(va, (4 - i) as PagingLevel))
100+
}
101+
102+
pub open spec fn va_level_to_nid(va: Vaddr, level: PagingLevel) -> NodeId {
103+
NodeHelper::trace_to_nid(va_level_to_trace(va, level))
104+
}
105+
106+
pub proof fn lemma_va_level_to_nid_inc(va: Vaddr, level: PagingLevel, nid: NodeId, idx: nat)
107+
requires
108+
valid_vaddr(va),
109+
1 <= level < 4,
110+
NodeHelper::valid_nid(nid),
111+
nid == va_level_to_nid(va, (level + 1) as PagingLevel),
112+
valid_pte_offset(idx),
113+
idx == va_level_to_offset(va, (level + 1) as PagingLevel),
114+
ensures
115+
NodeHelper::get_child(nid, idx) == va_level_to_nid(va, level),
116+
{
117+
broadcast use group_node_helper_lemmas;
118+
// Establish the relationship between traces at consecutive levels
119+
120+
let trace_level_plus_1 = va_level_to_trace(va, (level + 1) as PagingLevel);
121+
let trace_level = va_level_to_trace(va, level);
122+
123+
// Show that trace_level = trace_level_plus_1.push(idx)
124+
assert(trace_level == trace_level_plus_1.push(idx));
125+
126+
// Now use the fact that nid = trace_to_nid(trace_level_plus_1)
127+
// and get_child(nid, idx) = trace_to_nid(nid_to_trace(nid).push(idx))
128+
assert(NodeHelper::nid_to_trace(nid) == trace_level_plus_1) by {
129+
// First establish that trace_level_plus_1 is a valid trace
130+
assert(NodeHelper::valid_trace(trace_level_plus_1)) by {
131+
lemma_va_level_to_trace_valid(va, (level + 1) as PagingLevel);
132+
};
133+
NodeHelper::lemma_trace_to_nid_bijective();
134+
};
135+
}
136+
137+
pub proof fn lemma_va_level_to_offset_range(va: Vaddr, level: PagingLevel)
138+
requires
139+
1 <= level <= 4,
140+
ensures
141+
0 <= va_level_to_offset(va, level) < 512,
142+
{
143+
let offset = va_level_to_offset(va, level);
144+
assert(offset < 512) by {
145+
assert(low_bits_mask(9) == 511) by {
146+
lemma_low_bits_mask_values();
147+
};
148+
assert((va >> (12 + (level - 1) as usize * 9)) & 511 <= 511) by (bit_vector);
149+
}
150+
}
151+
152+
pub proof fn lemma_va_level_to_trace_valid(va: Vaddr, level: PagingLevel)
153+
requires
154+
1 <= level <= 4,
155+
ensures
156+
NodeHelper::valid_trace(va_level_to_trace(va, level)),
157+
decreases 4 - level,
158+
{
159+
if level < 4 {
160+
lemma_va_level_to_trace_valid(va, (level + 1) as PagingLevel);
161+
lemma_va_level_to_offset_range(va, (level + 1) as PagingLevel);
162+
assert(va_level_to_trace(va, level) == va_level_to_trace(
163+
va,
164+
(level + 1) as PagingLevel,
165+
).push(va_level_to_offset(va, (level + 1) as PagingLevel)));
166+
}
167+
}
168+
169+
} // verus!
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use vstd::prelude::*;
2+
3+
verus! {
4+
5+
// Configurations
6+
// Cpu
7+
pub spec const GLOBAL_CPU_NUM: nat = 2;
8+
9+
// Frame
10+
pub spec const GLOBAL_FRAME_NUM: nat = 1024;
11+
12+
pub spec const FRAME_SIZE: nat = 4096;
13+
14+
// Pte
15+
pub exec const PTE_NUM: usize = 512;
16+
17+
} // verus!
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pub mod configs;
2+
pub mod common;
3+
4+
pub use configs::*;
5+
pub use common::*;

lock-protocol/src/mm/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ pub mod frame;
22
pub(crate) mod page_prop;
33
pub mod page_table;
44
pub mod vm_space;
5+
pub mod frame_concurrent;
6+
pub mod lock_protocol_utils;
57

68
use std::ops::Range;
79

0 commit comments

Comments
 (0)