Skip to content

Commit f710dc7

Browse files
committed
pointer masking: Implement Smnpm (Flush TLB on changing *envcfg.PMM)
1 parent faeef6e commit f710dc7

File tree

2 files changed

+5
-0
lines changed

2 files changed

+5
-0
lines changed

riscv/csrs.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,9 @@ bool envcfg_csr_t::unlogged_write(const reg_t val) noexcept {
981981
const reg_t pmm = get_field(adjusted_val, MENVCFG_PMM);
982982
adjusted_val = set_field(adjusted_val, MENVCFG_PMM, pmm != pmm_reserved ? pmm : 0);
983983

984+
if (get_field(adjusted_val, MENVCFG_PMM) != get_field(read(), MENVCFG_PMM))
985+
proc->get_mmu()->flush_tlb();
986+
984987
return masked_csr_t::unlogged_write(adjusted_val);
985988
}
986989

riscv/mmu.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,8 @@ reg_t mmu_t::get_pmlen(bool effective_virt, reg_t effective_priv, xlate_flags_t
620620
reg_t pmm = 0;
621621
if (effective_priv == PRV_M)
622622
pmm = get_field(proc->state.mseccfg->read(), MSECCFG_PMM);
623+
else if (!effective_virt && (effective_priv == PRV_S || (!proc->extension_enabled('S') && effective_priv == PRV_U)))
624+
pmm = get_field(proc->state.menvcfg->read(), MENVCFG_PMM);
623625

624626
switch (pmm) {
625627
case 2: return 7;

0 commit comments

Comments
 (0)