aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2017-10-24 12:15:25 -0700
committerTim Newsome <tim@sifive.com>2017-10-24 12:15:25 -0700
commitdbecbfee997bf7d5aa2daef17f0ef7f30ebdaa6b (patch)
tree317808b4fa6803138d9be0ef40f202bf39938c66
parent59a03402610bb92c1298586fcef212c17c5d0644 (diff)
downloadriscv-openocd-dbecbfee997bf7d5aa2daef17f0ef7f30ebdaa6b.zip
riscv-openocd-dbecbfee997bf7d5aa2daef17f0ef7f30ebdaa6b.tar.gz
riscv-openocd-dbecbfee997bf7d5aa2daef17f0ef7f30ebdaa6b.tar.bz2
Add a fence after memory writes.
Change-Id: I5137479b685f735aa573cec5d40170016c40f597
-rw-r--r--src/target/riscv/riscv-013.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c
index e9c5458..f47428a 100644
--- a/src/target/riscv/riscv-013.c
+++ b/src/target/riscv/riscv-013.c
@@ -1256,6 +1256,16 @@ static void write_to_buf(uint8_t *buffer, uint64_t value, unsigned size)
}
}
+static int execute_fence(struct target *target) {
+ struct riscv_program program;
+ riscv_program_init(&program, target);
+ riscv_program_fence(&program);
+ int result = riscv_program_exec(&program, target);
+ if (result != ERROR_OK)
+ LOG_ERROR("Unable to execute fence");
+ return result;
+}
+
/**
* Read the requested memory, taking care to execute every read exactly once,
* even if cmderr=busy is encountered.
@@ -1279,16 +1289,12 @@ static int read_memory(struct target *target, target_addr_t address,
if (register_read_direct(target, &s1, GDB_REGNO_S1) != ERROR_OK)
return ERROR_FAIL;
+ if (execute_fence(target) != ERROR_OK)
+ return ERROR_FAIL;
+
// Write the program (load, increment)
struct riscv_program program;
riscv_program_init(&program, target);
-
- riscv_program_fence(&program);
- if (riscv_program_exec(&program, target) != ERROR_OK)
- LOG_ERROR("Unable to execute fence");
-
- // New program.
- riscv_program_init(&program, target);
switch (size) {
case 1:
riscv_program_lbr(&program, GDB_REGNO_S1, GDB_REGNO_S0, 0);
@@ -1649,6 +1655,9 @@ static int write_memory(struct target *target, target_addr_t address,
if (register_write_direct(target, GDB_REGNO_S0, s0) != ERROR_OK)
return ERROR_FAIL;
+ if (execute_fence(target) != ERROR_OK)
+ return ERROR_FAIL;
+
return ERROR_OK;
}