diff options
author | YenHaoChen <howard25336284@gmail.com> | 2023-01-07 15:33:53 +0800 |
---|---|---|
committer | YenHaoChen <howard25336284@gmail.com> | 2023-01-13 12:07:45 +0800 |
commit | 888ef08c02913abb9b9749d928d5de0da84d0ee9 (patch) | |
tree | a1f2d31e1786e6c8ed54a9abedb7078bb8746c36 | |
parent | d61f4a7164ef10bf03f87a65684d801cc47b3d7a (diff) | |
download | spike-888ef08c02913abb9b9749d928d5de0da84d0ee9.zip spike-888ef08c02913abb9b9749d928d5de0da84d0ee9.tar.gz spike-888ef08c02913abb9b9749d928d5de0da84d0ee9.tar.bz2 |
triggers: refactor: remove legalization_action()'s dependency on dmode
avoid breaking functionality by reordering statements in tdata1.write()
-rw-r--r-- | riscv/triggers.cc | 13 | ||||
-rw-r--r-- | riscv/triggers.h | 2 |
2 files changed, 8 insertions, 7 deletions
diff --git a/riscv/triggers.cc b/riscv/triggers.cc index 9287f97..fa04325 100644 --- a/riscv/triggers.cc +++ b/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 diff --git a/riscv/triggers.h b/riscv/triggers.h index 3fc2275..074c7b6 100644 --- a/riscv/triggers.h +++ b/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; |