Browse Source

Merge pull request #2325 from binno/spmp_fixes

Apply fixes for SPMP extension
pull/2327/head
Andrew Waterman 1 month ago
committed by GitHub
parent
commit
33c1eb2b25
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 3
      disasm/isa_parser.cc
  2. 10
      riscv/csrs.cc
  3. 2
      riscv/processor.cc

3
disasm/isa_parser.cc

@ -150,7 +150,8 @@ static const extension_info_t extension_infos[] = {
{"zkr", {EXT_ZKR}}, {"zkr", {EXT_ZKR}},
{"zkt"}, {"zkt"},
{"smepmp", {EXT_SMEPMP}}, {"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}}, {"sspmpen", {EXT_SSPMPEN}},
{"smstateen", {EXT_SMSTATEEN}}, {"smstateen", {EXT_SMSTATEEN}},
{"smpmpmt", {EXT_SMPMPMT}}, {"smpmpmt", {EXT_SMPMPMT}},

10
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 { bool base_pmpaddr_csr_t::match4(reg_t addr) const noexcept {
if (proc->extension_enabled_const(EXT_SSPMPEN) && (pmpidx+1 >= proc->n_pmp)) { if (proc->extension_enabled_const(EXT_SSPMPEN) && (pmpidx >= proc->n_pmp)) {
if (!((state->spmpen->read() >> pmpidx) & 1)) if (!((state->spmpen->read() >> (pmpidx - proc->n_pmp)) & 1))
return false; 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 { 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 (proc->extension_enabled_const(EXT_SSPMPEN) && (pmpidx >= proc->n_pmp)) {
if (!((state->spmpen->read() >> pmpidx) & 1)) if (!((state->spmpen->read() >> (pmpidx - proc->n_pmp)) & 1))
return false; 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(); const bool has_vs = proc->any_vector_extensions();
return 0 return 0
| (proc->extension_enabled('S') ? (SSTATUS_SIE | SSTATUS_SPIE | SSTATUS_SPP) : 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) | (has_fs ? SSTATUS_FS : 0)
| (proc->any_custom_extensions() ? SSTATUS_XS : 0) | (proc->any_custom_extensions() ? SSTATUS_XS : 0)
| (has_vs ? SSTATUS_VS : 0) | (has_vs ? SSTATUS_VS : 0)

2
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) { for (size_t i = 0; i < (state.max_pmp - n_pmp); ++i) {
state.pmpaddr[n_pmp+i] = std::make_shared<spmpaddr_csr_t>(this, i); state.pmpaddr[n_pmp+i] = std::make_shared<spmpaddr_csr_t>(this, n_pmp+i);
state.mireg[0]->add_ireg_proxy(0x100+i, state.pmpaddr[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]); state.nonvirtual_sireg[0]->add_ireg_proxy(0x100+i, state.pmpaddr[n_pmp+i]);
} }

Loading…
Cancel
Save