diff options
author | Gleb Gagarin <gleb@sifive.com> | 2018-02-08 13:02:24 -0800 |
---|---|---|
committer | Gleb Gagarin <gleb@sifive.com> | 2018-02-08 13:02:24 -0800 |
commit | 0e2fc08c3be8c14f2a883563f50e5a5bfffbc65c (patch) | |
tree | 9ab65856fa6f86cad94124e8db88bc96ddc771c4 | |
parent | ab5a98663ea50439ab4a6e40adfe0899cf95828f (diff) | |
download | riscv-openocd-fence_i_fix_for_release.zip riscv-openocd-fence_i_fix_for_release.tar.gz riscv-openocd-fence_i_fix_for_release.tar.bz2 |
Applied fence.i fix on memory write to v20171231 releasefence_i_fix_for_release
-rw-r--r-- | src/target/riscv/riscv-013.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c index 6251765..c2d888f 100644 --- a/src/target/riscv/riscv-013.c +++ b/src/target/riscv/riscv-013.c @@ -1408,6 +1408,30 @@ static int execute_fence(struct target *target) return result; } +static int execute_fence_i(struct target *target) +{ + struct riscv_program program; + riscv_program_init(&program, target); + riscv_program_fence_i(&program); + int result = riscv_program_exec(&program, target); + if (result != ERROR_OK) + LOG_ERROR("Unable to execute fence.i"); + return result; +} + +static int execute_fences(struct target *target) +{ + if (execute_fence(target) != ERROR_OK) + { + return ERROR_FAIL; + } + if (execute_fence_i(target) != ERROR_OK) + { + return ERROR_FAIL; + } + return ERROR_OK; +} + /** * Read the requested memory, taking care to execute every read exactly once, * even if cmderr=busy is encountered. @@ -1822,7 +1846,7 @@ error: if (register_write_direct(target, GDB_REGNO_S0, s0) != ERROR_OK) return ERROR_FAIL; - if (execute_fence(target) != ERROR_OK) + if (execute_fences(target) != ERROR_OK) return ERROR_FAIL; return result; |