Convert riscv_csr_[read|write]() into target_ulong angnostic CSR access
functions that can be safely used from outside of target/ without
knowledge of the target register size. Replace the 4 existing CSR
accesses in hw/ and linux-user/.
Signed-off-by: Anton Johansson <anjo@rev.ng>
---
target/riscv/cpu.h | 7 ++++++-
target/riscv/csr.h | 13 -------------
hw/riscv/riscv_hart.c | 7 +++----
linux-user/riscv/signal.c | 5 +++--
target/riscv/csr.c | 17 +++++++++++++++++
5 files changed, 29 insertions(+), 20 deletions(-)
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index a954605e83..12b6cafbf0 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -849,7 +849,12 @@ RISCVPmPmm riscv_pm_get_pmm(CPURISCVState *env);
RISCVPmPmm riscv_pm_get_virt_pmm(CPURISCVState *env);
uint32_t riscv_pm_get_pmlen(RISCVPmPmm pmm);
-#include "csr.h"
+/*
+ * Externally facing CSR access functions, asserts if access fails.
+ */
+
+int riscv_csr_write_i64(CPURISCVState *env, int csrno, uint64_t val);
+int riscv_csr_read_i64(CPURISCVState *env, int csrn, uint64_t *res);
/*
* The event id are encoded based on the encoding specified in the
diff --git a/target/riscv/csr.h b/target/riscv/csr.h
index fab53992bb..552e6c5de5 100644
--- a/target/riscv/csr.h
+++ b/target/riscv/csr.h
@@ -23,19 +23,6 @@ RISCVException riscv_csrrw_debug(CPURISCVState *env, int csrno,
target_ulong new_value,
target_ulong write_mask);
-static inline void riscv_csr_write(CPURISCVState *env, int csrno,
- target_ulong val)
-{
- riscv_csrrw(env, csrno, NULL, val, MAKE_64BIT_MASK(0, TARGET_LONG_BITS), 0);
-}
-
-static inline target_ulong riscv_csr_read(CPURISCVState *env, int csrno)
-{
- target_ulong val = 0;
- riscv_csrrw(env, csrno, &val, 0, 0, 0);
- return val;
-}
-
typedef RISCVException (*riscv_csr_predicate_fn)(CPURISCVState *env,
int csrno);
typedef RISCVException (*riscv_csr_read_fn)(CPURISCVState *env, int csrno,
diff --git a/hw/riscv/riscv_hart.c b/hw/riscv/riscv_hart.c
index 7f2676008c..c7e98a4308 100644
--- a/hw/riscv/riscv_hart.c
+++ b/hw/riscv/riscv_hart.c
@@ -67,12 +67,11 @@ static void csr_call(char *cmd, uint64_t cpu_num, int csrno, uint64_t *val)
RISCVCPU *cpu = RISCV_CPU(cpu_by_arch_id(cpu_num));
CPURISCVState *env = &cpu->env;
- int ret = RISCV_EXCP_NONE;
+ RISCVException ret = RISCV_EXCP_NONE;
if (strcmp(cmd, "get_csr") == 0) {
- ret = riscv_csrr(env, csrno, (target_ulong *)val);
+ ret = riscv_csr_read_i64(env, csrno, val);
} else if (strcmp(cmd, "set_csr") == 0) {
- ret = riscv_csrrw(env, csrno, NULL, *(target_ulong *)val,
- MAKE_64BIT_MASK(0, TARGET_LONG_BITS), 0);
+ ret = riscv_csr_write_i64(env, csrno, *val);
}
g_assert(ret == RISCV_EXCP_NONE);
diff --git a/linux-user/riscv/signal.c b/linux-user/riscv/signal.c
index 358fa1d82d..9d5ba300e4 100644
--- a/linux-user/riscv/signal.c
+++ b/linux-user/riscv/signal.c
@@ -90,7 +90,8 @@ static void setup_sigcontext(struct target_sigcontext *sc, CPURISCVState *env)
__put_user(env->fpr[i], &sc->fpr[i]);
}
- uint32_t fcsr = riscv_csr_read(env, CSR_FCSR);
+ uint64_t fcsr;
+ riscv_csr_read_i64(env, CSR_FCSR, &fcsr);
__put_user(fcsr, &sc->fcsr);
}
@@ -159,7 +160,7 @@ static void restore_sigcontext(CPURISCVState *env, struct target_sigcontext *sc)
uint32_t fcsr;
__get_user(fcsr, &sc->fcsr);
- riscv_csr_write(env, CSR_FCSR, fcsr);
+ riscv_csr_write_i64(env, CSR_FCSR, fcsr);
}
static void restore_ucontext(CPURISCVState *env, struct target_ucontext *uc)
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
index f079a89793..846052a6ed 100644
--- a/target/riscv/csr.c
+++ b/target/riscv/csr.c
@@ -5656,6 +5656,23 @@ RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
return riscv_csrrw_do64(env, csrno, ret_value, new_value, write_mask, ra);
}
+int riscv_csr_write_i64(CPURISCVState *env, int csrno, uint64_t val)
+{
+ RISCVException ret;
+ ret = riscv_csrrw(env, csrno, NULL, val,
+ MAKE_64BIT_MASK(0, TARGET_LONG_BITS), 0);
+ return ret;
+}
+
+int riscv_csr_read_i64(CPURISCVState *env, int csrno, uint64_t *res)
+{
+ RISCVException ret;
+ target_ulong val = 0;
+ ret = riscv_csrr(env, csrno, &val);
+ *res = val;
+ return ret;
+}
+
static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
Int128 *ret_value,
Int128 new_value,
--
2.51.0