aboutsummaryrefslogtreecommitdiff
path: root/riscv/mmu.h
diff options
context:
space:
mode:
authorScott Johnson <scott.johnson@arilinc.com>2022-04-11 13:19:33 -0500
committerGitHub <noreply@github.com>2022-04-11 13:19:33 -0500
commit7dc9283f31680a32110ad7f7296bde195c86399e (patch)
tree1825107be38daf706d10c2255e8b5d6ddccbd375 /riscv/mmu.h
parent69b5e6503cb7d0b8341ba19c80763cd9eb93ad96 (diff)
parentdc7ee32367c5eb6429bfdcfc2dd8d557cc570b95 (diff)
downloadspike-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.h40
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;
};