ostd/specs/mm/page_table/
view.rs1use vstd::{arithmetic::power2::pow2, prelude::*};
2use vstd_extra::ownership::*;
3
4use crate::specs::arch::MAX_PADDR;
5
6use super::*;
7use crate::mm::{Paddr, Vaddr, page_prop::PageProperty};
8use core::{marker::PhantomData, ops::Range};
9
10verus! {
11
12pub ghost struct Mapping {
26 pub va_range: Range<int>,
27 pub pa_range: Range<Paddr>,
28 pub page_size: usize,
29 pub property: PageProperty,
30}
31
32pub ghost struct PageTableView {
35 pub mappings: Set<Mapping>,
36}
37
38impl Mapping {
39 pub open spec fn disjoint_vaddrs(m1: Mapping, m2: Mapping) -> bool {
40 m1.va_range.end <= m2.va_range.start || m2.va_range.end <= m1.va_range.start
41 }
42
43 pub open spec fn disjoint_paddrs(m1: Mapping, m2: Mapping) -> bool {
44 m1.pa_range.end <= m2.pa_range.start || m2.pa_range.end <= m1.pa_range.start
45 }
46
47 pub open spec fn inv(self) -> bool {
48 &&& set![4096, 2097152, 1073741824].contains(self.page_size)
49 &&& self.pa_range.start % self.page_size == 0
50 &&& self.pa_range.start + self.page_size == self.pa_range.end
51 &&& self.pa_range.end <= MAX_PADDR
52 &&& self.va_range.start % self.page_size as int == 0
53 &&& self.va_range.start + self.page_size as int == self.va_range.end
54 &&& 0
55 <= self.va_range.start
56 &&& self.va_range.end <= pow2(64)
61 }
62}
63
64pub open spec fn mappings_well_formed(mappings: Set<Mapping>) -> bool {
66 forall|m: Mapping| #[trigger] mappings.contains(m) ==> m.inv()
67}
68
69pub open spec fn mappings_disjoint_vaddrs(mappings: Set<Mapping>) -> bool {
71 forall|m: Mapping, n: Mapping|
72 #![trigger mappings.contains(m), mappings.contains(n)]
73 mappings.contains(m) && mappings.contains(n) && m != n ==> Mapping::disjoint_vaddrs(m, n)
74}
75
76pub open spec fn mappings_disjoint_paddrs(mappings: Set<Mapping>) -> bool {
78 forall|m: Mapping, n: Mapping|
79 #![trigger mappings.contains(m), mappings.contains(n)]
80 mappings.contains(m) && mappings.contains(n) && m != n ==> Mapping::disjoint_paddrs(m, n)
81}
82
83impl PageTableView {
85 pub open spec fn inv(self) -> bool {
86 &&& mappings_well_formed(self.mappings)
87 &&& mappings_disjoint_vaddrs(self.mappings)
88 &&& mappings_disjoint_paddrs(self.mappings)
89 }
90}
91
92}