aboutsummaryrefslogtreecommitdiff
path: root/riscv/trap.h
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2020-06-21 19:32:09 +0530
committerAnup Patel <anup@brainfault.org>2020-07-08 16:54:00 +0530
commitb6038de3fcd71703732995bb90bd7d411d330890 (patch)
tree567325c30d07a2328432b6015adc5b108ff7b81f /riscv/trap.h
parent89d2591f1b84e7755c0f46166d9e0d6ec0fe7c03 (diff)
downloadspike-b6038de3fcd71703732995bb90bd7d411d330890.zip
spike-b6038de3fcd71703732995bb90bd7d411d330890.tar.gz
spike-b6038de3fcd71703732995bb90bd7d411d330890.tar.bz2
Extend trap classes to pass more information
With hypervisor extension, we have more CSRs providing trap related information. We extend existing trap classes to pass additional trap information required by hypervisor extension. Signed-off-by: Anup Patel <anup.patel@wdc.com>
Diffstat (limited to 'riscv/trap.h')
-rw-r--r--riscv/trap.h42
1 files changed, 37 insertions, 5 deletions
diff --git a/riscv/trap.h b/riscv/trap.h
index ac048eb..824af6f 100644
--- a/riscv/trap.h
+++ b/riscv/trap.h
@@ -13,18 +13,23 @@ class trap_t
public:
trap_t(reg_t which) : which(which) {}
virtual const char* name();
+ virtual bool has_gva() { return false; }
virtual bool has_tval() { return false; }
virtual reg_t get_tval() { return 0; }
+ virtual bool has_tval2() { return false; }
+ virtual reg_t get_tval2() { return 0; }
+ virtual bool has_tinst() { return false; }
+ virtual reg_t get_tinst() { return 0; }
reg_t cause() { return which; }
private:
char _name[16];
reg_t which;
};
-class mem_trap_t : public trap_t
+class insn_trap_t : public trap_t
{
public:
- mem_trap_t(reg_t which, reg_t tval)
+ insn_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; }
@@ -32,22 +37,45 @@ class mem_trap_t : public trap_t
reg_t tval;
};
+class mem_trap_t : public trap_t
+{
+ public:
+ mem_trap_t(reg_t which, bool gva, reg_t tval, reg_t tval2, reg_t tinst)
+ : trap_t(which), gva(gva), tval(tval), tval2(tval2), tinst(tinst) {}
+ bool has_gva() override { return gva; }
+ bool has_tval() override { return true; }
+ reg_t get_tval() override { return tval; }
+ bool has_tval2() override { return true; }
+ reg_t get_tval2() override { return tval2; }
+ bool has_tinst() override { return true; }
+ reg_t get_tinst() override { return tinst; }
+ private:
+ bool gva;
+ reg_t tval, tval2, tinst;
+};
+
#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_INST_TRAP(n, x) class trap_##x : public insn_trap_t { \
+ public: \
+ trap_##x(reg_t tval) : insn_trap_t(n, tval) {} \
+ 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) {} \
+ trap_##x(reg_t tval, reg_t tval2, reg_t tinst) : mem_trap_t(n, true, tval, tval2, tinst) {} \
const char* name() { return "trap_"#x; } \
};
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_TRAP(CAUSE_BREAKPOINT, breakpoint)
+DECLARE_INST_TRAP(CAUSE_ILLEGAL_INSTRUCTION, illegal_instruction)
+DECLARE_INST_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)
@@ -59,5 +87,9 @@ 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)
+DECLARE_MEM_TRAP(CAUSE_FETCH_GUEST_PAGE_FAULT, instruction_guest_page_fault)
+DECLARE_MEM_TRAP(CAUSE_LOAD_GUEST_PAGE_FAULT, load_guest_page_fault)
+DECLARE_INST_TRAP(CAUSE_VIRTUAL_INSTRUCTION, virtual_instruction)
+DECLARE_MEM_TRAP(CAUSE_STORE_GUEST_PAGE_FAULT, store_guest_page_fault)
#endif