diff options
| author | Robert Norton | 2018-05-25 17:26:20 +0100 |
|---|---|---|
| committer | Robert Norton | 2018-05-25 17:41:11 +0100 |
| commit | 7f53f17643244cd0cdacf1b9df3555c3154497fe (patch) | |
| tree | 1e3e1ce9e017786f9da6972e42059fdb0e075a0c /lib | |
| parent | d06ab253ae62b24030fb6dd9ee949191710e8c6f (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.ml | 40 |
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 *) |
