|
|
|
@ -163,7 +163,7 @@ reg_t mmu_t::walk(reg_t addr, access_type type, reg_t mode) |
|
|
|
if (vm.levels == 0) |
|
|
|
return addr & ((reg_t(2) << (proc->xlen-1))-1); // zero-extend from xlen
|
|
|
|
|
|
|
|
bool supervisor = mode == PRV_S; |
|
|
|
bool s_mode = mode == PRV_S; |
|
|
|
bool sum = get_field(proc->state.mstatus, MSTATUS_SUM); |
|
|
|
bool mxr = get_field(proc->state.mstatus, MSTATUS_MXR); |
|
|
|
|
|
|
|
@ -189,7 +189,7 @@ reg_t mmu_t::walk(reg_t addr, access_type type, reg_t mode) |
|
|
|
|
|
|
|
if (PTE_TABLE(pte)) { // next level of page table
|
|
|
|
base = ppn << PGSHIFT; |
|
|
|
} else if ((pte & PTE_U) ? supervisor && !sum : !supervisor) { |
|
|
|
} else if ((pte & PTE_U) ? s_mode && (type == FETCH || !sum) : !s_mode) { |
|
|
|
break; |
|
|
|
} else if (!(pte & PTE_V) || (!(pte & PTE_R) && (pte & PTE_W))) { |
|
|
|
break; |
|
|
|
|