Browse Source

AIA: Let mvien.SEIP be writable

When mvien.SEIP=0, mip.SEIP includes the software-writable bit, i.e.,
mvip.SEIP.

When mvien.SEIP=1, mip.SEIP is read-only and does not include the value
of mvip.SEIP.
pull/1988/head
YenHaoChen 2 years ago
committed by Binno
parent
commit
49cdae3b04
  1. 2
      riscv/csr_init.cc
  2. 4
      riscv/csrs.cc

2
riscv/csr_init.cc

@ -475,7 +475,7 @@ void state_t::csr_init(processor_t* const proc, reg_t max_isa)
const reg_t srmcfg_mask = SRMCFG_MCID | SRMCFG_RCID;
add_const_ext_csr(EXT_SSQOSID, CSR_SRMCFG, std::make_shared<srmcfg_csr_t>(proc, CSR_SRMCFG, srmcfg_mask, 0));
mvien = std::make_shared<masked_csr_t>(proc, CSR_MVIEN, MIP_SSIP, 0);
mvien = std::make_shared<masked_csr_t>(proc, CSR_MVIEN, MIP_SEIP | MIP_SSIP, 0);
mvip = std::make_shared<mvip_csr_t>(proc, CSR_MVIP, 0);
if (proc->extension_enabled_const(EXT_SMAIA)) {
add_csr(CSR_MTOPI, std::make_shared<mtopi_csr_t>(proc, CSR_MTOPI));

4
riscv/csrs.cc

@ -784,13 +784,13 @@ mip_csr_t::mip_csr_t(processor_t* const proc, const reg_t addr):
}
void mip_csr_t::write_with_mask(const reg_t mask, const reg_t val) noexcept {
if (mask & MIP_SEIP)
if (!(state->mvien->read() & MIP_SEIP) && (mask & MIP_SEIP))
state->mvip->write_with_mask(MIP_SEIP, val); // mvip.SEIP is an alias of mip.SEIP when mvien.SEIP=0
mip_or_mie_csr_t::write_with_mask(mask & ~MIP_SEIP, val);
}
reg_t mip_csr_t::read() const noexcept {
return val | state->hvip->basic_csr_t::read() | (state->mvip->basic_csr_t::read() & MIP_SEIP);
return val | state->hvip->basic_csr_t::read() | ((state->mvien->read() & MIP_SEIP) ? 0 : (state->mvip->basic_csr_t::read() & MIP_SEIP));
}
void mip_csr_t::backdoor_write_with_mask(const reg_t mask, const reg_t val) noexcept {

Loading…
Cancel
Save