1fe44eb08d6aea33aab49d631fc8c167a5a6f4cb
[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 #include <stdlib.h>
8
9 struct state_t;
10
11 class trap_t
12 {
13 public:
14 trap_t(reg_t which) : which(which) {}
15 virtual const char* name();
16 virtual bool has_badaddr() { return false; }
17 virtual reg_t get_badaddr() { return 0; }
18 reg_t cause() { return which; }
19 private:
20 char _name[16];
21 reg_t which;
22 };
23
24 class mem_trap_t : public trap_t
25 {
26 public:
27 mem_trap_t(reg_t which, reg_t badaddr)
28 : trap_t(which), badaddr(badaddr) {}
29 bool has_badaddr() override { return true; }
30 reg_t get_badaddr() override { return badaddr; }
31 private:
32 reg_t badaddr;
33 };
34
35 #define DECLARE_TRAP(n, x) class trap_##x : public trap_t { \
36 public: \
37 trap_##x() : trap_t(n) {} \
38 const char* name() { return "trap_"#x; } \
39 };
40
41 #define DECLARE_MEM_TRAP(n, x) class trap_##x : public mem_trap_t { \
42 public: \
43 trap_##x(reg_t badaddr) : mem_trap_t(n, badaddr) {} \
44 const char* name() { return "trap_"#x; } \
45 };
46
47 DECLARE_MEM_TRAP(CAUSE_MISALIGNED_FETCH, instruction_address_misaligned)
48 DECLARE_MEM_TRAP(CAUSE_FETCH_ACCESS, instruction_access_fault)
49 DECLARE_MEM_TRAP(CAUSE_ILLEGAL_INSTRUCTION, illegal_instruction)
50 DECLARE_MEM_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_LOAD_ACCESS, load_access_fault)
54 DECLARE_MEM_TRAP(CAUSE_STORE_ACCESS, store_access_fault)
55 DECLARE_TRAP(CAUSE_USER_ECALL, user_ecall)
56 DECLARE_TRAP(CAUSE_SUPERVISOR_ECALL, supervisor_ecall)
57 DECLARE_TRAP(CAUSE_HYPERVISOR_ECALL, hypervisor_ecall)
58 DECLARE_TRAP(CAUSE_MACHINE_ECALL, machine_ecall)
59 DECLARE_MEM_TRAP(CAUSE_FETCH_PAGE_FAULT, instruction_page_fault)
60 DECLARE_MEM_TRAP(CAUSE_LOAD_PAGE_FAULT, load_page_fault)
61 DECLARE_MEM_TRAP(CAUSE_STORE_PAGE_FAULT, store_page_fault)
62
63 #endif