Skip to content

Commit 1510a6e

Browse files
committed
triggers: Let mcontrol.match be default (0/equal) if maskmax is 0
1 parent d13dc0b commit 1510a6e

File tree

2 files changed

+6
-5
lines changed

2 files changed

+6
-5
lines changed

riscv/triggers.cc

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ void mcontrol_t::tdata1_write(processor_t * const proc, const reg_t val, const b
171171
timing = legalize_timing(val, MCONTROL_TIMING, MCONTROL_SELECT, MCONTROL_EXECUTE, MCONTROL_LOAD);
172172
action = legalize_action(val, MCONTROL_ACTION, CSR_MCONTROL_DMODE(xlen));
173173
chain = allow_chain ? get_field(val, MCONTROL_CHAIN) : 0;
174-
match = legalize_match(get_field(val, MCONTROL_MATCH));
174+
match = legalize_match(get_field(val, MCONTROL_MATCH), maskmax);
175175
m = get_field(val, MCONTROL_M);
176176
s = proc->extension_enabled_const('S') ? get_field(val, CSR_MCONTROL_S) : 0;
177177
u = proc->extension_enabled_const('U') ? get_field(val, CSR_MCONTROL_U) : 0;
@@ -244,11 +244,11 @@ std::optional<match_result_t> mcontrol_common_t::detect_memory_access_match(proc
244244
return std::nullopt;
245245
}
246246

247-
mcontrol_common_t::match_t mcontrol_common_t::legalize_match(reg_t val) noexcept
247+
mcontrol_common_t::match_t mcontrol_common_t::legalize_match(reg_t val, reg_t maskmax) noexcept
248248
{
249249
switch (val) {
250+
case MATCH_NAPOT: if (maskmax == 0) return MATCH_EQUAL;
250251
case MATCH_EQUAL:
251-
case MATCH_NAPOT:
252252
case MATCH_GE:
253253
case MATCH_LT:
254254
case MATCH_MASK_LOW:
@@ -294,13 +294,14 @@ void mcontrol6_t::tdata1_write(processor_t * const proc, const reg_t val, const
294294
auto xlen = proc->get_const_xlen();
295295
assert(get_field(val, CSR_MCONTROL6_TYPE(xlen)) == CSR_TDATA1_TYPE_MCONTROL6);
296296
dmode = get_field(val, CSR_MCONTROL6_DMODE(xlen));
297+
const reg_t maskmax6 = xlen - 1;
297298
vs = get_field(val, CSR_MCONTROL6_VS);
298299
vu = get_field(val, CSR_MCONTROL6_VU);
299300
hit = hit_t(2 * get_field(val, CSR_MCONTROL6_HIT1) + get_field(val, CSR_MCONTROL6_HIT0)); // 2-bit field {hit1,hit0}
300301
select = get_field(val, CSR_MCONTROL6_SELECT);
301302
action = legalize_action(val, CSR_MCONTROL6_ACTION, CSR_MCONTROL6_DMODE(xlen));
302303
chain = allow_chain ? get_field(val, CSR_MCONTROL6_CHAIN) : 0;
303-
match = legalize_match(get_field(val, CSR_MCONTROL6_MATCH));
304+
match = legalize_match(get_field(val, CSR_MCONTROL6_MATCH), maskmax6);
304305
m = get_field(val, CSR_MCONTROL6_M);
305306
s = proc->extension_enabled_const('S') ? get_field(val, CSR_MCONTROL6_S) : 0;
306307
u = proc->extension_enabled_const('U') ? get_field(val, CSR_MCONTROL6_U) : 0;

riscv/triggers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ class mcontrol_common_t : public trigger_t {
221221
bool simple_match(unsigned xlen, reg_t value) const;
222222

223223
protected:
224-
static match_t legalize_match(reg_t val) noexcept;
224+
static match_t legalize_match(reg_t val, reg_t maskmax) noexcept;
225225
static bool legalize_timing(reg_t val, reg_t timing_mask, reg_t select_mask, reg_t execute_mask, reg_t load_mask) noexcept;
226226
bool dmode = false;
227227
action_t action = ACTION_DEBUG_EXCEPTION;

0 commit comments

Comments
 (0)