> + if (env->priv_ver >= PRIV_VERSION_1_10_0) { > + if (get_field(env->satp, SATP_MODE) == VM_1_09_MBARE) { > + mode = PRV_M; > + } > + } else { > + if (get_field(env->mstatus, MSTATUS_VM) == VM_1_10_MBARE) { > + mode = PRV_M; > + } > + }
This mixes up VM_1_09_MBARE and VM_1_10_MBARE, but they evaluate to the same value anyway. And as Richard said just rely on the mmu_idx from cpu_mmu_index. I actually already did the change to remove it in a patch for a new riscv CSR I developed and can thus confirm it works fine. > + case CSR_SPTBR: This should use CSR_SATP. In fact even if you want to keep 1.9.1 support I would highly recommend to remove the CSR_SPTBR define and only use CSR_SATP in code, with sptbr limited to comments to avoid confusion.