1use vstd::prelude::*;
16use vstd_extra::arithmetic::lemma_mod_0_add;
17
18use crate::mm::{Paddr, PagingConstsTrait, Vaddr};
19
20verus! {
21
22pub trait ArchAddressSpaceModel {
28 type C: PagingConstsTrait;
29
30 spec fn max_paddr_spec() -> Paddr;
32
33 spec fn linear_mapping_base_vaddr_spec() -> Vaddr;
35
36 spec fn vmalloc_base_vaddr_spec() -> Vaddr;
38
39 proof fn lemma_model_requirements()
41 ensures
42 0 < Self::max_paddr_spec(),
43 Self::C::BASE_PAGE_SIZE() <= Self::max_paddr_spec(),
44 Self::max_paddr_spec() % Self::C::BASE_PAGE_SIZE() == 0,
45 Self::linear_mapping_base_vaddr_spec() % Self::C::BASE_PAGE_SIZE() == 0,
46 Self::max_paddr_spec() + Self::linear_mapping_base_vaddr_spec()
47 < Self::vmalloc_base_vaddr_spec(),
48 ;
49}
50
51pub open spec fn valid_frame_paddr_for<A: ArchAddressSpaceModel>(pa: Paddr) -> bool {
53 pa % A::C::BASE_PAGE_SIZE() == 0 && pa < A::max_paddr_spec()
54}
55
56pub open spec fn paddr_to_vaddr_for<A: ArchAddressSpaceModel>(pa: Paddr) -> Vaddr {
58 (pa + A::linear_mapping_base_vaddr_spec()) as usize
59}
60
61pub open spec fn vaddr_to_paddr_for<A: ArchAddressSpaceModel>(va: Vaddr) -> Paddr {
63 (va - A::linear_mapping_base_vaddr_spec()) as usize
64}
65
66pub proof fn lemma_paddr_to_vaddr_properties_for<A: ArchAddressSpaceModel>(pa: Paddr)
68 requires
69 pa < A::vmalloc_base_vaddr_spec() - A::linear_mapping_base_vaddr_spec(),
70 ensures
71 A::linear_mapping_base_vaddr_spec() <= paddr_to_vaddr_for::<A>(pa)
72 < A::vmalloc_base_vaddr_spec(),
73 vaddr_to_paddr_for::<A>(paddr_to_vaddr_for::<A>(pa)) == pa,
74{
75}
76
77pub proof fn lemma_vaddr_to_paddr_properties_for<A: ArchAddressSpaceModel>(va: Vaddr)
79 requires
80 A::linear_mapping_base_vaddr_spec() <= va < A::vmalloc_base_vaddr_spec(),
81 ensures
82 vaddr_to_paddr_for::<A>(va) < A::vmalloc_base_vaddr_spec()
83 - A::linear_mapping_base_vaddr_spec(),
84 paddr_to_vaddr_for::<A>(vaddr_to_paddr_for::<A>(va)) == va,
85{
86}
87
88pub proof fn lemma_paddr_to_vaddr_aligned_for<A: ArchAddressSpaceModel>(pa: Paddr)
90 requires
91 pa < A::vmalloc_base_vaddr_spec() - A::linear_mapping_base_vaddr_spec(),
92 pa % A::C::BASE_PAGE_SIZE() == 0,
93 ensures
94 paddr_to_vaddr_for::<A>(pa) % A::C::BASE_PAGE_SIZE() == 0,
95{
96 A::C::lemma_paging_consts_requirements();
97 A::lemma_model_requirements();
98 lemma_mod_0_add(
99 pa as int,
100 A::linear_mapping_base_vaddr_spec() as int,
101 A::C::BASE_PAGE_SIZE() as int,
102 );
103}
104
105}