diff options
Diffstat (limited to 'riscv/decode.h')
-rw-r--r-- | riscv/decode.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/riscv/decode.h b/riscv/decode.h index a756607..f8ac020 100644 --- a/riscv/decode.h +++ b/riscv/decode.h @@ -292,8 +292,9 @@ inline freg_t f128_negate(freg_t a) if (!STATE.serialized) return PC_SERIALIZE_BEFORE; \ STATE.serialized = false; \ unsigned csr_priv = get_field((which), 0x300); \ + bool mode_unsupported = csr_priv == PRV_S && !P.supports_extension('S'); \ unsigned csr_read_only = get_field((which), 0xC00) == 3; \ - if (((write) && csr_read_only) || STATE.prv < csr_priv) \ + if (((write) && csr_read_only) || STATE.prv < csr_priv || mode_unsupported) \ throw trap_illegal_instruction(0); \ (which); }) |