Skip to content

Commit

Permalink
target/riscv: prevent the fence.i from triggering the exception
Browse files Browse the repository at this point in the history
On platforms that do not support Zifencei, executing fence.i will
trigger an exception, this patch eliminates the impact of the
exception

Change-Id: I459cff096374064fdb6e18a9d95170510ae1f32e
Signed-off-by: Xiang W <[email protected]>
  • Loading branch information
wxjstz committed Aug 1, 2023
1 parent c07d925 commit 5879498
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/target/riscv/gdb_regs.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ enum gdb_regno {
GDB_REGNO_TDATA3 = CSR_TDATA3 + GDB_REGNO_CSR0,
GDB_REGNO_TINFO = CSR_TINFO + GDB_REGNO_CSR0,
GDB_REGNO_MISA = CSR_MISA + GDB_REGNO_CSR0,
GDB_REGNO_MTVEC = CSR_MTVEC + GDB_REGNO_CSR0,
GDB_REGNO_DPC = CSR_DPC + GDB_REGNO_CSR0,
GDB_REGNO_DCSR = CSR_DCSR + GDB_REGNO_CSR0,
GDB_REGNO_DSCRATCH0 = CSR_DSCRATCH0 + GDB_REGNO_CSR0,
Expand Down
19 changes: 19 additions & 0 deletions src/target/riscv/riscv-013.c
Original file line number Diff line number Diff line change
Expand Up @@ -2844,7 +2844,26 @@ static int execute_fence(struct target *target)
* here, but there's no ISA-defined way of doing that. */
struct riscv_program program;
riscv_program_init(&program, target);

/* s0 s1 used, need backup and restore*/
program.writes_xreg[GDB_REGNO_S0] = true;
program.writes_xreg[GDB_REGNO_S1] = true;

/* backup mtvec to s1 */
riscv_program_csrr(&program, S1, GDB_REGNO_MTVEC);

/* set mtvec after fence.i */
riscv_program_insert(&program, auipc(S0));
riscv_program_addi(&program, S0, S0, 16);
riscv_program_csrw(&program, S0, GDB_REGNO_MTVEC);

/* fence.i may cause exception, Because mtvec is set after fence.i,
* triggering an exception does not affect the execution flow */
riscv_program_fence_i(&program);

/* restore mtvec from s1 */
riscv_program_csrw(&program, S1, GDB_REGNO_MTVEC);

riscv_program_fence_rw_rw(&program);
int result = riscv_program_exec(&program, target);
if (result != ERROR_OK)
Expand Down

0 comments on commit 5879498

Please sign in to comment.