summaryrefslogtreecommitdiff
path: root/src/lem_interp/interp_inter_imp.lem
diff options
context:
space:
mode:
authorKathy Gray2016-09-13 14:07:09 +0100
committerKathy Gray2016-09-13 14:07:17 +0100
commite354b3dfac6ce4bd2dda99edc3fa2c91ed4c5b88 (patch)
treec28cf94d42ee04f92dd214bf068f3ae2cbfae412 /src/lem_interp/interp_inter_imp.lem
parentb4323d7b1ac849d555ea699503bd67510142f8c3 (diff)
Add optional address to memv events
Diffstat (limited to 'src/lem_interp/interp_inter_imp.lem')
-rw-r--r--src/lem_interp/interp_inter_imp.lem18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/lem_interp/interp_inter_imp.lem b/src/lem_interp/interp_inter_imp.lem
index e400ecec..8b81b83f 100644
--- a/src/lem_interp/interp_inter_imp.lem
+++ b/src/lem_interp/interp_inter_imp.lem
@@ -384,7 +384,7 @@ let rec interp_to_value_helper arg ivh_mode err_str instr direction registers ev
(Ivh_error (Internal_error ("Write memory request in a " ^ errk_str)), events_out)
| (Interp.Action (Interp.Write_ea _ _) _,_,_) ->
(Ivh_error (Internal_error ("Write ea request in a " ^ errk_str)), events_out)
- | (Interp.Action (Interp.Write_memv _ _) _,_,_) ->
+ | (Interp.Action (Interp.Write_memv _ _ _) _,_,_) ->
(Ivh_error (Internal_error ("Write memory value request in a " ^ errk_str)), events_out)
| _ -> (Ivh_error (Internal_error ("Non expected action in a " ^ errk_str)), events_out)
end
@@ -731,14 +731,20 @@ let rec interp_to_outcome mode context thunk =
Write_ea write_k (Address_lifted location address_int) length tracking (IState next_state context)
else Error "Memory address for write is not 64 bits"
| _ -> Error ("Memory function " ^ i ^ " to signal impending write, not found") end, lm)
- | Interp.Write_memv (Id_aux (Id i) _) write_val ->
+ | Interp.Write_memv (Id_aux (Id i) _) address_val write_val ->
(match List.lookup i mem_write_vals with
- | (Just (MV return)) ->
+ | (Just (MV parmf return)) ->
let (value, v_tracking) =
match (Interp.detaint write_val) with
| Interp.V_tuple[_;v] -> (extern_mem_value mode (Interp.retaint write_val v))
| _ -> (extern_mem_value mode write_val) end in
- Write_memv value v_tracking
+ let location_opt = match parmf mode address_val with
+ | Nothing -> Nothing
+ | Just mv -> let address_int = match (maybe_all (List.map byte_of_byte_lifted mv)) with
+ | Just bs -> Just (integer_of_byte_list bs)
+ | _ -> Nothing end in Just (Address_lifted mv address_int) end
+ in
+ Write_memv location_opt value v_tracking
(fun b ->
match return with
| Nothing -> (IState (Interp.add_answer_to_stack next_state Interp.unitv) context)
@@ -844,11 +850,11 @@ let rec ie_loop mode register_values (IState interp_state context) =
| (Write_ea write_k loc length tracking i_state, _) ->
let (events,analysis_data) = ie_loop mode register_values i_state in
((E_write_ea write_k loc length tracking)::events,analysis_data)
- | (Write_memv value tracking i_state_fun, _) ->
+ | (Write_memv opt_address value tracking i_state_fun, _) ->
let (events,analysis_data) = ie_loop mode register_values (i_state_fun true) in
let (events',analysis_data) = ie_loop mode register_values (i_state_fun false) in
(*TODO: consider if lm and lm should be merged*)
- ((E_write_memv value tracking)::(events++events'),analysis_data)
+ ((E_write_memv opt_address value tracking)::(events++events'),analysis_data)
| (Barrier barrier_k i_state, _) ->
let (events,analysis_data) = ie_loop mode register_values i_state in
((E_barrier barrier_k)::events,analysis_data)