diff --git a/riscv/decode_macros.h b/riscv/decode_macros.h index 807ad9887..b261bd366 100644 --- a/riscv/decode_macros.h +++ b/riscv/decode_macros.h @@ -193,10 +193,10 @@ static inline bool is_aligned(const unsigned val, const unsigned pos) #define require_envcfg(field) \ do { \ if (((STATE.prv != PRV_M) && (m##field == 0)) || \ - ((STATE.prv == PRV_U && !STATE.v) && (s##field == 0))) \ + (p->extension_enabled('S') && (STATE.prv == PRV_U && !STATE.v) && (s##field == 0))) \ throw trap_illegal_instruction(insn.bits()); \ - else if (STATE.v && ((h##field == 0) || \ - ((STATE.prv == PRV_U) && (s##field == 0)))) \ + else if (p->extension_enabled('H') && STATE.v && ((h##field == 0) || \ + (p->extension_enabled('S') && (STATE.prv == PRV_U) && (s##field == 0)))) \ throw trap_virtual_instruction(insn.bits()); \ } while (0);