Browse Source

triggers: add icount_t and update tinfo

pull/1220/head
YenHaoChen 4 years ago
parent
commit
f8856e4d4f
  1. 36
      riscv/triggers.cc
  2. 16
      riscv/triggers.h

36
riscv/triggers.cc

@ -287,6 +287,40 @@ void mcontrol6_t::tdata1_write(processor_t * const proc, const reg_t val, const
load = get_field(val, CSR_MCONTROL6_LOAD);
}
reg_t icount_t::tdata1_read(const processor_t * const proc) const noexcept
{
auto xlen = proc->get_xlen();
reg_t tdata1 = 0;
tdata1 = set_field(tdata1, CSR_ICOUNT_TYPE(xlen), CSR_TDATA1_TYPE_ICOUNT);
tdata1 = set_field(tdata1, CSR_ICOUNT_DMODE(xlen), dmode);
tdata1 = set_field(tdata1, CSR_ICOUNT_VS, proc->extension_enabled('H') ? vs : 0);
tdata1 = set_field(tdata1, CSR_ICOUNT_VU, proc->extension_enabled('H') ? vu : 0);
tdata1 = set_field(tdata1, CSR_ICOUNT_HIT, hit);
tdata1 = set_field(tdata1, CSR_ICOUNT_COUNT, count);
tdata1 = set_field(tdata1, CSR_ICOUNT_M, m);
tdata1 = set_field(tdata1, CSR_ICOUNT_PENDING, pending);
tdata1 = set_field(tdata1, CSR_ICOUNT_S, s);
tdata1 = set_field(tdata1, CSR_ICOUNT_U, u);
tdata1 = set_field(tdata1, CSR_ICOUNT_ACTION, action);
return tdata1;
}
void icount_t::tdata1_write(processor_t * const proc, const reg_t val, const bool UNUSED allow_chain) noexcept
{
auto xlen = proc->get_xlen();
assert(get_field(val, CSR_ICOUNT_TYPE(xlen)) == CSR_TDATA1_TYPE_ICOUNT);
dmode = proc->get_state()->debug_mode ? get_field(val, CSR_ICOUNT_DMODE(xlen)) : 0;
vs = get_field(val, CSR_ICOUNT_VS);
vu = get_field(val, CSR_ICOUNT_VU);
hit = get_field(val, CSR_ICOUNT_HIT);
count = get_field(val, CSR_ICOUNT_COUNT);
m = get_field(val, CSR_ICOUNT_M);
pending = get_field(val, CSR_ICOUNT_PENDING);
s = proc->extension_enabled_const('S') ? get_field(val, CSR_ICOUNT_S) : 0;
u = proc->extension_enabled_const('U') ? get_field(val, CSR_ICOUNT_U) : 0;
action = legalize_action(val, CSR_ICOUNT_ACTION, CSR_ICOUNT_DMODE(xlen));
}
reg_t itrigger_t::tdata1_read(const processor_t * const proc) const noexcept
{
auto xlen = proc->get_xlen();
@ -423,6 +457,7 @@ bool module_t::tdata1_write(unsigned index, const reg_t val) noexcept
delete triggers[index];
switch (type) {
case CSR_TDATA1_TYPE_MCONTROL: triggers[index] = new mcontrol_t(); break;
case CSR_TDATA1_TYPE_ICOUNT: triggers[index] = new icount_t(); break;
case CSR_TDATA1_TYPE_ITRIGGER: triggers[index] = new itrigger_t(); break;
case CSR_TDATA1_TYPE_ETRIGGER: triggers[index] = new etrigger_t(); break;
case CSR_TDATA1_TYPE_MCONTROL6: triggers[index] = new mcontrol6_t(); break;
@ -515,6 +550,7 @@ reg_t module_t::tinfo_read(unsigned UNUSED index) const noexcept
{
/* In spike, every trigger supports the same types. */
return (1 << CSR_TDATA1_TYPE_MCONTROL) |
(1 << CSR_TDATA1_TYPE_ICOUNT) |
(1 << CSR_TDATA1_TYPE_ITRIGGER) |
(1 << CSR_TDATA1_TYPE_ETRIGGER) |
(1 << CSR_TDATA1_TYPE_MCONTROL6) |

16
riscv/triggers.h

@ -233,6 +233,22 @@ public:
virtual void tdata1_write(processor_t * const proc, const reg_t val, const bool allow_chain) noexcept override;
};
class icount_t : public trigger_t {
public:
virtual reg_t tdata1_read(const processor_t * const proc) const noexcept override;
virtual void tdata1_write(processor_t * const proc, const reg_t val, const bool allow_chain) noexcept override;
bool get_dmode() const override { return dmode; }
virtual action_t get_action() const override { return action; }
private:
bool dmode;
bool hit;
unsigned count;
bool pending;
action_t action;
};
class module_t {
public:
module_t(unsigned count);

Loading…
Cancel
Save