summaryrefslogtreecommitdiff
path: root/src/lem_interp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lem_interp')
-rw-r--r--src/lem_interp/interp_inter_imp.lem8
-rw-r--r--src/lem_interp/interp_interface.lem4
-rw-r--r--src/lem_interp/printing_functions.mli1
-rw-r--r--src/lem_interp/run_interp_model.ml68
-rw-r--r--src/lem_interp/run_with_elf.ml7
5 files changed, 52 insertions, 36 deletions
diff --git a/src/lem_interp/interp_inter_imp.lem b/src/lem_interp/interp_inter_imp.lem
index d65814f3..c5690a5e 100644
--- a/src/lem_interp/interp_inter_imp.lem
+++ b/src/lem_interp/interp_inter_imp.lem
@@ -491,7 +491,7 @@ let rec interp_to_outcome mode context thunk =
Read_mem read_k (Address_lifted location address_int) length tracking
(fun v -> IState (Interp.add_answer_to_stack next_state (intern_mem_value mode direction v)) context)
else Error ("Memory address on read is not 64 bits")
- | _ -> Error ("Memory " ^ i ^ " function with read kind not found")
+ | _ -> Error ("Memory function " ^ i ^ " not found")
end , lm)
| Interp.Write_mem (Id_aux (Id i) _) loc_val slice write_val ->
(match List.lookup i mem_writes with
@@ -509,7 +509,7 @@ let rec interp_to_outcome mode context thunk =
| Nothing -> (IState (Interp.add_answer_to_stack next_state Interp.unitv) context)
| Just return_bool -> return_bool (IState next_state context) b end)
else Error "Memory address on write is not 64 bits"
- | _ -> Error ("Memory " ^ i ^ " function with write kind not found")
+ | _ -> Error ("Memory function " ^ i ^ " not found")
end , lm)
| Interp.Write_ea (Id_aux (Id i) _) loc_val ->
(match List.lookup i mem_write_eas with
@@ -521,7 +521,7 @@ let rec interp_to_outcome mode context thunk =
| _ -> Nothing end in
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 " ^ i ^ " function to signal impending write, not found") end, lm)
+ | _ -> Error ("Memory function " ^ i ^ " to signal impending write, not found") end, lm)
| Interp.Write_memv (Id_aux (Id i) _) write_val ->
(match List.lookup i mem_write_vals with
| (Just (MV return)) ->
@@ -534,7 +534,7 @@ let rec interp_to_outcome mode context thunk =
match return with
| Nothing -> (IState (Interp.add_answer_to_stack next_state Interp.unitv) context)
| Just return_bool -> return_bool (IState next_state context) b end)
- | _ -> Error ("Memory " ^ i ^ " function with write value kind not found") end, lm)
+ | _ -> Error ("Memory function " ^ i ^ " not found") end, lm)
| Interp.Barrier (Id_aux (Id i) _) lval ->
(match List.lookup i barriers with
| Just barrier ->
diff --git a/src/lem_interp/interp_interface.lem b/src/lem_interp/interp_interface.lem
index e5489bd5..6fe999c9 100644
--- a/src/lem_interp/interp_interface.lem
+++ b/src/lem_interp/interp_interface.lem
@@ -394,6 +394,7 @@ end
type read_kind =
(* common reads *)
Read_plain
+ | Read_tag (*For reading the tag of tagged memory*)
(* Power reads *)
| Read_reserve
(* AArch64 reads *)
@@ -401,7 +402,8 @@ type read_kind =
type write_kind =
(* common writes *)
- Write_plain
+ Write_plain
+ | Write_tag (*For writing the tag of tagged memory*)
(* Power writes *)
| Write_conditional
(* AArch64 writes *)
diff --git a/src/lem_interp/printing_functions.mli b/src/lem_interp/printing_functions.mli
index 2b792ebb..c7747b50 100644
--- a/src/lem_interp/printing_functions.mli
+++ b/src/lem_interp/printing_functions.mli
@@ -67,3 +67,4 @@ val logfile_memory_value_to_string : end_flag -> memory_value -> string
val logfile_address_to_string : address -> string
val byte_list_to_string : byte list -> string
+val bit_lifted_to_string : bit_lifted -> string
diff --git a/src/lem_interp/run_interp_model.ml b/src/lem_interp/run_interp_model.ml
index 0bd3015a..706ab5ac 100644
--- a/src/lem_interp/run_interp_model.ml
+++ b/src/lem_interp/run_interp_model.ml
@@ -43,11 +43,10 @@ module Mem = struct
type t = num
let compare v1 v2 = compare v1 v2
end)
-(* let find idx m =
- let v = find idx m in
- v
- let add key valu m =
- add key valu m*)
+ let find idx m =
+ if mem idx m
+ then find idx m
+ else List.hd(memory_value_unknown 1)
let to_string loc v =
sprintf "[%s] -> %s" (to_string loc)
@@ -106,46 +105,56 @@ let combine_slices (start, stop) (inner_start,inner_stop) =
let unit_lit = (L_aux(L_unit,Interp_ast.Unknown))
-let rec perform_action ((reg, mem) as env) = function
+let rec perform_action ((reg, mem, tagmem) as env) = function
(* registers *)
| Read_reg0(Reg0(id,_,_,_), _) -> (Some(Reg.find id reg), env)
| Read_reg0(Reg_slice(id, _, _, range), _)
| Read_reg0(Reg_field(id, _, _, _, range), _) -> (Some(slice (Reg.find id reg) range), env)
| Read_reg0(Reg_f_slice(id, _,_,_, range, mini_range), _) ->
(Some(slice (slice (Reg.find id reg) range) mini_range),env)
- | Write_reg0(Reg0(id,_,_,_), value, _) -> (None, (Reg.add id value reg,mem))
+ | Write_reg0(Reg0(id,_,_,_), value, _) -> (None, (Reg.add id value reg,mem,tagmem))
| Write_reg0((Reg_slice(id,_,_,range) as reg_n),value, _)
| Write_reg0((Reg_field(id,_,_,_,range) as reg_n),value,_)->
let old_val = Reg.find id reg in
let new_val = fupdate_slice reg_n old_val value range in
- (None, (Reg.add id new_val reg, mem))
+ (None, (Reg.add id new_val reg, mem,tagmem))
| Write_reg0((Reg_f_slice(id,_,_,_,range,mini_range) as reg_n),value,_) ->
let old_val = Reg.find id reg in
let new_val = fupdate_slice reg_n old_val value (combine_slices range mini_range) in
- (None,(Reg.add id new_val reg,mem))
- | Read_mem0(_,location, length, _,_) ->
+ (None,(Reg.add id new_val reg,mem,tagmem))
+ | Read_mem0(kind,location, length, _,_) ->
let address = match address_of_address_lifted location with
| Some a -> a
| None -> assert false (*TODO remember how to report an error *)in
- let naddress = integer_of_address address in
- let rec reading (n : num) length =
- if length = 0
- then []
- else (Mem.find n mem)::(reading (add n big_num_unit) (length - 1)) in
- (Some (register_value_of_memory_value (reading naddress length) !default_order), env)
- | Write_mem0(_,location, length, _, bytes,_,_) ->
+ let naddress = integer_of_address address in
+ (match kind with
+ | Read_tag ->
+ (Some (register_value_of_memory_value [(Mem.find naddress tagmem)] !default_order), env)
+ | _ ->
+ let rec reading (n : num) length =
+ if length = 0
+ then []
+ else (Mem.find n mem)::(reading (add n big_num_unit) (length - 1)) in
+ (Some (register_value_of_memory_value (reading naddress length) !default_order), env))
+ | Write_mem0(kind,location, length, _, bytes,_,_) ->
let address = match address_of_address_lifted location with
| Some a -> a
| None -> assert false (*TODO remember how to report an error *)in
- let naddress = integer_of_address address in
- let rec writing location length bytes mem =
- if length = 0
- then mem
- else match bytes with
- | [] -> mem
- | b::bytes ->
- writing (add location big_num_unit) (length - 1) bytes (Mem.add location b mem) in
- (None,(reg,writing naddress length bytes mem))
+ let naddress = integer_of_address address in
+ (match kind with
+ | Write_tag ->
+ (match bytes with
+ | [b] -> (None,(reg,mem,Mem.add naddress b tagmem))
+ | _ -> assert false)
+ | _ ->
+ let rec writing location length bytes mem =
+ if length = 0
+ then mem
+ else match bytes with
+ | [] -> mem
+ | b::bytes ->
+ writing (add location big_num_unit) (length - 1) bytes (Mem.add location b mem) in
+ (None,(reg,writing naddress length bytes mem,tagmem)))
| _ -> (None, env)
;;
@@ -170,6 +179,7 @@ let run
(istate : instruction_state)
reg
mem
+ tagmem
eager_eval
track_dependencies
mode
@@ -186,7 +196,7 @@ let run
mem print content of memory
exh run interpreter exhaustively with unknown and print events
quit exit interpreter" in
- let rec interact mode ((reg, mem) as env) stack =
+ let rec interact mode ((reg, mem, tagmem) as env) stack =
flush_all();
let command = Pervasives.read_line () in
let command' = if command = "" then mode_to_string mode else command in
@@ -350,9 +360,9 @@ let run
(Pretty_interp.pp_exp top_env Printing_functions.red top_exp);
try
Printexc.record_backtrace true;
- loop mode (reg, mem) (Interp_inter_imp.interp0 imode istate)
+ loop mode (reg, mem,tagmem) (Interp_inter_imp.interp0 imode istate)
with e ->
let trace = Printexc.get_backtrace () in
interactf "%s: %s %s\n%s\n" (grey name) (red "interpretor error") (Printexc.to_string e) trace;
- (false, mode, !track_dependencies, (reg, mem))
+ (false, mode, !track_dependencies, (reg, mem, tagmem))
;;
diff --git a/src/lem_interp/run_with_elf.ml b/src/lem_interp/run_with_elf.ml
index c971550d..75ed3b33 100644
--- a/src/lem_interp/run_with_elf.ml
+++ b/src/lem_interp/run_with_elf.ml
@@ -23,6 +23,7 @@ let hex_to_big_int s = big_int_of_int64 (Int64.of_string s) ;;
let data_mem = (ref Mem.empty : (memory_byte Run_interp_model.Mem.t) ref) ;;
let prog_mem = (ref Mem.empty : (memory_byte Run_interp_model.Mem.t) ref) ;;
+let tag_mem = (ref Mem.empty : (memory_byte Run_interp_model.Mem.t) ref);;
let reg = ref Reg.empty ;;
let add_mem byte addr mem =
@@ -529,6 +530,7 @@ let initial_system_state_of_elf_file name =
begin
prog_mem := Mem.empty;
data_mem := Mem.empty;
+ tag_mem := Mem.empty;
load_memory_segments segments;
(*
debugf "prog_mem\n";
@@ -956,11 +958,12 @@ let rec fde_loop count context model mode track_dependencies opcode addr_trans =
else
begin
set_next_instruction_address model;
- match Run_interp_model.run istate !reg !prog_mem !eager_eval track_dependencies mode "execute" with
+ match Run_interp_model.run istate !reg !prog_mem !tag_mem !eager_eval track_dependencies mode "execute" with
| false, _,_, _ -> errorf "FAILURE\n"; exit 1
- | true, mode, track_dependencies, (my_reg, my_mem) ->
+ | true, mode, track_dependencies, (my_reg, my_mem, my_tags) ->
reg := my_reg;
prog_mem := my_mem;
+ tag_mem := my_tags;
let opcode = fetch_instruction_opcode_and_update_ia model addr_trans in
fde_loop (count + 1) context model (Some mode) (ref track_dependencies) opcode addr_trans
end