Browse Source

triggers: add scontext CSR

pull/1160/head
YenHaoChen 4 years ago
parent
commit
f6f1509ad0
  1. 2
      riscv/processor.cc
  2. 1
      riscv/processor.h
  3. 12
      riscv/triggers.cc

2
riscv/processor.cc

@ -392,6 +392,8 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
csrmap[CSR_TDATA2] = tdata2 = std::make_shared<tdata2_csr_t>(proc, CSR_TDATA2);
csrmap[CSR_TDATA3] = std::make_shared<tdata3_csr_t>(proc, CSR_TDATA3);
csrmap[CSR_TINFO] = std::make_shared<tinfo_csr_t>(proc, CSR_TINFO);
unsigned scontext_length = (xlen == 32 ? 16 : 34); // debug spec suggests 16-bit for RV32 and 34-bit for RV64
csrmap[CSR_SCONTEXT] = scontext = std::make_shared<masked_csr_t>(proc, CSR_SCONTEXT, (reg_t(1) << scontext_length) - 1, 0);
debug_mode = false;
single_step = STEP_NONE;

1
riscv/processor.h

@ -177,6 +177,7 @@ struct state_t
dcsr_csr_t_p dcsr;
csr_t_p tselect;
tdata2_csr_t_p tdata2;
csr_t_p scontext;
csr_t_p jvt;

12
riscv/triggers.cc

@ -76,7 +76,7 @@ void trigger_t::tdata3_write(processor_t * const proc, const reg_t val) noexcept
mhselect = get_field(val, CSR_TEXTRA_MHSELECT(xlen));
sbytemask = get_field(val, CSR_TEXTRA_SBYTEMASK(xlen));
svalue = proc->extension_enabled_const('S') ? get_field(val, CSR_TEXTRA_SVALUE(xlen)) : 0;
sselect = (sselect_t)((proc->extension_enabled_const('S') && get_field(val, CSR_TEXTRA_SSELECT(xlen)) == SSELECT_ASID) ? SSELECT_ASID : SSELECT_IGNORE);
sselect = (sselect_t)((proc->extension_enabled_const('S') && get_field(val, CSR_TEXTRA_SSELECT(xlen)) <= SSELECT_MAXVAL) ? get_field(val, CSR_TEXTRA_SSELECT(xlen)) : SSELECT_IGNORE);
}
bool trigger_t::textra_match(processor_t * const proc) const noexcept
@ -86,7 +86,15 @@ bool trigger_t::textra_match(processor_t * const proc) const noexcept
state_t * const state = proc->get_state();
assert(sselect <= SSELECT_MAXVAL);
if (sselect == SSELECT_ASID) {
if (sselect == SSELECT_SCONTEXT) {
reg_t mask = (reg_t(1) << ((xlen == 32) ? CSR_TEXTRA32_SVALUE_LENGTH : CSR_TEXTRA64_SVALUE_LENGTH)) - 1;
assert(CSR_TEXTRA32_SBYTEMASK_LENGTH < CSR_TEXTRA64_SBYTEMASK_LENGTH);
for (int i = 0; i < CSR_TEXTRA64_SBYTEMASK_LENGTH; i++)
if (sbytemask & (1 << i))
mask &= 0xff << (i * 8);
if ((state->scontext->read() & mask) != (svalue & mask))
return false;
} else if (sselect == SSELECT_ASID) {
const reg_t satp = state->satp->read();
const reg_t asid = get_field(satp, SATP_ASID(xlen));
if (asid != (svalue & ((1 << ASIDMAX(xlen)) - 1)))

Loading…
Cancel
Save