aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBilal Sakhawat <63648044+bilalsakhawat-10xe@users.noreply.github.com>2022-01-20 02:09:13 +0500
committerGitHub <noreply@github.com>2022-01-19 21:09:13 +0000
commit5dd1ff612323bd4b3f2a21520bf24e0e9ae4e4ac (patch)
treea8d35fd997c82d5a7f74a20d5668ae9850c6f8c2
parent612958be77e80b237797c83da8ad7aa93a840335 (diff)
downloadsail-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.c13
-rw-r--r--ocaml_emulator/riscv_ocaml_sim.ml21
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 =