diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-03-09 23:58:17 -0800 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-03-09 23:58:17 -0800 |
commit | b94c7a4b07f96f24ae7411780abf874416549f7b (patch) | |
tree | b94ca015e49392f52e5abf1209ee184fcf874db4 /machine/emulation.h | |
parent | f5a96732cb81571a3ba6b081b8556187d564f678 (diff) | |
download | riscv-pk-b94c7a4b07f96f24ae7411780abf874416549f7b.zip riscv-pk-b94c7a4b07f96f24ae7411780abf874416549f7b.tar.gz riscv-pk-b94c7a4b07f96f24ae7411780abf874416549f7b.tar.bz2 |
Refactor pk, bbl, machine into separate libraries
Yuck.
Diffstat (limited to 'machine/emulation.h')
-rw-r--r-- | machine/emulation.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/machine/emulation.h b/machine/emulation.h new file mode 100644 index 0000000..f1a71ec --- /dev/null +++ b/machine/emulation.h @@ -0,0 +1,28 @@ +#ifndef _RISCV_EMULATION_H +#define _RISCV_EMULATION_H + +#include "encoding.h" +#include "bits.h" +#include <stdint.h> + +typedef uint32_t insn_t; +typedef void (*emulation_func)(uintptr_t*, uintptr_t, uintptr_t, uintptr_t, insn_t); +#define DECLARE_EMULATION_FUNC(name) void name(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc, uintptr_t mstatus, insn_t insn) + +void misaligned_load_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc); +void misaligned_store_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc); +void redirect_trap(uintptr_t epc, uintptr_t mstatus); +DECLARE_EMULATION_FUNC(truly_illegal_insn); + +#define GET_REG(insn, pos, regs) ({ \ + int mask = (1 << (5+LOG_REGBYTES)) - (1 << LOG_REGBYTES); \ + (uintptr_t*)((uintptr_t)regs + (((insn) >> ((pos) - LOG_REGBYTES)) & mask)); \ +}) +#define GET_RS1(insn, regs) (*GET_REG(insn, 15, regs)) +#define GET_RS2(insn, regs) (*GET_REG(insn, 20, regs)) +#define SET_RD(insn, regs, val) (*GET_REG(insn, 7, regs) = (val)) +#define IMM_I(insn) ((int32_t)(insn) >> 20) +#define IMM_S(insn) (((int32_t)(insn) >> 25 << 5) | (int32_t)(((insn) >> 7) & 0x1f)) +#define MASK_FUNCT3 0x7000 + +#endif |