aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--riscv/decode.h4
-rw-r--r--riscv/insns/sfence_inval_ir.h1
-rw-r--r--riscv/insns/sfence_w_inval.h4
3 files changed, 5 insertions, 4 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))
diff --git a/riscv/insns/sfence_inval_ir.h b/riscv/insns/sfence_inval_ir.h
index f566d63..6f76a3f 100644
--- a/riscv/insns/sfence_inval_ir.h
+++ b/riscv/insns/sfence_inval_ir.h
@@ -1,3 +1,4 @@
require_extension('S');
require_extension(EXT_SVINVAL);
require_impl(IMPL_MMU);
+require_privilege_hs_qualified(PRV_S);
diff --git a/riscv/insns/sfence_w_inval.h b/riscv/insns/sfence_w_inval.h
index f566d63..d1af529 100644
--- a/riscv/insns/sfence_w_inval.h
+++ b/riscv/insns/sfence_w_inval.h
@@ -1,3 +1 @@
-require_extension('S');
-require_extension(EXT_SVINVAL);
-require_impl(IMPL_MMU);
+#include "sfence_inval_ir.h"