aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Lustig <dlustig@nvidia.com>2021-07-22 07:36:18 -0400
committerDan Lustig <dlustig@nvidia.com>2021-07-22 07:36:18 -0400
commit80be4e21c3af7fe2966788ce538d3e3c3b0d60e3 (patch)
tree45a0cdfc4bcb03ea8f53d1e3c45ddce366ffe0b1
parentcb8f09a4d6fed30527fdd832b885c898b4591a5f (diff)
downloadspike-80be4e21c3af7fe2966788ce538d3e3c3b0d60e3.zip
spike-80be4e21c3af7fe2966788ce538d3e3c3b0d60e3.tar.gz
spike-80be4e21c3af7fe2966788ce538d3e3c3b0d60e3.tar.bz2
Non-leaf PTEs with D/A/U==1 are reserved
...and hence should trigger page faults Thanks to @pdonahue-ventana for pointing this out: https://github.com/riscv/riscv-tests/issues/352
-rw-r--r--riscv/mmu.cc2
1 files changed, 2 insertions, 0 deletions
diff --git a/riscv/mmu.cc b/riscv/mmu.cc
index bc2dcc8..fe96870 100644
--- a/riscv/mmu.cc
+++ b/riscv/mmu.cc
@@ -415,6 +415,8 @@ reg_t mmu_t::walk(reg_t addr, access_type type, reg_t mode, bool virt, bool mxr)
if (pte & PTE_RSVD) {
break;
} else if (PTE_TABLE(pte)) { // next level of page table
+ if (pte & (PTE_D | PTE_A | PTE_U))
+ break;
base = ppn << PGSHIFT;
} else if ((pte & PTE_U) ? s_mode && (type == FETCH || !sum) : !s_mode) {
break;