aboutsummaryrefslogtreecommitdiff
path: root/riscv/mmu.h
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2022-03-24 11:12:39 -0700
committerTim Newsome <tim@sifive.com>2022-04-05 10:33:27 -0700
commitf3d14f936965fb48a140ab010a9e1b0b2908bf2d (patch)
tree7ae78337dc6a12f25a378f32a8a49def1b633393 /riscv/mmu.h
parentbd7ca31454507df073e66d4c9e1d32a062231fc2 (diff)
downloadspike-f3d14f936965fb48a140ab010a9e1b0b2908bf2d.zip
spike-f3d14f936965fb48a140ab010a9e1b0b2908bf2d.tar.gz
spike-f3d14f936965fb48a140ab010a9e1b0b2908bf2d.tar.bz2
Move trigger match logic into triggers.cc
Diffstat (limited to 'riscv/mmu.h')
-rw-r--r--riscv/mmu.h18
1 files changed, 10 insertions, 8 deletions
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<uint16_t>* ptr = (target_endian<uint16_t>*)(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);