diff --git a/riscv/csr_init.cc b/riscv/csr_init.cc index a6c34a6e..9d4bd7a5 100644 --- a/riscv/csr_init.cc +++ b/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(proc, CSR_SRMCFG, srmcfg_mask, 0)); - mvien = std::make_shared(proc, CSR_MVIEN, MIP_SSIP, 0); + mvien = std::make_shared(proc, CSR_MVIEN, MIP_SEIP | MIP_SSIP, 0); mvip = std::make_shared(proc, CSR_MVIP, 0); if (proc->extension_enabled_const(EXT_SMAIA)) { add_csr(CSR_MTOPI, std::make_shared(proc, CSR_MTOPI)); diff --git a/riscv/csrs.cc b/riscv/csrs.cc index 36dcca0c..6bab2346 100644 --- a/riscv/csrs.cc +++ b/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 {