diff options
author | Robert Norton <rmn30@cam.ac.uk> | 2019-10-29 16:26:41 +0000 |
---|---|---|
committer | Robert Norton <rmn30@cam.ac.uk> | 2019-10-29 16:26:41 +0000 |
commit | 3e22b03a263b918337800b78d9e84920abb00dc7 (patch) | |
tree | 92487525e55495edc848be2ee28da55af047ad1a /c_emulator/riscv_sim.c | |
parent | 24fb6b4f43fb017c9855e5b9c9ccd241c09c5e86 (diff) | |
download | sail-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.c | 64 |
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; |