aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYenHaoChen <howard25336284@gmail.com>2024-07-05 16:24:28 +0800
committerYenHaoChen <howard25336284@gmail.com>2024-07-06 03:30:41 +0800
commitf710dc706bbea2f7a9f6812822ed84a4888d1940 (patch)
treebc8dc060a782a0ae44a4a13e87030543474d6acd
parentfaeef6ee149023087798413c90a0eb5930523e9b (diff)
downloadspike-f710dc706bbea2f7a9f6812822ed84a4888d1940.zip
spike-f710dc706bbea2f7a9f6812822ed84a4888d1940.tar.gz
spike-f710dc706bbea2f7a9f6812822ed84a4888d1940.tar.bz2
pointer masking: Implement Smnpm (Flush TLB on changing *envcfg.PMM)
-rw-r--r--riscv/csrs.cc3
-rw-r--r--riscv/mmu.cc2
2 files changed, 5 insertions, 0 deletions
diff --git a/riscv/csrs.cc b/riscv/csrs.cc
index 7996082..058e73c 100644
--- a/riscv/csrs.cc
+++ b/riscv/csrs.cc
@@ -981,6 +981,9 @@ bool envcfg_csr_t::unlogged_write(const reg_t val) noexcept {
const reg_t pmm = get_field(adjusted_val, MENVCFG_PMM);
adjusted_val = set_field(adjusted_val, MENVCFG_PMM, pmm != pmm_reserved ? pmm : 0);
+ if (get_field(adjusted_val, MENVCFG_PMM) != get_field(read(), MENVCFG_PMM))
+ proc->get_mmu()->flush_tlb();
+
return masked_csr_t::unlogged_write(adjusted_val);
}
diff --git a/riscv/mmu.cc b/riscv/mmu.cc
index 11794a4..e550a29 100644
--- a/riscv/mmu.cc
+++ b/riscv/mmu.cc
@@ -620,6 +620,8 @@ reg_t mmu_t::get_pmlen(bool effective_virt, reg_t effective_priv, xlate_flags_t
reg_t pmm = 0;
if (effective_priv == PRV_M)
pmm = get_field(proc->state.mseccfg->read(), MSECCFG_PMM);
+ else if (!effective_virt && (effective_priv == PRV_S || (!proc->extension_enabled('S') && effective_priv == PRV_U)))
+ pmm = get_field(proc->state.menvcfg->read(), MENVCFG_PMM);
switch (pmm) {
case 2: return 7;