summaryrefslogtreecommitdiff
path: root/src/elf_loader.ml
diff options
context:
space:
mode:
authorPrashanth Mundkur2018-06-22 09:05:23 -0700
committerPrashanth Mundkur2018-06-22 09:12:21 -0700
commit96b61fb37ee67c9406d978db8d2f548a2a9208b9 (patch)
tree10d011a1ed48871102dad8eee85db9e1adfe104b /src/elf_loader.ml
parent6793762f3b6087074fb3ce2c523975d6c5cab1c7 (diff)
Fix bug in elf_loader: zero memory when segment memsz exceeds size.
Diffstat (limited to 'src/elf_loader.ml')
-rw-r--r--src/elf_loader.ml21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/elf_loader.ml b/src/elf_loader.ml
index d2a0e9b5..7a0bf7c5 100644
--- a/src/elf_loader.ml
+++ b/src/elf_loader.ml
@@ -108,6 +108,14 @@ let read name =
let write_sail_lib paddr i byte =
Sail_lib.wram (Big_int.add paddr (Big_int.of_int i)) byte
+let write_mem_zeros start len =
+ (* write in order for mem tracing logs *)
+ let i = ref Big_int.zero in
+ while (Big_int.less !i len) do
+ Sail_lib.wram (Big_int.add start !i) 0;
+ i := Big_int.succ !i
+ done
+
let write_file chan paddr i byte =
output_string chan (Big_int.to_string (Big_int.add paddr (Big_int.of_int i)) ^ "\n");
output_string chan (string_of_int byte ^ "\n")
@@ -118,12 +126,17 @@ let load_segment ?writer:(writer=write_sail_lib) seg =
let paddr = seg.elf64_segment_paddr in
let base = seg.elf64_segment_base in
let offset = seg.elf64_segment_offset in
+ let size = seg.elf64_segment_size in
+ let memsz = seg.elf64_segment_memsz in
prerr_endline "\nLoading Segment";
- prerr_endline ("Segment offset: " ^ Big_int.to_string offset);
- prerr_endline ("Segment base address: " ^ Big_int.to_string base);
- prerr_endline ("Segment physical address: " ^ Big_int.to_string paddr);
+ prerr_endline ("Segment offset: " ^ (Printf.sprintf "%Lx" (Big_int.to_int64 offset)));
+ prerr_endline ("Segment base address: " ^ (Printf.sprintf "%Lx" (Big_int.to_int64 base)));
+ prerr_endline ("Segment physical address: " ^ (Printf.sprintf "%Lx" (Big_int.to_int64 paddr)));
+ prerr_endline ("Segment size: " ^ (Printf.sprintf "%Lx" (Big_int.to_int64 size)));
+ prerr_endline ("Segment memsz: " ^ (Printf.sprintf "%Lx" (Big_int.to_int64 memsz)));
print_segment seg;
- List.iteri (writer paddr) (List.rev_map int_of_char (List.rev (Byte_sequence.char_list_of_byte_sequence bs)))
+ List.iteri (writer paddr) (List.rev_map int_of_char (List.rev (Byte_sequence.char_list_of_byte_sequence bs)));
+ write_mem_zeros (Big_int.add paddr size) (Big_int.sub memsz size)
let load_elf ?writer:(writer=write_sail_lib) name =
let segments, e_entry, symbol_map = read name in