On 8/27/24 01:29, Deepak Gupta wrote:
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 8e1f05e5b1..083d405516 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1022,6 +1022,11 @@ static void riscv_cpu_reset_hold(Object *obj, ResetType 
type)
      env->load_res = -1;
      set_default_nan_mode(1, &env->fp_status);
+#ifdef CONFIG_USER_ONLY
+    /* qemu-user for riscv, fcfi is off by default */
+    env->ufcfien = false;
+#endif
...
@@ -226,6 +226,7 @@ struct CPUArchState {
      bool      elp;
  #ifdef CONFIG_USER_ONLY
      uint32_t elf_flags;
+    bool ufcfien;
  #endif

Thinking about this more, I think adding separate controls for user-only is a bad precedent to set. You said you are adding these because senvcfg/menvcfg are ifdefed: well, that should be the thing that we fix.

The only real user of *envcfg that I see so far is check_zicbo_envcfg, which does not use the same switch statement as this:

+    switch (env->priv) {
+    case PRV_U:
+        if (riscv_has_ext(env, RVS)) {
+            return env->senvcfg & MENVCFG_LPE;
+        }
+        return env->menvcfg & MENVCFG_LPE;
+    case PRV_S:
+        if (env->virt_enabled) {
+            return env->henvcfg & HENVCFG_LPE;
+        }
+        return env->menvcfg & MENVCFG_LPE;
+    case PRV_M:
+        return env->mseccfg & MSECCFG_MLPE;
+    default:
+        g_assert_not_reached();
+    }

I think your function should look more like check_zicbo_envcfg: (1) PRV_U may be either U or VU, and different tests apply; (2) M-mode disable means that no lower level may be enabled.

It would be nice if you could generalize check_zicbo_envcfg to apply to your new use as well. Perhaps some tri-state function to say "enabled", "disabled", "virtual disabled".


r~

Reply via email to