aboutsummaryrefslogtreecommitdiff
path: root/c_emulator/riscv_sim.c
diff options
context:
space:
mode:
authorRobert Norton <rmn30@cam.ac.uk>2019-10-29 16:26:41 +0000
committerRobert Norton <rmn30@cam.ac.uk>2019-10-29 16:26:41 +0000
commit3e22b03a263b918337800b78d9e84920abb00dc7 (patch)
tree92487525e55495edc848be2ee28da55af047ad1a /c_emulator/riscv_sim.c
parent24fb6b4f43fb017c9855e5b9c9ccd241c09c5e86 (diff)
downloadsail-riscv-3e22b03a263b918337800b78d9e84920abb00dc7.zip
sail-riscv-3e22b03a263b918337800b78d9e84920abb00dc7.tar.gz
sail-riscv-3e22b03a263b918337800b78d9e84920abb00dc7.tar.bz2
Attempt to fix RVFI for instruction fetch exceptions. Not sure what 'need_instr' was intended to do but does not seem to be what we want.
Diffstat (limited to 'c_emulator/riscv_sim.c')
-rw-r--r--c_emulator/riscv_sim.c64
1 files changed, 29 insertions, 35 deletions
diff --git a/c_emulator/riscv_sim.c b/c_emulator/riscv_sim.c
index f8f0820..2996011 100644
--- a/c_emulator/riscv_sim.c
+++ b/c_emulator/riscv_sim.c
@@ -687,35 +687,33 @@ void run_sail(void)
while (!zhtif_done && (insn_limit == 0 || total_insns < insn_limit)) {
#ifdef RVFI_DII
if (rvfi_dii) {
- if (need_instr) {
- mach_bits instr_bits;
- int res = read(rvfi_dii_sock, &instr_bits, sizeof(instr_bits));
- if (res == 0) {
- rvfi_dii = false;
- return;
- }
- if (res < sizeof(instr_bits)) {
- fprintf(stderr, "Reading RVFI DII command failed: insufficient input");
- exit(1);
- }
- if (res == -1) {
- fprintf(stderr, "Reading RVFI DII command failed: %s", strerror(errno));
- exit(1);
- }
- zrvfi_set_instr_packet(instr_bits);
- zrvfi_zzero_exec_packet(UNIT);
- mach_bits cmd = zrvfi_get_cmd(UNIT);
- switch (cmd) {
- case 0: /* EndOfTrace */
- zrvfi_halt_exec_packet(UNIT);
- rvfi_send_trace();
- return;
- case 1: /* Instruction */
- break;
- default:
- fprintf(stderr, "Unknown RVFI-DII command: %d\n", (int)cmd);
- exit(1);
- }
+ mach_bits instr_bits;
+ int res = read(rvfi_dii_sock, &instr_bits, sizeof(instr_bits));
+ if (res == 0) {
+ rvfi_dii = false;
+ return;
+ }
+ if (res < sizeof(instr_bits)) {
+ fprintf(stderr, "Reading RVFI DII command failed: insufficient input");
+ exit(1);
+ }
+ if (res == -1) {
+ fprintf(stderr, "Reading RVFI DII command failed: %s", strerror(errno));
+ exit(1);
+ }
+ zrvfi_set_instr_packet(instr_bits);
+ zrvfi_zzero_exec_packet(UNIT);
+ mach_bits cmd = zrvfi_get_cmd(UNIT);
+ switch (cmd) {
+ case 0: /* EndOfTrace */
+ zrvfi_halt_exec_packet(UNIT);
+ rvfi_send_trace();
+ return;
+ case 1: /* Instruction */
+ break;
+ default:
+ fprintf(stderr, "Unknown RVFI-DII command: %d\n", (int)cmd);
+ exit(1);
}
sail_int sail_step;
CREATE(sail_int)(&sail_step);
@@ -724,12 +722,8 @@ void run_sail(void)
if (have_exception) goto step_exception;
flush_logs();
KILL(sail_int)(&sail_step);
- if (stepped) {
- need_instr = true;
- rvfi_send_trace();
- } else
- need_instr = false;
- } else
+ rvfi_send_trace();
+ } else /* if (!rvfi_dii) */
#endif
{ /* run a Sail step */
sail_int sail_step;