From a2a2587426e57f6207d5389620e9109bc0f82e6b Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Tue, 15 Mar 2022 08:14:50 -0700 Subject: trigger_operation_t -> triggers::operation_t --- riscv/mmu.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'riscv/mmu.h') diff --git a/riscv/mmu.h b/riscv/mmu.h index 017b483..a314888 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -11,6 +11,7 @@ #include "processor.h" #include "memtracer.h" #include "byteorder.h" +#include "triggers.h" #include #include @@ -41,11 +42,11 @@ class trigger_matched_t { public: trigger_matched_t(int index, - trigger_operation_t operation, reg_t address, reg_t data) : + triggers::operation_t operation, reg_t address, reg_t data) : index(index), operation(operation), address(address), data(data) {} int index; - trigger_operation_t operation; + triggers::operation_t operation; reg_t address; reg_t data; }; @@ -111,7 +112,7 @@ public: if ((xlate_flags) == 0 && unlikely(tlb_load_tag[vpn % TLB_ENTRIES] == (vpn | TLB_CHECK_TRIGGERS))) { \ type##_t data = from_target(*(target_endian*)(tlb_data[vpn % TLB_ENTRIES].host_offset + addr)); \ if (!matched_trigger) { \ - matched_trigger = trigger_exception(OPERATION_LOAD, addr, data); \ + matched_trigger = trigger_exception(triggers::OPERATION_LOAD, addr, data); \ if (matched_trigger) \ throw *matched_trigger; \ } \ @@ -170,7 +171,7 @@ public: } \ else if ((xlate_flags) == 0 && unlikely(tlb_store_tag[vpn % TLB_ENTRIES] == (vpn | TLB_CHECK_TRIGGERS))) { \ if (!matched_trigger) { \ - matched_trigger = trigger_exception(OPERATION_STORE, addr, val); \ + matched_trigger = trigger_exception(triggers::OPERATION_STORE, addr, val); \ if (matched_trigger) \ throw *matched_trigger; \ } \ @@ -469,9 +470,9 @@ private: } if (unlikely(tlb_insn_tag[vpn % TLB_ENTRIES] == (vpn | TLB_CHECK_TRIGGERS))) { target_endian* ptr = (target_endian*)(tlb_data[vpn % TLB_ENTRIES].host_offset + addr); - int match = proc->trigger_match(OPERATION_EXECUTE, addr, from_target(*ptr)); + int match = proc->trigger_match(triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); if (match >= 0) { - throw trigger_matched_t(match, OPERATION_EXECUTE, addr, from_target(*ptr)); + throw trigger_matched_t(match, triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); } } return result; @@ -481,7 +482,7 @@ private: return (uint16_t*)(translate_insn_addr(addr).host_offset + addr); } - inline trigger_matched_t *trigger_exception(trigger_operation_t operation, + inline trigger_matched_t *trigger_exception(triggers::operation_t operation, reg_t address, reg_t data) { if (!proc) { -- cgit v1.1 From 16ed520e8d35a0eaa56b708aa540400312acdc09 Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Tue, 15 Mar 2022 10:41:21 -0700 Subject: Replace state.mcontrol with TM.triggers. Created a new triggers::module_t to hold the structure. Also make sure mcontrol_t instances are properly initialized. --- riscv/mmu.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'riscv/mmu.h') diff --git a/riscv/mmu.h b/riscv/mmu.h index a314888..61fe105 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -491,7 +491,7 @@ private: int match = proc->trigger_match(operation, address, data); if (match == -1) return NULL; - if (proc->state.mcontrol[match].timing == 0) { + if (proc->TM.triggers[match]->timing == 0) { throw trigger_matched_t(match, operation, address, data); } return new trigger_matched_t(match, operation, address, data); -- cgit v1.1 From 354f977848c17ba80681de60c05d46966e1ffc1a Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Wed, 16 Mar 2022 10:51:27 -0700 Subject: Move trigger_match() into triggers. --- riscv/mmu.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'riscv/mmu.h') diff --git a/riscv/mmu.h b/riscv/mmu.h index 61fe105..953031a 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -470,7 +470,7 @@ private: } if (unlikely(tlb_insn_tag[vpn % TLB_ENTRIES] == (vpn | TLB_CHECK_TRIGGERS))) { target_endian* ptr = (target_endian*)(tlb_data[vpn % TLB_ENTRIES].host_offset + addr); - int match = proc->trigger_match(triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); + int match = proc->TM.trigger_match(proc, triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); if (match >= 0) { throw trigger_matched_t(match, triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); } @@ -488,7 +488,7 @@ private: if (!proc) { return NULL; } - int match = proc->trigger_match(operation, address, data); + int match = proc->TM.trigger_match(proc, operation, address, data); if (match == -1) return NULL; if (proc->TM.triggers[match]->timing == 0) { -- cgit v1.1 From f9c90d729bd9d5772a2a3a320da094d6426911cf Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Wed, 16 Mar 2022 10:55:39 -0700 Subject: Give triggers::module_t its own processor_t* --- riscv/mmu.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'riscv/mmu.h') diff --git a/riscv/mmu.h b/riscv/mmu.h index 953031a..b71f3c7 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -470,7 +470,7 @@ private: } if (unlikely(tlb_insn_tag[vpn % TLB_ENTRIES] == (vpn | TLB_CHECK_TRIGGERS))) { target_endian* ptr = (target_endian*)(tlb_data[vpn % TLB_ENTRIES].host_offset + addr); - int match = proc->TM.trigger_match(proc, triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); + int match = proc->TM.trigger_match(triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); if (match >= 0) { throw trigger_matched_t(match, triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); } @@ -488,7 +488,7 @@ private: if (!proc) { return NULL; } - int match = proc->TM.trigger_match(proc, operation, address, data); + int match = proc->TM.trigger_match(operation, address, data); if (match == -1) return NULL; if (proc->TM.triggers[match]->timing == 0) { -- cgit v1.1 From f2646bf1fb2a40d9a723f8c32078d971a17dba7b Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Fri, 18 Mar 2022 10:11:14 -0700 Subject: trigger_matched_t -> triggers::matched_t --- riscv/mmu.h | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) (limited to 'riscv/mmu.h') diff --git a/riscv/mmu.h b/riscv/mmu.h index b71f3c7..1ca2d9f 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -38,19 +38,6 @@ struct tlb_entry_t { reg_t target_offset; }; -class trigger_matched_t -{ - public: - trigger_matched_t(int index, - triggers::operation_t operation, reg_t address, reg_t data) : - index(index), operation(operation), address(address), data(data) {} - - int index; - triggers::operation_t operation; - reg_t address; - reg_t data; -}; - // this class implements a processor's port into the virtual memory system. // an MMU and instruction cache are maintained for simulator performance. class mmu_t @@ -472,7 +459,7 @@ private: target_endian* ptr = (target_endian*)(tlb_data[vpn % TLB_ENTRIES].host_offset + addr); int match = proc->TM.trigger_match(triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); if (match >= 0) { - throw trigger_matched_t(match, triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); + throw triggers::matched_t(match, triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); } } return result; @@ -482,7 +469,7 @@ private: return (uint16_t*)(translate_insn_addr(addr).host_offset + addr); } - inline trigger_matched_t *trigger_exception(triggers::operation_t operation, + inline triggers::matched_t *trigger_exception(triggers::operation_t operation, reg_t address, reg_t data) { if (!proc) { @@ -492,9 +479,9 @@ private: if (match == -1) return NULL; if (proc->TM.triggers[match]->timing == 0) { - throw trigger_matched_t(match, operation, address, data); + throw triggers::matched_t(match, operation, address, data); } - return new trigger_matched_t(match, operation, address, data); + return new triggers::matched_t(match, operation, address, data); } reg_t pmp_homogeneous(reg_t addr, reg_t len); @@ -509,7 +496,7 @@ private: bool check_triggers_load; bool check_triggers_store; // The exception describing a matched trigger, or NULL. - trigger_matched_t *matched_trigger; + triggers::matched_t *matched_trigger; friend class processor_t; }; -- cgit v1.1 From bd7ca31454507df073e66d4c9e1d32a062231fc2 Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Fri, 18 Mar 2022 10:58:44 -0700 Subject: module_t::trigger_match -> memory_access_match --- riscv/mmu.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'riscv/mmu.h') diff --git a/riscv/mmu.h b/riscv/mmu.h index 1ca2d9f..7faa266 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -457,7 +457,7 @@ private: } if (unlikely(tlb_insn_tag[vpn % TLB_ENTRIES] == (vpn | TLB_CHECK_TRIGGERS))) { target_endian* ptr = (target_endian*)(tlb_data[vpn % TLB_ENTRIES].host_offset + addr); - int match = proc->TM.trigger_match(triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); + int match = proc->TM.memory_access_match(triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); if (match >= 0) { throw triggers::matched_t(match, triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); } @@ -475,7 +475,7 @@ private: if (!proc) { return NULL; } - int match = proc->TM.trigger_match(operation, address, data); + int match = proc->TM.memory_access_match(operation, address, data); if (match == -1) return NULL; if (proc->TM.triggers[match]->timing == 0) { -- cgit v1.1 From f3d14f936965fb48a140ab010a9e1b0b2908bf2d Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Thu, 24 Mar 2022 11:12:39 -0700 Subject: Move trigger match logic into triggers.cc --- riscv/mmu.h | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'riscv/mmu.h') diff --git a/riscv/mmu.h b/riscv/mmu.h index 7faa266..0f009c6 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -457,9 +457,10 @@ private: } if (unlikely(tlb_insn_tag[vpn % TLB_ENTRIES] == (vpn | TLB_CHECK_TRIGGERS))) { target_endian* ptr = (target_endian*)(tlb_data[vpn % TLB_ENTRIES].host_offset + addr); - int match = proc->TM.memory_access_match(triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); - if (match >= 0) { - throw triggers::matched_t(match, triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); + triggers::action_t action; + auto match = proc->TM.memory_access_match(&action, triggers::OPERATION_EXECUTE, addr, from_target(*ptr)); + if (match != triggers::MATCH_NONE) { + throw triggers::matched_t(triggers::OPERATION_EXECUTE, addr, from_target(*ptr), action); } } return result; @@ -475,13 +476,14 @@ private: if (!proc) { return NULL; } - int match = proc->TM.memory_access_match(operation, address, data); - if (match == -1) + triggers::action_t action; + auto match = proc->TM.memory_access_match(&action, operation, address, data); + if (match == triggers::MATCH_NONE) return NULL; - if (proc->TM.triggers[match]->timing == 0) { - throw triggers::matched_t(match, operation, address, data); + if (match == triggers::MATCH_FIRE_BEFORE) { + throw triggers::matched_t(operation, address, data, action); } - return new triggers::matched_t(match, operation, address, data); + return new triggers::matched_t(operation, address, data, action); } reg_t pmp_homogeneous(reg_t addr, reg_t len); -- cgit v1.1