Browse Source

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."
pull/869/head
Scott Johnson 4 years ago
parent
commit
22e97db4c4
No known key found for this signature in database GPG Key ID: 61C1F01D3D1410C9
  1. 5
      riscv/mmu.cc

5
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);

Loading…
Cancel
Save