diff --git a/disasm/isa_parser.cc b/disasm/isa_parser.cc index 7f5d64c6..b0e93862 100644 --- a/disasm/isa_parser.cc +++ b/disasm/isa_parser.cc @@ -150,7 +150,8 @@ static const extension_info_t extension_infos[] = { {"zkr", {EXT_ZKR}}, {"zkt"}, {"smepmp", {EXT_SMEPMP}}, - {"sspmp", {EXT_SSPMP, EXT_SMPMPDELEG, EXT_SMCSRIND, EXT_SSCSRIND}}, + {"smpmpdeleg", {EXT_SMPMPDELEG}}, + {"sspmp", {EXT_SSPMP, EXT_SMCSRIND, EXT_SSCSRIND}, {"smpmpdeleg"}}, {"sspmpen", {EXT_SSPMPEN}}, {"smstateen", {EXT_SMSTATEEN}}, {"smpmpmt", {EXT_SMPMPMT}}, diff --git a/riscv/csrs.cc b/riscv/csrs.cc index 5fa06810..bbebad06 100644 --- a/riscv/csrs.cc +++ b/riscv/csrs.cc @@ -116,8 +116,8 @@ reg_t base_pmpaddr_csr_t::napot_mask() const noexcept { } bool base_pmpaddr_csr_t::match4(reg_t addr) const noexcept { - if (proc->extension_enabled_const(EXT_SSPMPEN) && (pmpidx+1 >= proc->n_pmp)) { - if (!((state->spmpen->read() >> pmpidx) & 1)) + if (proc->extension_enabled_const(EXT_SSPMPEN) && (pmpidx >= proc->n_pmp)) { + if (!((state->spmpen->read() >> (pmpidx - proc->n_pmp)) & 1)) return false; } @@ -129,8 +129,8 @@ bool base_pmpaddr_csr_t::match4(reg_t addr) const noexcept { } bool base_pmpaddr_csr_t::subset_match(reg_t addr, reg_t len) const noexcept { - if (proc->extension_enabled_const(EXT_SSPMPEN) && (pmpidx+1 >= proc->n_pmp)) { - if (!((state->spmpen->read() >> pmpidx) & 1)) + if (proc->extension_enabled_const(EXT_SSPMPEN) && (pmpidx >= proc->n_pmp)) { + if (!((state->spmpen->read() >> (pmpidx - proc->n_pmp)) & 1)) return false; } @@ -590,7 +590,7 @@ reg_t base_status_csr_t::compute_sstatus_write_mask() const noexcept { const bool has_vs = proc->any_vector_extensions(); return 0 | (proc->extension_enabled('S') ? (SSTATUS_SIE | SSTATUS_SPIE | SSTATUS_SPP) : 0) - | (has_page ? (SSTATUS_SUM | SSTATUS_MXR) : 0) + | (has_page || proc->extension_enabled_const(EXT_SSPMP)? (SSTATUS_SUM | SSTATUS_MXR) : 0) | (has_fs ? SSTATUS_FS : 0) | (proc->any_custom_extensions() ? SSTATUS_XS : 0) | (has_vs ? SSTATUS_VS : 0) diff --git a/riscv/processor.cc b/riscv/processor.cc index 39edccd3..95ceb349 100644 --- a/riscv/processor.cc +++ b/riscv/processor.cc @@ -221,7 +221,7 @@ void processor_t::set_spmp_addr_entry() } for (size_t i = 0; i < (state.max_pmp - n_pmp); ++i) { - state.pmpaddr[n_pmp+i] = std::make_shared(this, i); + state.pmpaddr[n_pmp+i] = std::make_shared(this, n_pmp+i); state.mireg[0]->add_ireg_proxy(0x100+i, state.pmpaddr[n_pmp+i]); state.nonvirtual_sireg[0]->add_ireg_proxy(0x100+i, state.pmpaddr[n_pmp+i]); }