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
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with
8 additions and
7 deletions
-
disasm/isa_parser.cc
-
riscv/csrs.cc
-
riscv/processor.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}}, |
|
|
|
|
|
|
|
@ -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) |
|
|
|
|
|
|
|
@ -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<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.nonvirtual_sireg[0]->add_ireg_proxy(0x100+i, state.pmpaddr[n_pmp+i]); |
|
|
|
} |
|
|
|
|