From 22e97db4c45231a8abd5d05273c77144e8ee026c Mon Sep 17 00:00:00 2001 From: Scott Johnson Date: Mon, 29 Nov 2021 12:33:11 -0800 Subject: Raise guest page fault if GPA is out of range Based on this statement from priv spec 5.5.1 (regarding Sv39x4): "Address bits 63:41 must all be zeros, or else a guest-page-fault exception occurs." --- riscv/mmu.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/riscv/mmu.cc b/riscv/mmu.cc index 906694c..73a36f8 100644 --- a/riscv/mmu.cc +++ b/riscv/mmu.cc @@ -267,9 +267,13 @@ reg_t mmu_t::s2xlate(reg_t gva, reg_t gpa, access_type type, access_type trap_ty if (vm.levels == 0) return gpa; + int maxgpabits = vm.levels * vm.idxbits + vm.widenbits + PGSHIFT; + reg_t maxgpa = (1ULL << maxgpabits) - 1; + bool mxr = proc->state.sstatus->readvirt(false) & MSTATUS_MXR; reg_t base = vm.ptbase; + if ((gpa & ~maxgpa) == 0) { for (int i = vm.levels - 1; i >= 0; i--) { int ptshift = i * vm.idxbits; int idxbits = (i == (vm.levels - 1)) ? vm.idxbits + vm.widenbits : vm.idxbits; @@ -328,6 +332,7 @@ reg_t mmu_t::s2xlate(reg_t gva, reg_t gpa, access_type type, access_type trap_ty return page_base | (gpa & page_mask); } } + } switch (trap_type) { case FETCH: throw trap_instruction_guest_page_fault(gva, gpa >> 2, 0); -- cgit v1.1