Skip to content

Commit 60f02dd

Browse files
authored
Merge pull request #1786 from YenHaoChen/pr-mcontrol
triggers: Let mcontrol.match be default (0/equal) if maskmax is 0
2 parents 20cd44a + 1510a6e commit 60f02dd

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

riscv/triggers.cc

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ reg_t mcontrol_t::tdata1_read(const processor_t * const proc) const noexcept {
146146
auto xlen = proc->get_xlen();
147147
v = set_field(v, MCONTROL_TYPE(xlen), CSR_TDATA1_TYPE_MCONTROL);
148148
v = set_field(v, CSR_MCONTROL_DMODE(xlen), dmode);
149-
v = set_field(v, MCONTROL_MASKMAX(xlen), 0);
149+
v = set_field(v, MCONTROL_MASKMAX(xlen), maskmax);
150150
v = set_field(v, CSR_MCONTROL_HIT, hit);
151151
v = set_field(v, MCONTROL_SELECT, select);
152152
v = set_field(v, MCONTROL_TIMING, timing);
@@ -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: 2 additions & 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;
@@ -243,6 +243,7 @@ class mcontrol_t : public mcontrol_common_t {
243243

244244
private:
245245
bool hit = false;
246+
const reg_t maskmax = 0;
246247
};
247248

248249
class mcontrol6_t : public mcontrol_common_t {

0 commit comments

Comments
 (0)