@@ -123,6 +123,15 @@ impl<C: PageTableConfig> PageTableEntryPerms<C> {
123123 }
124124 }
125125
126+ pub open spec fn relate_nid( & self , nid: NodeId ) -> bool {
127+ forall|i: int|
128+ #![ trigger self . inner. value( ) [ i] ]
129+ 0 <= i < 512 ==> {
130+ self . inner. value( ) [ i] . nid@ is Some ==>
131+ self . inner. value( ) [ i] . nid@->Some_0 == NodeHelper :: get_child( nid, i as nat)
132+ }
133+ }
134+
126135 pub open spec fn addr( & self ) -> Vaddr {
127136 self . inner. addr( )
128137 }
@@ -247,6 +256,7 @@ struct_with_invariants! {
247256}
248257
249258pub tracked struct SpinGuardGhostInner <C : PageTableConfig > {
259+ pub handle: SpinGuardToken <C >,
250260 pub node_token: Option <NodeToken >,
251261 pub pte_token: Option <PteArrayToken >,
252262 pub stray_perm: StrayPerm ,
@@ -313,25 +323,35 @@ impl<C: PageTableConfig> SpinGuardGhostInner<C> {
313323 &&& self . perms. wf( spinlock. paddr@, spinlock. level@, spinlock. pt_inst@. id( ) , spinlock. nid@)
314324 &&& self . perms. addr( ) == paddr_to_vaddr( spinlock. paddr@)
315325 }
326+
327+ pub open spec fn relate_nid( self , nid: NodeId ) -> bool {
328+ &&& self . node_token is Some ==> self . node_token->Some_0 . key( ) == nid
329+ &&& self . pte_token is Some ==> self . pte_token->Some_0 . key( ) == nid
330+ &&& self . stray_perm. nid( ) == nid
331+ &&& self . perms. relate_nid( nid)
332+ }
316333}
317334
318335pub struct SpinGuard <C : PageTableConfig > {
319- pub handle: Tracked <SpinGuardToken <C >>,
320336 pub inner: Tracked <SpinGuardGhostInner <C >>,
321337}
322338
323339impl <C : PageTableConfig > SpinGuard <C > {
324340 pub open spec fn wf( self , spinlock: & PageTablePageSpinLock <C >) -> bool {
325- &&& self . handle@ . instance_id( ) == spinlock. inst@. id( )
341+ &&& self . handle( ) . instance_id( ) == spinlock. inst@. id( )
326342 &&& self . inner@. wf( spinlock)
327343 }
328344
329345 /// Used in PageTableGuard::write_pte
330346 pub open spec fn wf_except( self , spinlock: & PageTablePageSpinLock <C >, idx: nat) -> bool {
331- &&& self . handle@ . instance_id( ) == spinlock. inst@. id( )
347+ &&& self . handle( ) . instance_id( ) == spinlock. inst@. id( )
332348 &&& self . inner@. wf_except( spinlock, idx)
333349 }
334350
351+ pub open spec fn handle( & self ) -> SpinGuardToken <C > {
352+ self . inner@. handle
353+ }
354+
335355 pub open spec fn node_token( & self ) -> Option <NodeToken > {
336356 self . inner@. node_token
337357 }
@@ -394,7 +414,7 @@ impl<C: PageTableConfig> SpinGuard<C> {
394414 self . stray_perm( ) == old( self ) . stray_perm( ) ,
395415 self . perms( ) == old( self ) . perms( ) ,
396416 self . in_protocol( ) == old( self ) . in_protocol( ) ,
397- self . handle == old( self ) . handle,
417+ self . handle( ) == old( self ) . handle( ) ,
398418 {
399419 let tracked res = self . inner. borrow_mut( ) . node_token. tracked_take( ) ;
400420 Tracked ( res)
@@ -410,7 +430,7 @@ impl<C: PageTableConfig> SpinGuard<C> {
410430 self . stray_perm( ) == old( self ) . stray_perm( ) ,
411431 self . perms( ) == old( self ) . perms( ) ,
412432 self . in_protocol( ) == old( self ) . in_protocol( ) ,
413- self . handle == old( self ) . handle,
433+ self . handle( ) == old( self ) . handle( ) ,
414434 {
415435 unimplemented!( )
416436 }
@@ -423,7 +443,7 @@ impl<C: PageTableConfig> SpinGuard<C> {
423443 self . pte_token( ) == old( self ) . pte_token( ) ,
424444 self . stray_perm( ) == old( self ) . stray_perm( ) ,
425445 self . perms( ) == old( self ) . perms( ) ,
426- self . handle == old( self ) . handle,
446+ self . handle( ) == old( self ) . handle( ) ,
427447 {
428448 proof {
429449 self . inner. borrow_mut( ) . in_protocol = in_protocol. get( ) ;
@@ -527,8 +547,8 @@ impl<C: PageTableConfig> PageTablePageSpinLock<C> {
527547 }
528548 }
529549 let guard = SpinGuard {
530- handle: Tracked ( handle) ,
531550 inner: Tracked ( SpinGuardGhostInner {
551+ handle: handle,
532552 node_token: node_token,
533553 pte_token: pte_token,
534554 stray_perm: stray_perm,
@@ -641,8 +661,8 @@ impl<C: PageTableConfig> PageTablePageSpinLock<C> {
641661 node_token = self . pt_inst. borrow( ) . normal_lock( self . nid@, node_token) ;
642662 }
643663 let guard = SpinGuard {
644- handle: Tracked ( handle) ,
645664 inner: Tracked ( SpinGuardGhostInner {
665+ handle: handle,
646666 node_token: Some ( node_token) ,
647667 pte_token: Some ( pte_token) ,
648668 stray_perm: stray_perm,
@@ -667,8 +687,8 @@ impl<C: PageTableConfig> PageTablePageSpinLock<C> {
667687 guard. wf( self ) ,
668688 guard. in_protocol( ) == false ,
669689 {
670- let tracked handle = guard. handle. get( ) ;
671690 let tracked inner = guard. inner. get( ) ;
691+ let tracked handle = inner. handle;
672692 let tracked mut node_token: Option <NodeToken > = inner. node_token;
673693 let tracked pte_token: Option <PteArrayToken > = inner. pte_token;
674694 let tracked stray_perm: StrayPerm = inner. stray_perm;
@@ -819,8 +839,8 @@ impl<C: PageTableConfig> PageTablePageSpinLock<C> {
819839 m. token = res. 1 . get( ) ;
820840 }
821841 let guard = SpinGuard {
822- handle: Tracked ( handle) ,
823842 inner: Tracked ( SpinGuardGhostInner {
843+ handle: handle,
824844 node_token: Some ( node_token) ,
825845 pte_token: Some ( pte_token) ,
826846 stray_perm: stray_perm,
@@ -860,8 +880,8 @@ impl<C: PageTableConfig> PageTablePageSpinLock<C> {
860880 res@. cur_node( ) == self . nid( ) ,
861881 {
862882 let tracked m = m. get( ) ;
863- let tracked handle = guard. handle. get( ) ;
864883 let tracked inner = guard. inner. get( ) ;
884+ let tracked handle = inner. handle;
865885 let tracked mut node_token: NodeToken = inner. node_token. tracked_unwrap( ) ;
866886 let tracked pte_token: PteArrayToken = inner. pte_token. tracked_unwrap( ) ;
867887 let tracked stray_perm: StrayPerm = inner. stray_perm;
0 commit comments