Skip to content

Commit 5c2dcf3

Browse files
committed
Fix envcfg check when S/H-mode is not available
1 parent 58da6a2 commit 5c2dcf3

File tree

2 files changed

+4
-3
lines changed

2 files changed

+4
-3
lines changed

riscv/csrs.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1846,6 +1846,7 @@ ssp_csr_t::ssp_csr_t(processor_t* const proc, const reg_t addr, const reg_t mask
18461846
void ssp_csr_t::verify_permissions(insn_t insn, bool write) const {
18471847
masked_csr_t::verify_permissions(insn, write);
18481848
DECLARE_XENVCFG_VARS(SSE);
1849+
auto p = proc; // To match macro usage
18491850
require_envcfg(SSE);
18501851
}
18511852

riscv/decode_macros.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,10 @@ static inline bool is_aligned(const unsigned val, const unsigned pos)
193193
#define require_envcfg(field) \
194194
do { \
195195
if (((STATE.prv != PRV_M) && (m##field == 0)) || \
196-
((STATE.prv == PRV_U && !STATE.v) && (s##field == 0))) \
196+
(p->extension_enabled('S') && (STATE.prv == PRV_U && !STATE.v) && (s##field == 0))) \
197197
throw trap_illegal_instruction(insn.bits()); \
198-
else if (STATE.v && ((h##field == 0) || \
199-
((STATE.prv == PRV_U) && (s##field == 0)))) \
198+
else if (p->extension_enabled('H') && STATE.v && ((h##field == 0) || \
199+
(p->extension_enabled('S') && (STATE.prv == PRV_U) && (s##field == 0)))) \
200200
throw trap_virtual_instruction(insn.bits()); \
201201
} while (0);
202202

0 commit comments

Comments
 (0)