summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRobert Norton2018-05-25 17:26:20 +0100
committerRobert Norton2018-05-25 17:41:11 +0100
commit7f53f17643244cd0cdacf1b9df3555c3154497fe (patch)
tree1e3e1ce9e017786f9da6972e42059fdb0e075a0c /lib
parentd06ab253ae62b24030fb6dd9ee949191710e8c6f (diff)
allow loading multiple raw files in ocaml main backend to allow kernel and dtb to be mapped.
Diffstat (limited to 'lib')
-rw-r--r--lib/main.ml40
1 files changed, 21 insertions, 19 deletions
diff --git a/lib/main.ml b/lib/main.ml
index 4dcec302..e9dcb4e0 100644
--- a/lib/main.ml
+++ b/lib/main.ml
@@ -52,18 +52,15 @@
open Elf_loader;;
let opt_file_arguments = ref ([] : string list)
-let opt_raw_fname = ref ""
-let opt_raw_addr = ref Nat_big_num.zero
+let opt_raw_files = ref ([] : (string * Nat_big_num.num) list)
let options = Arg.align [
( "-raw",
Arg.String (fun s ->
let l = Util.split_on_char '@' s in
- match l with
- | [fname;addr] -> begin
- opt_raw_fname := fname;
- opt_raw_addr := Nat_big_num.of_string addr;
- end
- | _ -> raise (Arg.Bad (s ^ " not of form <filename>@:<addr>"))),
+ let (file, addr) = match l with
+ | [fname;addr] -> (fname, Nat_big_num.of_string addr)
+ | _ -> raise (Arg.Bad (s ^ " not of form <filename>@<addr>")) in
+ opt_raw_files := (file, addr) :: !opt_raw_files),
"<file@0xADDR> load a raw binary in memory at given address.")]
let usage_msg = "Sail OCaml RTS options:"
@@ -71,6 +68,21 @@ let usage_msg = "Sail OCaml RTS options:"
let () =
Arg.parse options (fun s -> opt_file_arguments := !opt_file_arguments @ [s]) usage_msg
+let rec load_raw_files = function
+ | (file, addr) :: files -> begin
+ let ic = open_in_bin file in
+ let addr' = ref addr in
+ try
+ while true do
+ let b = input_byte ic in
+ Sail_lib.wram !addr' b;
+ addr' := Nat_big_num.succ !addr';
+ done
+ with End_of_file -> ();
+ load_raw_files files
+ end
+ | [] -> ()
+
let () =
Random.self_init ();
begin
@@ -78,15 +90,5 @@ let () =
| f :: _ -> load_elf f
| _ -> ()
end;
- if !opt_raw_fname <> "" then
- begin
- let ic = open_in_bin !opt_raw_fname in
- try
- while true do
- let b = input_byte ic in
- Sail_lib.wram !opt_raw_addr b;
- opt_raw_addr := Nat_big_num.succ !opt_raw_addr;
- done
- with End_of_file -> ();
- end;
+ load_raw_files !opt_raw_files;
(* ocaml_backend.ml will append from here *)