Browse Source

triggers: refactor: remove legalization_action()'s dependency on dmode

avoid breaking functionality by reordering statements in tdata1.write()
pull/1214/head
YenHaoChen 3 years ago
parent
commit
888ef08c02
  1. 13
      riscv/triggers.cc
  2. 2
      riscv/triggers.h

13
riscv/triggers.cc

@ -25,8 +25,9 @@ void trigger_t::tdata2_write(processor_t UNUSED * const proc, const reg_t UNUSED
tdata2 = val;
}
action_t trigger_t::legalize_action(reg_t val) const noexcept {
return (val > ACTION_MAXVAL || (val == ACTION_DEBUG_MODE && get_dmode() == 0)) ? ACTION_DEBUG_EXCEPTION : (action_t)val;
action_t trigger_t::legalize_action(reg_t val, reg_t action_mask, reg_t dmode_mask) const noexcept {
reg_t act = get_field(val, action_mask);
return (act > ACTION_MAXVAL || (act == ACTION_DEBUG_MODE && get_field(val, dmode_mask) == 0)) ? ACTION_DEBUG_EXCEPTION : (action_t)act;
}
unsigned trigger_t::legalize_mhselect(bool h_enabled) const noexcept {
@ -149,7 +150,7 @@ void mcontrol_t::tdata1_write(processor_t * const proc, const reg_t val, const b
hit = get_field(val, CSR_MCONTROL_HIT);
select = get_field(val, MCONTROL_SELECT);
timing = legalize_timing(val, MCONTROL_TIMING, MCONTROL_SELECT, MCONTROL_EXECUTE, MCONTROL_LOAD);
action = legalize_action(get_field(val, MCONTROL_ACTION));
action = legalize_action(val, MCONTROL_ACTION, CSR_MCONTROL_DMODE(xlen));
chain = allow_chain ? get_field(val, MCONTROL_CHAIN) : 0;
match = legalize_match(get_field(val, MCONTROL_MATCH));
m = get_field(val, MCONTROL_M);
@ -275,7 +276,7 @@ void mcontrol6_t::tdata1_write(processor_t * const proc, const reg_t val, const
hit = get_field(val, CSR_MCONTROL6_HIT);
select = get_field(val, CSR_MCONTROL6_SELECT);
timing = legalize_timing(val, CSR_MCONTROL6_TIMING, CSR_MCONTROL6_SELECT, CSR_MCONTROL6_EXECUTE, CSR_MCONTROL6_LOAD);
action = legalize_action(get_field(val, CSR_MCONTROL6_ACTION));
action = legalize_action(val, CSR_MCONTROL6_ACTION, CSR_MCONTROL6_DMODE(xlen));
chain = allow_chain ? get_field(val, CSR_MCONTROL6_CHAIN) : 0;
match = legalize_match(get_field(val, CSR_MCONTROL6_MATCH));
m = get_field(val, CSR_MCONTROL6_M);
@ -315,7 +316,7 @@ void itrigger_t::tdata1_write(processor_t * const proc, const reg_t val, const b
m = get_field(val, CSR_ITRIGGER_M);
s = proc->extension_enabled_const('S') ? get_field(val, CSR_ITRIGGER_S) : 0;
u = proc->extension_enabled_const('U') ? get_field(val, CSR_ITRIGGER_U) : 0;
action = legalize_action(get_field(val, CSR_ITRIGGER_ACTION));
action = legalize_action(val, CSR_ITRIGGER_ACTION, CSR_ITRIGGER_DMODE(xlen));
}
std::optional<match_result_t> trap_common_t::detect_trap_match(processor_t * const proc, const trap_t& t) noexcept
@ -366,7 +367,7 @@ void etrigger_t::tdata1_write(processor_t * const proc, const reg_t val, const b
m = get_field(val, CSR_ETRIGGER_M);
s = proc->extension_enabled_const('S') ? get_field(val, CSR_ETRIGGER_S) : 0;
u = proc->extension_enabled_const('U') ? get_field(val, CSR_ETRIGGER_U) : 0;
action = legalize_action(get_field(val, CSR_ETRIGGER_ACTION));
action = legalize_action(val, CSR_ETRIGGER_ACTION, CSR_ETRIGGER_DMODE(xlen));
}
bool etrigger_t::simple_match(bool interrupt, reg_t bit) const

2
riscv/triggers.h

@ -85,7 +85,7 @@ public:
virtual std::optional<match_result_t> detect_trap_match(processor_t UNUSED * const proc, const trap_t UNUSED & t) noexcept { return std::nullopt; }
protected:
action_t legalize_action(reg_t val) const noexcept;
action_t legalize_action(reg_t val, reg_t action_mask, reg_t dmode_mask) const noexcept;
bool common_match(processor_t * const proc) const noexcept;
reg_t tdata2;

Loading…
Cancel
Save