aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGleb Gagarin <gleb@sifive.com>2018-02-08 13:02:24 -0800
committerGleb Gagarin <gleb@sifive.com>2018-02-08 13:02:24 -0800
commit0e2fc08c3be8c14f2a883563f50e5a5bfffbc65c (patch)
tree9ab65856fa6f86cad94124e8db88bc96ddc771c4
parentab5a98663ea50439ab4a6e40adfe0899cf95828f (diff)
downloadriscv-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.c26
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;