diff options
author | YenHaoChen <howard25336284@gmail.com> | 2024-07-05 16:24:28 +0800 |
---|---|---|
committer | YenHaoChen <howard25336284@gmail.com> | 2024-07-06 03:30:41 +0800 |
commit | f710dc706bbea2f7a9f6812822ed84a4888d1940 (patch) | |
tree | bc8dc060a782a0ae44a4a13e87030543474d6acd | |
parent | faeef6ee149023087798413c90a0eb5930523e9b (diff) | |
download | spike-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.cc | 3 | ||||
-rw-r--r-- | riscv/mmu.cc | 2 |
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; |