summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lem_interp/run_with_elf.ml21
-rw-r--r--src/lem_interp/run_with_elf_cheri.ml19
2 files changed, 37 insertions, 3 deletions
diff --git a/src/lem_interp/run_with_elf.ml b/src/lem_interp/run_with_elf.ml
index 61d5d1df..4a3625ed 100644
--- a/src/lem_interp/run_with_elf.ml
+++ b/src/lem_interp/run_with_elf.ml
@@ -784,9 +784,11 @@ let break_point = ref false
let break_instr = ref 0
let max_cut_off = ref false
let max_instr = ref 0
+let raw_file = ref ""
+let raw_at = ref 0
let args = [
- ("--file", Arg.Set_string file, "filename binary code to load in memory");
+ ("--file", Arg.Set_string file, "filename of elf binary to load in memory");
("--quiet", Arg.Clear Run_interp_model.interact_print, "do not display per-instruction actions");
("--silent", Arg.Tuple [Arg.Clear Run_interp_model.error_print;
Arg.Clear Run_interp_model.interact_print;
@@ -796,6 +798,8 @@ let args = [
("--interactive", Arg.Clear eager_eval , "interactive execution");
("--breakpoint", Arg.Int (fun i -> break_point := true; break_instr:= i), "run to instruction number i, then run interactively");
("--max_instruction", Arg.Int (fun i -> max_cut_off := true; max_instr := i), "only run i instructions, then stop");
+ ("--raw", Arg.Set_string raw_file, "filename of raw file to load in memory");
+ ("--at", Arg.Set_int raw_at, "address to load raw file in memory");
]
let time_it action arg =
@@ -1068,7 +1072,18 @@ let rec fde_loop count context model mode track_dependencies addr_trans =
fde_loop (count + 1) context model mode track_dependencies addr_trans
end
end
-
+
+let rec load_raw_file' mem addr chan =
+ let byte = input_byte chan in
+ (add_mem byte addr mem;
+ load_raw_file' mem (Nat_big_num.succ addr) chan)
+
+let rec load_raw_file mem addr chan =
+ try
+ load_raw_file' mem addr chan
+ with
+ | End_of_file -> ()
+
let run () =
Arg.parse args (fun _ -> raise (Arg.Bad "anonymous parameter")) "" ;
if !file = "" then begin
@@ -1090,6 +1105,8 @@ let run () =
endian mode, and translate function name
*)
let addr_trans = translate_address context E_big_endian "TranslateAddress" in
+ if String.length(!raw_file) != 0 then
+ load_raw_file prog_mem (Nat_big_num.of_int !raw_at) (open_in_bin !raw_file);
reg := Reg.add "PC" (register_value_of_address startaddr_internal model_reg_d ) !reg;
(* entry point: unit -> unit fde *)
let name = Filename.basename !file in
diff --git a/src/lem_interp/run_with_elf_cheri.ml b/src/lem_interp/run_with_elf_cheri.ml
index 05d07902..1ec6ecbe 100644
--- a/src/lem_interp/run_with_elf_cheri.ml
+++ b/src/lem_interp/run_with_elf_cheri.ml
@@ -860,9 +860,11 @@ let break_point = ref false
let break_instr = ref 0
let max_cut_off = ref false
let max_instr = ref 0
+let raw_file = ref ""
+let raw_at = ref 0
let args = [
- ("--file", Arg.Set_string file, "filename binary code to load in memory");
+ ("--file", Arg.Set_string file, "filename of elf binary to load in memory");
("--quiet", Arg.Clear Run_interp_model.interact_print, "do not display per-instruction actions");
("--silent", Arg.Tuple [Arg.Clear Run_interp_model.error_print;
Arg.Clear Run_interp_model.interact_print;
@@ -872,6 +874,8 @@ let args = [
("--interactive", Arg.Clear eager_eval , "interactive execution");
("--breakpoint", Arg.Int (fun i -> break_point := true; break_instr:= i), "run to instruction number i, then run interactively");
("--max_instruction", Arg.Int (fun i -> max_cut_off := true; max_instr := i), "only run i instructions, then stop");
+ ("--raw", Arg.Set_string raw_file, "filename of raw file to load in memory");
+ ("--at", Arg.Set_int raw_at, "address to load raw file in memory");
]
let time_it action arg =
@@ -1162,6 +1166,17 @@ let rec fde_loop count context model mode track_dependencies addr_trans =
end
end
+let rec load_raw_file' mem addr chan =
+ let byte = input_byte chan in
+ (add_mem byte addr mem;
+ load_raw_file' mem (Nat_big_num.succ addr) chan)
+
+let rec load_raw_file mem addr chan =
+ try
+ load_raw_file' mem addr chan
+ with
+ | End_of_file -> ()
+
let run () =
Arg.parse args (fun _ -> raise (Arg.Bad "anonymous parameter")) "" ;
if !file = "" then begin
@@ -1183,6 +1198,8 @@ let run () =
endian mode, and translate function name
*)
let addr_trans = translate_address context E_big_endian "TranslateAddress" in
+ if String.length(!raw_file) != 0 then
+ load_raw_file prog_mem (Nat_big_num.of_int !raw_at) (open_in_bin !raw_file);
reg := Reg.add "PC" (register_value_of_address startaddr_internal model_reg_d ) !reg;
(* entry point: unit -> unit fde *)
let name = Filename.basename !file in