diff options
author | Scott Johnson <scott.johnson@arilinc.com> | 2022-04-11 13:19:33 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-11 13:19:33 -0500 |
commit | 7dc9283f31680a32110ad7f7296bde195c86399e (patch) | |
tree | 1825107be38daf706d10c2255e8b5d6ddccbd375 /riscv/mmu.h | |
parent | 69b5e6503cb7d0b8341ba19c80763cd9eb93ad96 (diff) | |
parent | dc7ee32367c5eb6429bfdcfc2dd8d557cc570b95 (diff) | |
download | spike-7dc9283f31680a32110ad7f7296bde195c86399e.zip spike-7dc9283f31680a32110ad7f7296bde195c86399e.tar.gz spike-7dc9283f31680a32110ad7f7296bde195c86399e.tar.bz2 |
Merge pull request #944 from riscv-software-src/triggers
Refactor trigger code
Diffstat (limited to 'riscv/mmu.h')
-rw-r--r-- | riscv/mmu.h | 40 |
1 files changed, 15 insertions, 25 deletions
diff --git a/riscv/mmu.h b/riscv/mmu.h index 3b95f28..3782ffa 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 <stdlib.h> #include <vector> @@ -37,19 +38,6 @@ struct tlb_entry_t { reg_t target_offset; }; -class trigger_matched_t -{ - public: - trigger_matched_t(int index, - trigger_operation_t operation, reg_t address, reg_t data) : - index(index), operation(operation), address(address), data(data) {} - - int index; - trigger_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 @@ -111,7 +99,7 @@ public: if ((xlate_flags) == 0 && unlikely(tlb_load_tag[vpn % TLB_ENTRIES] == (vpn | TLB_CHECK_TRIGGERS))) { \ type##_t data = from_target(*(target_endian<type##_t>*)(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 +158,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 +457,10 @@ private: } if (unlikely(tlb_insn_tag[vpn % TLB_ENTRIES] == (vpn | TLB_CHECK_TRIGGERS))) { target_endian<uint16_t>* ptr = (target_endian<uint16_t>*)(tlb_data[vpn % TLB_ENTRIES].host_offset + addr); - int match = proc->trigger_match(OPERATION_EXECUTE, addr, from_target(*ptr)); - if (match >= 0) { - throw trigger_matched_t(match, 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; @@ -481,19 +470,20 @@ private: return (uint16_t*)(translate_insn_addr(addr).host_offset + addr); } - inline trigger_matched_t *trigger_exception(trigger_operation_t operation, + inline triggers::matched_t *trigger_exception(triggers::operation_t operation, reg_t address, reg_t data) { if (!proc) { return NULL; } - int match = proc->trigger_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->state.mcontrol[match].timing == 0) { - throw trigger_matched_t(match, operation, address, data); + if (match == triggers::MATCH_FIRE_BEFORE) { + throw triggers::matched_t(operation, address, data, action); } - return new trigger_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); @@ -508,7 +498,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; }; |