diff options
author | Andrew Waterman <andrew@sifive.com> | 2020-11-18 18:26:37 -0800 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2020-11-18 18:26:37 -0800 |
commit | ec00b9bc6917078d603a18d10612748b52c2681f (patch) | |
tree | 7b4054e97b7cb079f6b271c4c7ba94ef8176fba7 | |
parent | fce242a5d495db731eee6571916399d10ec531e9 (diff) | |
download | spike-ec00b9bc6917078d603a18d10612748b52c2681f.zip spike-ec00b9bc6917078d603a18d10612748b52c2681f.tar.gz spike-ec00b9bc6917078d603a18d10612748b52c2681f.tar.bz2 |
Invalid NAPOT settings cause page faults, not access exceptions
-rw-r--r-- | riscv/mmu.cc | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/riscv/mmu.cc b/riscv/mmu.cc index de91297..8ed8894 100644 --- a/riscv/mmu.cc +++ b/riscv/mmu.cc @@ -357,7 +357,7 @@ reg_t mmu_t::s2xlate(reg_t gva, reg_t gpa, access_type type, access_type trap_ty int napot_bits = ((pte & PTE_N) ? (clz(ppn) + 1) : 0); if (((pte & PTE_N) && (ppn == 0 || i != 0)) || (napot_bits != 0 && napot_bits != 4)) - throw_access_exception(gva, trap_type); + break; reg_t page_base = ((ppn & ~((reg_t(1) << napot_bits) - 1)) | (vpn & ((reg_t(1) << napot_bits) - 1)) @@ -437,7 +437,7 @@ reg_t mmu_t::walk(reg_t addr, access_type type, reg_t mode, bool virt, bool mxr) int napot_bits = ((pte & PTE_N) ? (clz(ppn) + 1) : 0); if (((pte & PTE_N) && (ppn == 0 || i != 0)) || (napot_bits != 0 && napot_bits != 4)) - throw_access_exception(addr, type); + break; reg_t page_base = ((ppn & ~((reg_t(1) << napot_bits) - 1)) | (vpn & ((reg_t(1) << napot_bits) - 1)) |