aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2023-02-14 10:51:13 -0800
committerGitHub <noreply@github.com>2023-02-14 10:51:13 -0800
commita57fc5e78ce5aa0d0e11429866eef6555c78e52e (patch)
treea906127cd671a5ad6464b163f83f6919bf191281
parent2b4826cd322628d3ee7425a0cb86a7c878b5525a (diff)
parent2c96555c732db8b73ce02bb1a235bb0ae0f99f5d (diff)
downloadriscv-openocd-a57fc5e78ce5aa0d0e11429866eef6555c78e52e.zip
riscv-openocd-a57fc5e78ce5aa0d0e11429866eef6555c78e52e.tar.gz
riscv-openocd-a57fc5e78ce5aa0d0e11429866eef6555c78e52e.tar.bz2
Merge pull request #794 from riscv/fix-fence-instruction
Fix opcode for the "fence" instruction
-rw-r--r--src/target/riscv/opcodes.h7
-rw-r--r--src/target/riscv/program.c4
-rw-r--r--src/target/riscv/program.h2
-rw-r--r--src/target/riscv/riscv-013.c2
4 files changed, 8 insertions, 7 deletions
diff --git a/src/target/riscv/opcodes.h b/src/target/riscv/opcodes.h
index 992196f..59c3413 100644
--- a/src/target/riscv/opcodes.h
+++ b/src/target/riscv/opcodes.h
@@ -294,10 +294,11 @@ static uint32_t srli(unsigned int dest, unsigned int src, uint8_t shamt)
return inst_rs2(shamt) | inst_rs1(src) | inst_rd(dest) | MATCH_SRLI;
}
-static uint32_t fence(void) __attribute__((unused));
-static uint32_t fence(void)
+static uint32_t fence_rw_rw(void) __attribute__((unused));
+static uint32_t fence_rw_rw(void)
{
- return MATCH_FENCE;
+ /* fence rw,rw */
+ return MATCH_FENCE | 0x3300000;
}
static uint32_t auipc(unsigned int dest) __attribute__((unused));
diff --git a/src/target/riscv/program.c b/src/target/riscv/program.c
index 8e2ce5d..f14923a 100644
--- a/src/target/riscv/program.c
+++ b/src/target/riscv/program.c
@@ -151,9 +151,9 @@ int riscv_program_fence_i(struct riscv_program *p)
return riscv_program_insert(p, fence_i());
}
-int riscv_program_fence(struct riscv_program *p)
+int riscv_program_fence_rw_rw(struct riscv_program *p)
{
- return riscv_program_insert(p, fence());
+ return riscv_program_insert(p, fence_rw_rw());
}
int riscv_program_ebreak(struct riscv_program *p)
diff --git a/src/target/riscv/program.h b/src/target/riscv/program.h
index 62a04f0..6916500 100644
--- a/src/target/riscv/program.h
+++ b/src/target/riscv/program.h
@@ -63,7 +63,7 @@ int riscv_program_csrr(struct riscv_program *p, enum gdb_regno d, enum gdb_regno
int riscv_program_csrw(struct riscv_program *p, enum gdb_regno s, enum gdb_regno csr);
int riscv_program_fence_i(struct riscv_program *p);
-int riscv_program_fence(struct riscv_program *p);
+int riscv_program_fence_rw_rw(struct riscv_program *p);
int riscv_program_ebreak(struct riscv_program *p);
int riscv_program_addi(struct riscv_program *p, enum gdb_regno d, enum gdb_regno s, int16_t i);
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c
index 71cf287..f12d185 100644
--- a/src/target/riscv/riscv-013.c
+++ b/src/target/riscv/riscv-013.c
@@ -2548,7 +2548,7 @@ static int execute_fence(struct target *target)
struct riscv_program program;
riscv_program_init(&program, target);
riscv_program_fence_i(&program);
- riscv_program_fence(&program);
+ riscv_program_fence_rw_rw(&program);
int result = riscv_program_exec(&program, target);
if (result != ERROR_OK)
LOG_TARGET_DEBUG(target, "Unable to execute pre-fence");