diff options
| author | Prashanth Mundkur | 2018-06-22 09:05:23 -0700 |
|---|---|---|
| committer | Prashanth Mundkur | 2018-06-22 09:12:21 -0700 |
| commit | 96b61fb37ee67c9406d978db8d2f548a2a9208b9 (patch) | |
| tree | 10d011a1ed48871102dad8eee85db9e1adfe104b /src/elf_loader.ml | |
| parent | 6793762f3b6087074fb3ce2c523975d6c5cab1c7 (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.ml | 21 |
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 |
