diff options
author | Tim Newsome <tim@sifive.com> | 2022-03-16 10:51:27 -0700 |
---|---|---|
committer | Tim Newsome <tim@sifive.com> | 2022-04-05 10:10:03 -0700 |
commit | 354f977848c17ba80681de60c05d46966e1ffc1a (patch) | |
tree | b9630d0a16fde153ac1b595248b8bf86940b88f0 /riscv/processor.h | |
parent | 894f77677d2d6bb84cf57ddec68e87857df357a1 (diff) | |
download | spike-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.h | 81 |
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); |