diff options
-rw-r--r-- | riscv/decode.h | 4 | ||||
-rw-r--r-- | riscv/insns/sfence_inval_ir.h | 1 | ||||
-rw-r--r-- | riscv/insns/sfence_w_inval.h | 4 |
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" |