return val;
}
+static uint64_t riscv_write_uxl(CPURISCVState *env, uint64_t val,
+ uint64_t field)
+{
+ RISCVMXL xl = riscv_cpu_mxl(env);
+ uint64_t uxl = get_field(val, field);
+
+ if (uxl == MXL_RV128) {
+ uxl = xl == MXL_RV128 ? MXL_RV64 : xl;
+ val = set_field(val, field, uxl);
+ }
+
+ return val;
+}
+
static RISCVException write_mstatus(CPURISCVState *env, int csrno,
target_ulong val, uintptr_t ra)
{
if (xl != MXL_RV32 || env->debugger) {
if ((val & MSTATUS64_UXL) != 0) {
- uint64_t uxl = val & MSTATUS64_UXL >> 32;
mask |= MSTATUS64_UXL;
-
- /*
- * uxl = 3 is reserved so write the current xl instead.
- * In case xl = MXL_RV128 (3) write MXL_RV64.
- */
- if (uxl == 3) {
- uxl = xl == MXL_RV128 ? MXL_RV64 : xl;
- val = deposit64(val, 32, 2, uxl);
- }
+ val = riscv_write_uxl(env, val, MSTATUS64_UXL);
}
}
uint64_t mask = (target_ulong)-1;
if ((val & VSSTATUS64_UXL) == 0) {
mask &= ~VSSTATUS64_UXL;
+ } else {
+ val = riscv_write_uxl(env, val, VSSTATUS64_UXL);
}
if ((env->henvcfg & HENVCFG_DTE)) {
if ((val & SSTATUS_SDT) != 0) {