Update to new privileged spec
[riscv-isa-sim.git] / riscv / trap.h
1 // See LICENSE for license details.
2
3 #ifndef _RISCV_TRAP_H
4 #define _RISCV_TRAP_H
5
6 #include "decode.h"
7
8 struct state_t;
9
10 class trap_t
11 {
12 public:
13 trap_t(reg_t which) : which(which) {}
14 virtual const char* name();
15 virtual void side_effects(state_t* state) {}
16 reg_t cause() { return which; }
17 private:
18 char _name[16];
19 reg_t which;
20 };
21
22 class mem_trap_t : public trap_t
23 {
24 public:
25 mem_trap_t(reg_t which, reg_t badvaddr)
26 : trap_t(which), badvaddr(badvaddr) {}
27 void side_effects(state_t* state);
28 reg_t get_badvaddr() { return badvaddr; }
29 private:
30 reg_t badvaddr;
31 };
32
33 #define DECLARE_TRAP(n, x) class trap_##x : public trap_t { \
34 public: \
35 trap_##x() : trap_t(n) {} \
36 const char* name() { return "trap_"#x; } \
37 };
38
39 #define DECLARE_MEM_TRAP(n, x) class trap_##x : public mem_trap_t { \
40 public: \
41 trap_##x(reg_t badvaddr) : mem_trap_t(n, badvaddr) {} \
42 const char* name() { return "trap_"#x; } \
43 };
44
45 DECLARE_MEM_TRAP(CAUSE_MISALIGNED_FETCH, instruction_address_misaligned)
46 DECLARE_MEM_TRAP(CAUSE_FAULT_FETCH, instruction_access_fault)
47 DECLARE_TRAP(CAUSE_ILLEGAL_INSTRUCTION, illegal_instruction)
48 DECLARE_TRAP(CAUSE_SCALL, scall)
49 DECLARE_TRAP(CAUSE_MCALL, mcall)
50 DECLARE_TRAP(CAUSE_BREAKPOINT, breakpoint)
51 DECLARE_MEM_TRAP(CAUSE_MISALIGNED_LOAD, load_address_misaligned)
52 DECLARE_MEM_TRAP(CAUSE_MISALIGNED_STORE, store_address_misaligned)
53 DECLARE_MEM_TRAP(CAUSE_FAULT_LOAD, load_access_fault)
54 DECLARE_MEM_TRAP(CAUSE_FAULT_STORE, store_access_fault)
55
56 #endif