diff options
author | Bilal Sakhawat <63648044+bilalsakhawat-10xe@users.noreply.github.com> | 2022-01-20 02:09:13 +0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-19 21:09:13 +0000 |
commit | 5dd1ff612323bd4b3f2a21520bf24e0e9ae4e4ac (patch) | |
tree | a8d35fd997c82d5a7f74a20d5668ae9850c6f8c2 | |
parent | 612958be77e80b237797c83da8ad7aa93a840335 (diff) | |
download | sail-riscv-5dd1ff612323bd4b3f2a21520bf24e0e9ae4e4ac.zip sail-riscv-5dd1ff612323bd4b3f2a21520bf24e0e9ae4e4ac.tar.gz sail-riscv-5dd1ff612323bd4b3f2a21520bf24e0e9ae4e4ac.tar.bz2 |
Configurable word size for test signature file output (#136)
-rw-r--r-- | c_emulator/riscv_sim.c | 13 | ||||
-rw-r--r-- | ocaml_emulator/riscv_ocaml_sim.ml | 21 |
2 files changed, 24 insertions, 10 deletions
diff --git a/c_emulator/riscv_sim.c b/c_emulator/riscv_sim.c index a2d1bce..e908ebb 100644 --- a/c_emulator/riscv_sim.c +++ b/c_emulator/riscv_sim.c @@ -68,6 +68,7 @@ size_t spike_dtb_len = 0; char *sig_file = NULL; uint64_t mem_sig_start = 0; uint64_t mem_sig_end = 0; +int signature_granularity = 4; bool config_print_instr = true; bool config_print_reg = true; @@ -120,6 +121,7 @@ static struct option options[] = { {"show-times", required_argument, 0, 'p'}, {"report-arch", no_argument, 0, 'a'}, {"test-signature", required_argument, 0, 'T'}, + {"signature-granularity", required_argument, 0, 'g'}, #ifdef RVFI_DII {"rvfi-dii", required_argument, 0, 'r'}, #endif @@ -230,6 +232,7 @@ char *process_args(int argc, char **argv) "b:" "t:" "T:" + "g" "h" #ifdef RVFI_DII "r:" @@ -308,6 +311,10 @@ char *process_args(int argc, char **argv) sig_file = strdup(optarg); fprintf(stderr, "using %s for test-signature output.\n", sig_file); break; + case 'g': + signature_granularity = atoi(optarg); + fprintf(stderr, "setting signature-granularity to %d bytes\n", signature_granularity); + break; case 'h': print_usage(argv[0], 0); break; @@ -578,10 +585,10 @@ void write_signature(const char *file) fprintf(stderr, "Cannot open file '%s': %s\n", file, strerror(errno)); return; } - /* write out words in signature area */ - for (uint64_t addr = mem_sig_start; addr < mem_sig_end; addr += 4) { + /* write out words depending on signature granularity in signature area */ + for (uint64_t addr = mem_sig_start; addr < mem_sig_end; addr += signature_granularity) { /* most-significant byte first */ - for (int i = 3; i >= 0; i--) { + for (int i = signature_granularity - 1; i >= 0; i--) { uint8_t byte = (uint8_t) read_mem(addr+i); fprintf(f, "%02x", byte); } diff --git a/ocaml_emulator/riscv_ocaml_sim.ml b/ocaml_emulator/riscv_ocaml_sim.ml index fb06c40..6e612ad 100644 --- a/ocaml_emulator/riscv_ocaml_sim.ml +++ b/ocaml_emulator/riscv_ocaml_sim.ml @@ -11,6 +11,7 @@ let opt_file_arguments = ref ([] : string list) let opt_dump_dts = ref false let opt_dump_dtb = ref false let opt_signature_file = ref (None : string option) +let signature_granularity_ref = ref 4 let opt_isa = ref (None : string option) let report_arch () = @@ -25,6 +26,9 @@ let set_signature_file s = P.config_print_mem_access := false; P.config_print_platform := false +let set_signature_granularity sg = + signature_granularity_ref := sg + let options = Arg.align ([("-dump-dts", Arg.Set opt_dump_dts, " dump the platform device-tree source to stdout"); @@ -61,6 +65,9 @@ let options = Arg.align ([("-dump-dts", ("-test-signature", Arg.String set_signature_file, " file for signature output (requires ELF signature symbols)"); + ("-signature-granularity", + Arg.Int set_signature_granularity, + " test signature granularity (in bytes)"); ("-isa", Arg.String (fun s -> opt_isa := Some s), " requested isa"); @@ -109,13 +116,13 @@ let check_elf () = let write_bytes fl bytes = let i = ref 0 in while !i < Bytes.length bytes do - let s = Printf.sprintf "%02x%02x%02x%02x\n" - (int_of_char (Bytes.get bytes (!i+3))) - (int_of_char (Bytes.get bytes (!i+2))) - (int_of_char (Bytes.get bytes (!i+1))) - (int_of_char (Bytes.get bytes (!i+0))) in - output_string fl s; - i := !i + 4 + for j = !signature_granularity_ref - 1 downto 0 do + let s = Printf.sprintf "%02x" + (int_of_char (Bytes.get bytes (!i + j))) in + output_string fl s; + done; + output_string fl "\n"; + i := !i + !signature_granularity_ref; done let write_signature f sig_start sig_end = |