aboutsummaryrefslogtreecommitdiff
path: root/riscv/decode.h
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2022-12-05 16:11:40 -1000
committerGitHub <noreply@github.com>2022-12-05 16:11:40 -1000
commitadfaef00e5cd57bef0aa6a9909b4bff5b3863c40 (patch)
tree549be77796ce6730f7f07d308383f1083b6b1e38 /riscv/decode.h
parentb09a4dc2ae8185fc53991f33d09c407526e83457 (diff)
parentbc16208aa51834aa9968af44678bedd5cdeb9d35 (diff)
downloadriscv-isa-sim-adfaef00e5cd57bef0aa6a9909b4bff5b3863c40.zip
riscv-isa-sim-adfaef00e5cd57bef0aa6a9909b4bff5b3863c40.tar.gz
riscv-isa-sim-adfaef00e5cd57bef0aa6a9909b4bff5b3863c40.tar.bz2
Merge pull request #1162 from riscv-software-src/sfence
SFENCE.W.INVAL and SFENCE.INVAL.IR should check privilege mode
Diffstat (limited to 'riscv/decode.h')
-rw-r--r--riscv/decode.h4
1 files changed, 3 insertions, 1 deletions
diff --git a/riscv/decode.h b/riscv/decode.h
index bca413e..2fd573a 100644
--- a/riscv/decode.h
+++ b/riscv/decode.h
@@ -359,7 +359,9 @@ do { \
(((reg) & ~(std::remove_cv<decltype(reg)>::type)(mask)) | (((std::remove_cv<decltype(reg)>::type)(val) * ((mask) & ~((mask) << 1))) & (std::remove_cv<decltype(reg)>::type)(mask)))
#define require_privilege(p) require(STATE.prv >= (p))
-#define require_novirt() if (unlikely(STATE.v)) throw trap_virtual_instruction(insn.bits())
+#define require_novirt() (unlikely(STATE.v) ? throw trap_virtual_instruction(insn.bits()) : (void) 0)
+#define require_hs_qualified(cond) (STATE.v && !(cond) ? require_novirt() : require(cond))
+#define require_privilege_hs_qualified(p) require_hs_qualified(STATE.prv >= (p))
#define require_rv64 require(xlen == 64)
#define require_rv32 require(xlen == 32)
#define require_extension(s) require(p->extension_enabled(s))