@@ -7,7 +7,8 @@ use crate::{
77 helpers:: conversion:: usize_mod_is_int_mod,
88 mm:: {
99 cursor:: spec_helpers:: {
10- self , alloc_model_do_not_change_except_add_frame, spt_do_not_change_above_level, spt_do_not_change_except_frames_change, spt_do_not_change_except_modify_pte
10+ self , alloc_model_do_not_change_except_add_frame, spt_do_not_change_above_level,
11+ spt_do_not_change_except_frames_change, spt_do_not_change_except_modify_pte,
1112 } ,
1213 frame:: allocator:: AllocatorModel ,
1314 meta:: AnyFrameMeta ,
@@ -19,7 +20,8 @@ use crate::{
1920 NR_ENTRIES ,
2021 } ,
2122 sync:: rcu:: RcuDrop ,
22- task:: DisabledPreemptGuard , x86_64:: NR_LEVELS_SPEC ,
23+ task:: DisabledPreemptGuard ,
24+ x86_64:: NR_LEVELS_SPEC ,
2325} ;
2426
2527use super :: { Child , ChildRef , PageTableGuard , PageTableNode , PageTableNodeRef } ;
@@ -83,17 +85,24 @@ impl<'a, 'rcu, C: PageTableConfig> Entry<'a, 'rcu, C> {
8385 &&& self . pte. is_present( ) <==> {
8486 &&& spt. alloc_model. meta_map. contains_key( self . pte. frame_paddr( ) as int)
8587 }
86- &&& forall |level: u8 | self . pte. is_last( level) <==> {
87- spt. ptes. value( ) . contains_key( self . pte. pte_paddr( ) as int) && level == 1
88- }
89- &&& forall |level: u8 | !self . pte. is_last( level) <==> {
90- &&& #[ trigger] spt. i_ptes. value( ) . contains_key( #[ trigger] self . pte. pte_paddr_spec( ) as int)
91- &&& level == self . node. level_spec( & spt. alloc_model)
92- &&& #[ trigger] level_is_in_range:: <C >( level as int)
93- // When this is an intermediate PTE, the child frame's level should be one less than current node's level
94- &&& spt. alloc_model. meta_map. contains_key( self . pte. frame_paddr( ) as int)
95- &&& spt. alloc_model. meta_map[ self . pte. frame_paddr( ) as int] . value( ) . level == level - 1
96- }
88+ &&& forall|level: u8 |
89+ self . pte. is_last( level) <==> {
90+ spt. ptes. value( ) . contains_key( self . pte. pte_paddr( ) as int) && level == 1
91+ }
92+ &&& forall|level: u8 |
93+ !self . pte. is_last( level) <==> {
94+ &&& #[ trigger] spt. i_ptes. value( ) . contains_key(
95+ #[ trigger] self . pte. pte_paddr_spec( ) as int,
96+ )
97+ &&& level == self . node. level_spec( & spt. alloc_model)
98+ &&& #[ trigger] level_is_in_range:: <C >(
99+ level as int,
100+ )
101+ // When this is an intermediate PTE, the child frame's level should be one less than current node's level
102+ &&& spt. alloc_model. meta_map. contains_key( self . pte. frame_paddr( ) as int)
103+ &&& spt. alloc_model. meta_map[ self . pte. frame_paddr( ) as int] . value( ) . level == level
104+ - 1
105+ }
97106 }
98107
99108 #[ verifier:: external_body]
0 commit comments