diff options
| author | Andrew Waterman <andrew@sifive.com> | 2026-02-04 14:42:26 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-02-04 14:42:26 -0800 |
| commit | eb6586e3dea4a622bcdd4d518b25f8202b90eb40 (patch) | |
| tree | ddd70724a5a491f10fbfb39b55c976f739e2bed6 | |
| parent | 98ccf030bb02a029944cd938d5bcb73275350df4 (diff) | |
| parent | aea74cb69437c1bb2f766e671b0d1b197aa51a6b (diff) | |
| download | spike-master.zip spike-master.tar.gz spike-master.tar.bz2 | |
Raise correct trap in U-mode on indirect CSRs when !mstateen.csrind
| -rw-r--r-- | riscv/csrs.cc | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/riscv/csrs.cc b/riscv/csrs.cc index 6424e03..794bdb5 100644 --- a/riscv/csrs.cc +++ b/riscv/csrs.cc @@ -1852,10 +1852,6 @@ sscsrind_reg_csr_t::sscsrind_reg_csr_t(processor_t* const proc, const reg_t addr } void sscsrind_reg_csr_t::verify_permissions(insn_t insn, bool write) const { - if (state->v && state->prv == PRV_U) { - throw trap_virtual_instruction(insn.bits()); - } - if (proc->extension_enabled(EXT_SMSTATEEN)) { if ((state->prv < PRV_M) && !(state->mstateen[0]->read() & MSTATEEN0_CSRIND)) throw trap_illegal_instruction(insn.bits()); @@ -1864,6 +1860,10 @@ void sscsrind_reg_csr_t::verify_permissions(insn_t insn, bool write) const { throw trap_virtual_instruction(insn.bits()); } + if (state->v && state->prv == PRV_U) { + throw trap_virtual_instruction(insn.bits()); + } + // Don't call base verify_permission for VS registers remapped to S-mode if (insn.csr() == address) csr_t::verify_permissions(insn, write); |
