aboutsummaryrefslogtreecommitdiff
path: root/riscv/processor.h
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2022-03-16 10:51:27 -0700
committerTim Newsome <tim@sifive.com>2022-04-05 10:10:03 -0700
commit354f977848c17ba80681de60c05d46966e1ffc1a (patch)
treeb9630d0a16fde153ac1b595248b8bf86940b88f0 /riscv/processor.h
parent894f77677d2d6bb84cf57ddec68e87857df357a1 (diff)
downloadspike-354f977848c17ba80681de60c05d46966e1ffc1a.zip
spike-354f977848c17ba80681de60c05d46966e1ffc1a.tar.gz
spike-354f977848c17ba80681de60c05d46966e1ffc1a.tar.bz2
Move trigger_match() into triggers.
Diffstat (limited to 'riscv/processor.h')
-rw-r--r--riscv/processor.h81
1 files changed, 0 insertions, 81 deletions
diff --git a/riscv/processor.h b/riscv/processor.h
index e245e8a..776496c 100644
--- a/riscv/processor.h
+++ b/riscv/processor.h
@@ -316,87 +316,6 @@ public:
HR_GROUP /* Halt requested due to halt group. */
} halt_request;
- // Return the index of a trigger that matched, or -1.
- inline int trigger_match(triggers::operation_t operation, reg_t address, reg_t data)
- {
- if (state.debug_mode)
- return -1;
-
- bool chain_ok = true;
-
- for (unsigned int i = 0; i < state.num_triggers; i++) {
- if (!chain_ok) {
- chain_ok |= !TM.triggers[i]->chain;
- continue;
- }
-
- if ((operation == triggers::OPERATION_EXECUTE && !TM.triggers[i]->execute) ||
- (operation == triggers::OPERATION_STORE && !TM.triggers[i]->store) ||
- (operation == triggers::OPERATION_LOAD && !TM.triggers[i]->load) ||
- (state.prv == PRV_M && !TM.triggers[i]->m) ||
- (state.prv == PRV_S && !TM.triggers[i]->s) ||
- (state.prv == PRV_U && !TM.triggers[i]->u)) {
- continue;
- }
-
- reg_t value;
- if (TM.triggers[i]->select) {
- value = data;
- } else {
- value = address;
- }
-
- // We need this because in 32-bit mode sometimes the PC bits get sign
- // extended.
- if (xlen == 32) {
- value &= 0xffffffff;
- }
-
- auto tdata2 = TM.triggers[i]->tdata2;
- switch (TM.triggers[i]->match) {
- case triggers::mcontrol_t::MATCH_EQUAL:
- if (value != tdata2)
- continue;
- break;
- case triggers::mcontrol_t::MATCH_NAPOT:
- {
- reg_t mask = ~((1 << (cto(tdata2)+1)) - 1);
- if ((value & mask) != (tdata2 & mask))
- continue;
- }
- break;
- case triggers::mcontrol_t::MATCH_GE:
- if (value < tdata2)
- continue;
- break;
- case triggers::mcontrol_t::MATCH_LT:
- if (value >= tdata2)
- continue;
- break;
- case triggers::mcontrol_t::MATCH_MASK_LOW:
- {
- reg_t mask = tdata2 >> (xlen/2);
- if ((value & mask) != (tdata2 & mask))
- continue;
- }
- break;
- case triggers::mcontrol_t::MATCH_MASK_HIGH:
- {
- reg_t mask = tdata2 >> (xlen/2);
- if (((value >> (xlen/2)) & mask) != (tdata2 & mask))
- continue;
- }
- break;
- }
-
- if (!TM.triggers[i]->chain) {
- return i;
- }
- chain_ok = true;
- }
- return -1;
- }
-
void trigger_updated();
void set_pmp_num(reg_t pmp_num);