|
|
|
@ -613,8 +613,8 @@ void mmu_t::register_memtracer(memtracer_t* t) |
|
|
|
tracer.hook(t); |
|
|
|
} |
|
|
|
|
|
|
|
reg_t mmu_t::get_pmlen(bool effective_virt, reg_t effective_priv) const { |
|
|
|
if (!proc || proc->get_xlen() != 64 || (in_mprv() && (proc->state.sstatus->read() & MSTATUS_MXR))) |
|
|
|
reg_t mmu_t::get_pmlen(bool effective_virt, reg_t effective_priv, xlate_flags_t flags) const { |
|
|
|
if (!proc || proc->get_xlen() != 64 || (in_mprv() && (proc->state.sstatus->read() & MSTATUS_MXR)) || flags.hlvx) |
|
|
|
return 0; |
|
|
|
|
|
|
|
reg_t pmm = 0; |
|
|
|
@ -644,7 +644,7 @@ mem_access_info_t mmu_t::generate_access_info(reg_t addr, access_type type, xlat |
|
|
|
mode = get_field(proc->state.hstatus->read(), HSTATUS_SPVP); |
|
|
|
} |
|
|
|
} |
|
|
|
reg_t pmlen = get_pmlen(virt, mode); |
|
|
|
reg_t pmlen = get_pmlen(virt, mode, xlate_flags); |
|
|
|
reg_t satp = proc->state.satp->readvirt(virt); |
|
|
|
bool is_physical_addr = mode == PRV_M || get_field(satp, SATP64_MODE) == SATP_MODE_OFF; |
|
|
|
reg_t transformed_addr = is_physical_addr ? zext(addr, 64 - pmlen) : sext(addr, 64 - pmlen); |
|
|
|
|