@@ -1588,10 +1588,7 @@ Definition write_mem (tid : nat) (loc : Loc.t) (viio : view)
15881588 mset fst $ TState.update_coh loc time;;
15891589 mset fst $ TState.update TState.vwr time;;
15901590 mset fst $ TState.update TState.vrel (view_if is_release time);;
1591- match new_promise with
1592- | true => mret (time, Some vpre)
1593- | false => mret (time, None)
1594- end .
1591+ mret $ if (new_promise : bool) then (time, Some vpre) else (time, None).
15951592
15961593(** Tries to perform a memory write.
15971594
@@ -1834,32 +1831,34 @@ Definition run_take_exception (fault : exn) (vmax_t : view) :
18341831
18351832(** Runs an outcome. *)
18361833Section RunOutcome.
1837- Context (tid : nat) (initmem : memoryMap).
1834+ Context (mem_update : bool).
1835+ Context (tid : nat).
1836+ Context (initmem : memoryMap).
18381837
1839- Equations run_outcome (out : outcome) (mem_update : bool) :
1838+ Equations run_outcome (out : outcome) :
18401839 Exec.t (PPState.t TState.t Ev.t IIS.t) string (eff_ret out * option view) :=
1841- | RegRead reg racc, mem_update =>
1840+ | RegRead reg racc =>
18421841 val ← Exec.liftSt (PPState.state ×× PPState.iis) $ (run_reg_read reg racc);
18431842 mret (val, None)
1844- | RegWrite reg racc val, mem_update =>
1843+ | RegWrite reg racc val =>
18451844 run_reg_write reg racc val;;
18461845 mret ((), None)
1847- | MemRead (MemReq.make macc addr addr_space 8 0), mem_update =>
1846+ | MemRead (MemReq.make macc addr addr_space 8 0) =>
18481847 guard_or "Access outside Non-Secure" (addr_space = PAS_NonSecure);;
18491848 let initmem := Memory.initial_from_memMap initmem in
18501849 val ← run_mem_read addr macc initmem;
18511850 mret (Ok (val, 0%bv), None)
1852- | MemRead (MemReq.make macc addr addr_space 4 0), mem_update => (* ifetch *)
1851+ | MemRead (MemReq.make macc addr addr_space 4 0) => (* ifetch *)
18531852 guard_or "Access outside Non-Secure" (addr_space = PAS_NonSecure);;
18541853 let initmem := Memory.initial_from_memMap initmem in
18551854 opcode ← Exec.liftSt PPState.mem $ run_mem_read4 addr macc initmem;
18561855 mret (Ok (opcode, 0%bv), None)
1857- | MemRead _, mem_update => mthrow "Memory read of size other than 8 or 4, or with tags"
1858- | MemWriteAddrAnnounce _, mem_update =>
1856+ | MemRead _ => mthrow "Memory read of size other than 8 or 4, or with tags"
1857+ | MemWriteAddrAnnounce _ =>
18591858 vaddr ← mget (IIS.strict ∘ PPState.iis);
18601859 mset PPState.state $ TState.update TState.vspec vaddr;;
18611860 mret ((), None)
1862- | MemWrite (MemReq.make macc addr addr_space 8 0) val _, mem_update =>
1861+ | MemWrite (MemReq.make macc addr addr_space 8 0) val _ =>
18631862 guard_or "Access outside Non-Secure" (addr_space = PAS_NonSecure);;
18641863 addr ← othrow "Address not supported" $ Loc.from_addr addr;
18651864 viio ← mget (IIS.strict ∘ PPState.iis);
@@ -1871,36 +1870,36 @@ Section RunOutcome.
18711870 write_mem_xcl tid addr viio invalidation macc val mem_update;
18721871 mret (Ok (), vpre_opt)
18731872 else mthrow "Unsupported non-explicit write"
1874- | MemWrite _ _ _, mem_update => mthrow "Memory write of size other than 8, or with tags"
1875- | Barrier barrier, mem_update =>
1873+ | MemWrite _ _ _ => mthrow "Memory write of size other than 8, or with tags"
1874+ | Barrier barrier =>
18761875 mem ← mget PPState.mem;
18771876 Exec.liftSt (PPState.state ×× PPState.iis) $ run_barrier barrier (length mem);;
18781877 mret ((), None)
1879- | TlbOp tlbi, mem_update =>
1878+ | TlbOp tlbi =>
18801879 viio ← mget (IIS.strict ∘ PPState.iis);
18811880 run_tlbi tid viio tlbi;;
18821881 mret ((), None)
1883- | ReturnException, mem_update =>
1882+ | ReturnException =>
18841883 mem ← mget PPState.mem;
18851884 Exec.liftSt (PPState.state ×× PPState.iis) $ run_cse (length mem);;
18861885 mret ((), None)
1887- | TranslationStart trans_start, mem_update =>
1886+ | TranslationStart trans_start =>
18881887 let initmem := Memory.initial_from_memMap initmem in
18891888 run_trans_start trans_start tid initmem;;
18901889 mret ((), None)
1891- | TranslationEnd trans_end, mem_update =>
1890+ | TranslationEnd trans_end =>
18921891 Exec.liftSt (PPState.state ×× PPState.iis) $ run_trans_end trans_end;;
18931892 mret ((), None)
1894- | GenericFail s, mem_update => mthrow ("Instruction failure: " ++ s)%string
1895- | TakeException fault, mem_update =>
1893+ | GenericFail s => mthrow ("Instruction failure: " ++ s)%string
1894+ | TakeException fault =>
18961895 mem ← mget PPState.mem;
18971896 Exec.liftSt (PPState.state ×× PPState.iis) $ run_take_exception fault (length mem);;
18981897 mret ((), None)
1899- | _, mem_update => mthrow "Unsupported outcome".
1898+ | _ => mthrow "Unsupported outcome".
19001899
19011900 Definition run_outcome' (out : outcome) :
19021901 Exec.t (PPState.t TState.t Ev.t IIS.t) string (eff_ret out) :=
1903- run_outcome out true |$> fst.
1902+ run_outcome out |$> fst.
19041903End RunOutcome.
19051904
19061905Module CProm.
@@ -1939,14 +1938,17 @@ Section ComputeProm.
19391938 (base : view)
19401939 (out : outcome) :
19411940 Exec.t (CProm.t * PPState.t TState.t Ev.t IIS.t) string (eff_ret out) :=
1942- '(res, vpre_opt) ← Exec.liftSt snd $ run_outcome tid initmem out true ;
1941+ '(res, vpre_opt) ← Exec.liftSt snd $ run_outcome true tid initmem out;
19431942 if vpre_opt is Some vpre then
19441943 mem ← mget (PPState.mem ∘ snd);
19451944 mset fst (CProm.add_if mem vpre base);;
19461945 mret res
19471946 else
19481947 mret res.
19491948
1949+ (* Run the thread state until termination, collecting certifiable promises.
1950+ Returns true if termination occurs within the given fuel,
1951+ false otherwise. *)
19501952 Fixpoint run_to_termination_promise
19511953 (isem : iMon ())
19521954 (fuel : nat)
@@ -1978,12 +1980,6 @@ Section ComputeProm.
19781980 (∀ r ∈ res, r.2 = true);;
19791981 mret $ (CProm.proms (union_list res.*1.*1), []).
19801982
1981- Definition run_outcome_with_no_promise
1982- (out : outcome) :
1983- Exec.t (PPState.t TState.t Ev.t IIS.t) string (eff_ret out) :=
1984- '(res, _) ← run_outcome tid initmem out false;
1985- mret res.
1986-
19871983 Fixpoint run_to_termination_no_promise
19881984 (isem : iMon ())
19891985 (fuel : nat) :
@@ -1993,7 +1989,7 @@ Section ComputeProm.
19931989 ts ← mget PPState.state;
19941990 mret (term (TState.reg_map ts))
19951991 | S fuel =>
1996- let handler := run_outcome_with_no_promise in
1992+ let handler := run_outcome' false tid initmem in
19971993 cinterp handler isem;;
19981994 ts ← mget PPState.state;
19991995 if term (TState.reg_map ts) then
@@ -2040,7 +2036,7 @@ Definition VMPromising_nocert' : PromisingModel :=
20402036 address_space := PAS_NonSecure;
20412037 mEvent := Ev.t;
20422038 allowed_promises := allowed_promises_nocert;
2043- handler := run_outcome';
2039+ handler := run_outcome' true ;
20442040 emit_promise := λ tid initmem mem msg, TState.promise (length mem);
20452041 memory_snapshot :=
20462042 λ initmem, Memory.to_memMap (Memory.initial_from_memMap initmem);
@@ -2051,7 +2047,7 @@ Definition VMPromising_nocert isem :=
20512047
20522048Definition seq_step (isem : iMon ()) (tid : nat) (initmem : memoryMap)
20532049 : relation (TState.t * Memory.t) :=
2054- let handler := run_outcome' tid initmem in
2050+ let handler := run_outcome' true tid initmem in
20552051 λ '(ts, mem) '(ts', mem'),
20562052 (ts', mem') ∈
20572053 PPState.state ×× PPState.mem
@@ -2068,7 +2064,7 @@ Definition allowed_promises_cert (isem : iMon ()) tid (initmem : memoryMap)
20682064 ]}.
20692065
20702066
2071- Definition VMPromising_cert' (isem : iMon ()) : PromisingModel :=
2067+ Definition VMPromising_cert' (isem : iMon ()) : PromisingModel :=
20722068 {|tState := TState.t;
20732069 tState_init := λ tid, TState.init;
20742070 tState_regs := TState.reg_map;
@@ -2077,7 +2073,7 @@ Definition VMPromising_cert' (isem : iMon ()) : PromisingModel :=
20772073 iis_init := IIS.init;
20782074 address_space := PAS_NonSecure;
20792075 mEvent := Ev.t;
2080- handler := run_outcome';
2076+ handler := run_outcome' true ;
20812077 allowed_promises := allowed_promises_cert isem;
20822078 emit_promise := λ tid initmem mem msg, TState.promise (length mem);
20832079 memory_snapshot :=
0 commit comments