@@ -234,10 +234,69 @@ const char *riscv_cpu_get_trap_name(target_ulong cause, bool async)
}
}
-static void set_misa(CPURISCVState *env, RISCVMXL mxl, uint32_t ext)
+static uint32_t riscv_get_misa_ext_with_cpucfg(RISCVCPUConfig *cfg)
{
- RISCVCPU *cpu;
+ uint32_t ext = 0;
+ if (cfg->ext_i) {
+ ext |= RVI;
+ }
+ if (cfg->ext_e) {
+ ext |= RVE;
+ }
+ if (cfg->ext_m) {
+ ext |= RVM;
+ }
+ if (cfg->ext_a) {
+ ext |= RVA;
+ }
+ if (cfg->ext_f) {
+ ext |= RVF;
+ }
+ if (cfg->ext_d) {
+ ext |= RVD;
+ }
+ if (cfg->ext_c) {
+ ext |= RVC;
+ }
+ if (cfg->ext_s) {
+ ext |= RVS;
+ }
+ if (cfg->ext_u) {
+ ext |= RVU;
+ }
+ if (cfg->ext_h) {
+ ext |= RVH;
+ }
+ if (cfg->ext_v) {
+ ext |= RVV;
+ }
+ if (cfg->ext_j) {
+ ext |= RVJ;
+ }
+
+ return ext;
+}
+
+static void riscv_set_cpucfg_with_misa(RISCVCPUConfig *cfg,
+ uint32_t misa_ext)
+{
+ cfg->ext_i = misa_ext & RVI;
+ cfg->ext_e = misa_ext & RVE;
+ cfg->ext_m = misa_ext & RVM;
+ cfg->ext_a = misa_ext & RVA;
+ cfg->ext_f = misa_ext & RVF;
+ cfg->ext_d = misa_ext & RVD;
+ cfg->ext_v = misa_ext & RVV;
+ cfg->ext_c = misa_ext & RVC;
+ cfg->ext_s = misa_ext & RVS;
+ cfg->ext_u = misa_ext & RVU;
+ cfg->ext_h = misa_ext & RVH;
+ cfg->ext_j = misa_ext & RVJ;
+}
+
+static void set_misa(CPURISCVState *env, RISCVMXL mxl, uint32_t ext)
+{
env->misa_mxl_max = env->misa_mxl = mxl;
env->misa_ext_mask = env->misa_ext = ext;
@@ -251,25 +310,7 @@ static void set_misa(CPURISCVState *env, RISCVMXL mxl, uint32_t ext)
return;
}
- /*
- * We can't use riscv_cpu_cfg() in this case because it is
- * a read-only inline and we're going to change the values
- * of cpu->cfg.
- */
- cpu = env_archcpu(env);
-
- cpu->cfg.ext_i = ext & RVI;
- cpu->cfg.ext_e = ext & RVE;
- cpu->cfg.ext_m = ext & RVM;
- cpu->cfg.ext_a = ext & RVA;
- cpu->cfg.ext_f = ext & RVF;
- cpu->cfg.ext_d = ext & RVD;
- cpu->cfg.ext_v = ext & RVV;
- cpu->cfg.ext_c = ext & RVC;
- cpu->cfg.ext_s = ext & RVS;
- cpu->cfg.ext_u = ext & RVU;
- cpu->cfg.ext_h = ext & RVH;
- cpu->cfg.ext_j = ext & RVJ;
+ riscv_set_cpucfg_with_misa(&env_archcpu(env)->cfg, ext);
}
#ifndef CONFIG_USER_ONLY
@@ -1142,42 +1183,7 @@ static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
cpu->cfg.ext_zksh = true;
}
- if (cpu->cfg.ext_i) {
- ext |= RVI;
- }
- if (cpu->cfg.ext_e) {
- ext |= RVE;
- }
- if (cpu->cfg.ext_m) {
- ext |= RVM;
- }
- if (cpu->cfg.ext_a) {
- ext |= RVA;
- }
- if (cpu->cfg.ext_f) {
- ext |= RVF;
- }
- if (cpu->cfg.ext_d) {
- ext |= RVD;
- }
- if (cpu->cfg.ext_c) {
- ext |= RVC;
- }
- if (cpu->cfg.ext_s) {
- ext |= RVS;
- }
- if (cpu->cfg.ext_u) {
- ext |= RVU;
- }
- if (cpu->cfg.ext_h) {
- ext |= RVH;
- }
- if (cpu->cfg.ext_v) {
- ext |= RVV;
- }
- if (cpu->cfg.ext_j) {
- ext |= RVJ;
- }
+ ext = riscv_get_misa_ext_with_cpucfg(&cpu->cfg);
env->misa_ext_mask = env->misa_ext = ext;
}
@@ -66,7 +66,8 @@
#define RV(x) ((target_ulong)1 << (x - 'A'))
/*
- * Consider updating set_misa() when adding new
+ * Consider updating riscv_get_misa_ext_with_cpucfg()
+ * and riscv_set_cpucfg_with_misa() when adding new
* MISA bits here.
*/
#define RVI RV('I')
The extremely tedious code that sets cpu->cfg based on misa_ext, and vice-versa, is scattered around riscv_cpu_validate_set_extensions() and set_misa(). Introduce helpers to do this work, cleaning up the logic of both functions a bit. While we're at it, add a note in cpu.h informing that any future change in MISA RV* bits should also be reflected in the helpers as well. Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> --- target/riscv/cpu.c | 120 ++++++++++++++++++++++++--------------------- target/riscv/cpu.h | 3 +- 2 files changed, 65 insertions(+), 58 deletions(-)