|
|
|
@ -174,13 +174,13 @@ private: |
|
|
|
#define JUMP_TARGET (pc + insn.uj_imm()) |
|
|
|
#define RM ({ int rm = insn.rm(); \ |
|
|
|
if(rm == 7) rm = STATE.frm; \ |
|
|
|
if(rm > 4) throw trap_illegal_instruction(); \ |
|
|
|
if(rm > 4) throw trap_illegal_instruction(0); \ |
|
|
|
rm; }) |
|
|
|
|
|
|
|
#define get_field(reg, mask) (((reg) & (decltype(reg))(mask)) / ((mask) & ~((mask) << 1))) |
|
|
|
#define set_field(reg, mask, val) (((reg) & ~(decltype(reg))(mask)) | (((decltype(reg))(val) * ((mask) & ~((mask) << 1))) & (decltype(reg))(mask))) |
|
|
|
|
|
|
|
#define require(x) if (unlikely(!(x))) throw trap_illegal_instruction() |
|
|
|
#define require(x) if (unlikely(!(x))) throw trap_illegal_instruction(0) |
|
|
|
#define require_privilege(p) require(STATE.prv >= (p)) |
|
|
|
#define require_rv64 require(xlen == 64) |
|
|
|
#define require_rv32 require(xlen == 32) |
|
|
|
@ -227,7 +227,7 @@ private: |
|
|
|
unsigned csr_priv = get_field((which), 0x300); \ |
|
|
|
unsigned csr_read_only = get_field((which), 0xC00) == 3; \ |
|
|
|
if (((write) && csr_read_only) || STATE.prv < csr_priv) \ |
|
|
|
throw trap_illegal_instruction(); \ |
|
|
|
throw trap_illegal_instruction(0); \ |
|
|
|
(which); }) |
|
|
|
|
|
|
|
#define DEBUG_START 0x100 |
|
|
|
|