From c9c14d224879ed73425b28f431ecb5b4757469d0 Mon Sep 17 00:00:00 2001 From: Binno Date: Mon, 1 Jun 2026 23:23:27 -0700 Subject: [PATCH 1/4] Fix error index checking for sspmpen extension Signed-off-by: Binno --- riscv/csrs.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/riscv/csrs.cc b/riscv/csrs.cc index 5fa06810..a2adfa5c 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; } From c04eb689de5c72c8f3d2205ee94956756960da61 Mon Sep 17 00:00:00 2001 From: Binno Date: Thu, 4 Jun 2026 04:05:09 -0700 Subject: [PATCH 2/4] Use SPMP mechanism as satp.mode == Bare with sspmp Signed-off-by: Binno --- riscv/csrs.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/riscv/csrs.cc b/riscv/csrs.cc index a2adfa5c..bbebad06 100644 --- a/riscv/csrs.cc +++ b/riscv/csrs.cc @@ -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) From cf5aa6f8f85194e613604278a01eb9986887a165 Mon Sep 17 00:00:00 2001 From: Binno Date: Wed, 17 Jun 2026 10:47:50 -0700 Subject: [PATCH 3/4] Correct entry index when registering SPMP entry Signed-off-by: Binno --- riscv/processor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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]); } From 02d6fc7b4c4aac7b08e96687014f1ac47f729ef7 Mon Sep 17 00:00:00 2001 From: Binno Date: Wed, 24 Jun 2026 00:28:45 -0700 Subject: [PATCH 4/4] Add smpmpdeleg keyword for smpmpdeleg extension Signed-off-by: Binno --- disasm/isa_parser.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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}},