Browse Source

Convert tselect to csr_t

pull/813/head
Scott Johnson 5 years ago
parent
commit
ab8e2fe519
No known key found for this signature in database GPG Key ID: 61C1F01D3D1410C9
  1. 9
      riscv/csrs.cc
  2. 8
      riscv/csrs.h
  3. 19
      riscv/processor.cc
  4. 2
      riscv/processor.h

9
riscv/csrs.cc

@ -952,3 +952,12 @@ bool hgatp_csr_t::unlogged_write(const reg_t val) noexcept {
mask &= ~(reg_t)3;
return basic_csr_t::unlogged_write((read() & ~mask) | (val & mask));
}
tselect_csr_t::tselect_csr_t(processor_t* const proc, const reg_t addr):
basic_csr_t(proc, addr, 0) {
}
bool tselect_csr_t::unlogged_write(const reg_t val) noexcept {
return basic_csr_t::unlogged_write((val < state->num_triggers) ? val : read());
}

8
riscv/csrs.h

@ -500,4 +500,12 @@ class hgatp_csr_t: public basic_csr_t {
};
class tselect_csr_t: public basic_csr_t {
public:
tselect_csr_t(processor_t* const proc, const reg_t addr);
protected:
virtual bool unlogged_write(const reg_t val) noexcept override;
};
#endif

19
riscv/processor.cc

@ -501,7 +501,7 @@ void state_t::reset(processor_t* const proc, reg_t max_isa)
dscratch1 = 0;
memset(&this->dcsr, 0, sizeof(this->dcsr));
tselect = 0;
csrmap[CSR_TSELECT] = tselect = std::make_shared<tselect_csr_t>(proc, CSR_TSELECT);
memset(this->mcontrol, 0, sizeof(this->mcontrol));
for (auto &item : mcontrol)
item.type = 2;
@ -993,14 +993,9 @@ void processor_t::set_csr(int which, reg_t val)
VU.vxsat = (val & VCSR_VXSAT) >> VCSR_VXSAT_SHIFT;
VU.vxrm = (val & VCSR_VXRM) >> VCSR_VXRM_SHIFT;
break;
case CSR_TSELECT:
if (val < state.num_triggers) {
state.tselect = val;
}
break;
case CSR_TDATA1:
{
mcontrol_t *mc = &state.mcontrol[state.tselect];
mcontrol_t *mc = &state.mcontrol[state.tselect->read()];
if (mc->dmode && !state.debug_mode) {
break;
}
@ -1024,10 +1019,10 @@ void processor_t::set_csr(int which, reg_t val)
}
break;
case CSR_TDATA2:
if (state.mcontrol[state.tselect].dmode && !state.debug_mode) {
if (state.mcontrol[state.tselect->read()].dmode && !state.debug_mode) {
break;
}
state.tdata2[state.tselect] = val;
state.tdata2[state.tselect->read()] = val;
break;
case CSR_DCSR:
state.dcsr.prv = get_field(val, DCSR_PRV);
@ -1091,7 +1086,6 @@ void processor_t::set_csr(int which, reg_t val)
LOG_CSR(CSR_VXRM);
break;
case CSR_TSELECT:
case CSR_TDATA1:
case CSR_TDATA2:
case CSR_DCSR:
@ -1160,11 +1154,10 @@ reg_t processor_t::get_csr(int which, insn_t insn, bool write, bool peek)
case CSR_MIMPID: ret(0);
case CSR_MVENDORID: ret(0);
case CSR_MHARTID: ret(id);
case CSR_TSELECT: ret(state.tselect);
case CSR_TDATA1:
{
reg_t v = 0;
mcontrol_t *mc = &state.mcontrol[state.tselect];
mcontrol_t *mc = &state.mcontrol[state.tselect->read()];
v = set_field(v, MCONTROL_TYPE(xlen), mc->type);
v = set_field(v, MCONTROL_DMODE(xlen), mc->dmode);
v = set_field(v, MCONTROL_MASKMAX(xlen), mc->maskmax);
@ -1182,7 +1175,7 @@ reg_t processor_t::get_csr(int which, insn_t insn, bool write, bool peek)
v = set_field(v, MCONTROL_LOAD, mc->load);
ret(v);
}
case CSR_TDATA2: ret(state.tdata2[state.tselect]);
case CSR_TDATA2: ret(state.tdata2[state.tselect->read()]);
case CSR_TDATA3: ret(0);
case CSR_DCSR:
{

2
riscv/processor.h

@ -204,7 +204,7 @@ struct state_t
reg_t dpc;
reg_t dscratch0, dscratch1;
dcsr_t dcsr;
reg_t tselect;
csr_t_p tselect;
mcontrol_t mcontrol[num_triggers];
reg_t tdata2[num_triggers];
bool debug_mode;

Loading…
Cancel
Save