X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=riscv%2Ftrap.h;h=b5b8a5080abe6fe34e21071ddfd219b52aeae11c;hb=b4997aa4be6ab17b7a838b53e1ddea32726dad66;hp=1a6db73bec38460a7a7034f77dda543290f80276;hpb=dd1da1656719e9304fde74758c7bb8038bb82025;p=riscv-isa-sim.git diff --git a/riscv/trap.h b/riscv/trap.h index 1a6db73..b5b8a50 100644 --- a/riscv/trap.h +++ b/riscv/trap.h @@ -1,41 +1,63 @@ +// See LICENSE for license details. + #ifndef _RISCV_TRAP_H #define _RISCV_TRAP_H -#define TRAP_LIST \ - DECLARE_TRAP(instruction_address_misaligned), \ - DECLARE_TRAP(instruction_access_fault), \ - DECLARE_TRAP(illegal_instruction), \ - DECLARE_TRAP(privileged_instruction), \ - DECLARE_TRAP(fp_disabled), \ - DECLARE_TRAP(interrupt), \ - DECLARE_TRAP(syscall), \ - DECLARE_TRAP(breakpoint), \ - DECLARE_TRAP(load_address_misaligned), \ - DECLARE_TRAP(store_address_misaligned), \ - DECLARE_TRAP(load_access_fault), \ - DECLARE_TRAP(store_access_fault), \ - DECLARE_TRAP(vector_disabled), \ - DECLARE_TRAP(vector_bank), \ - DECLARE_TRAP(vector_illegal_instruction), \ - DECLARE_TRAP(reserved1), \ - DECLARE_TRAP(reserved2), \ - DECLARE_TRAP(reserved3), \ - DECLARE_TRAP(int0), \ - DECLARE_TRAP(int1), \ - DECLARE_TRAP(int2), \ - DECLARE_TRAP(int3), \ - DECLARE_TRAP(int4), \ - DECLARE_TRAP(int5), \ - DECLARE_TRAP(int6), \ - DECLARE_TRAP(int7), \ - -#define DECLARE_TRAP(x) trap_##x -enum trap_t +#include "decode.h" +#include + +struct state_t; + +class trap_t +{ + public: + trap_t(reg_t which) : which(which) {} + virtual const char* name(); + virtual bool has_tval() { return false; } + virtual reg_t get_tval() { return 0; } + reg_t cause() { return which; } + private: + char _name[16]; + reg_t which; +}; + +class mem_trap_t : public trap_t { - TRAP_LIST - NUM_TRAPS + public: + mem_trap_t(reg_t which, reg_t tval) + : trap_t(which), tval(tval) {} + bool has_tval() override { return true; } + reg_t get_tval() override { return tval; } + private: + reg_t tval; +}; + +#define DECLARE_TRAP(n, x) class trap_##x : public trap_t { \ + public: \ + trap_##x() : trap_t(n) {} \ + const char* name() { return "trap_"#x; } \ +}; + +#define DECLARE_MEM_TRAP(n, x) class trap_##x : public mem_trap_t { \ + public: \ + trap_##x(reg_t tval) : mem_trap_t(n, tval) {} \ + const char* name() { return "trap_"#x; } \ }; -extern "C" const char* trap_name(trap_t t); +DECLARE_MEM_TRAP(CAUSE_MISALIGNED_FETCH, instruction_address_misaligned) +DECLARE_MEM_TRAP(CAUSE_FETCH_ACCESS, instruction_access_fault) +DECLARE_MEM_TRAP(CAUSE_ILLEGAL_INSTRUCTION, illegal_instruction) +DECLARE_MEM_TRAP(CAUSE_BREAKPOINT, breakpoint) +DECLARE_MEM_TRAP(CAUSE_MISALIGNED_LOAD, load_address_misaligned) +DECLARE_MEM_TRAP(CAUSE_MISALIGNED_STORE, store_address_misaligned) +DECLARE_MEM_TRAP(CAUSE_LOAD_ACCESS, load_access_fault) +DECLARE_MEM_TRAP(CAUSE_STORE_ACCESS, store_access_fault) +DECLARE_TRAP(CAUSE_USER_ECALL, user_ecall) +DECLARE_TRAP(CAUSE_SUPERVISOR_ECALL, supervisor_ecall) +DECLARE_TRAP(CAUSE_HYPERVISOR_ECALL, hypervisor_ecall) +DECLARE_TRAP(CAUSE_MACHINE_ECALL, machine_ecall) +DECLARE_MEM_TRAP(CAUSE_FETCH_PAGE_FAULT, instruction_page_fault) +DECLARE_MEM_TRAP(CAUSE_LOAD_PAGE_FAULT, load_page_fault) +DECLARE_MEM_TRAP(CAUSE_STORE_PAGE_FAULT, store_page_fault) #endif