@@ -643,6 +643,7 @@ mem_access_info_t mmu_t::generate_access_info(reg_t addr, access_type type, xlat
643
643
return {addr, addr, 0 , false , {}, type};
644
644
bool virt = proc->state .v ;
645
645
reg_t mode = proc->state .prv ;
646
+ reg_t transformed_addr = addr;
646
647
if (type != FETCH) {
647
648
if (in_mprv ()) {
648
649
mode = get_field (proc->state .mstatus ->read (), MSTATUS_MPP);
@@ -653,10 +654,11 @@ mem_access_info_t mmu_t::generate_access_info(reg_t addr, access_type type, xlat
653
654
virt = true ;
654
655
mode = get_field (proc->state .hstatus ->read (), HSTATUS_SPVP);
655
656
}
657
+ auto xlen = proc->get_const_xlen ();
658
+ reg_t pmlen = get_pmlen (virt, mode, xlate_flags);
659
+ reg_t satp = proc->state .satp ->readvirt (virt);
660
+ bool is_physical_addr = mode == PRV_M || get_field (satp, SATP64_MODE) == SATP_MODE_OFF;
661
+ transformed_addr = is_physical_addr ? zext (addr, xlen - pmlen) : sext (addr, xlen - pmlen);
656
662
}
657
- reg_t pmlen = get_pmlen (virt, mode, xlate_flags);
658
- reg_t satp = proc->state .satp ->readvirt (virt);
659
- bool is_physical_addr = mode == PRV_M || get_field (satp, SATP64_MODE) == SATP_MODE_OFF;
660
- reg_t transformed_addr = is_physical_addr ? zext (addr, 64 - pmlen) : sext (addr, 64 - pmlen);
661
663
return {addr, transformed_addr, mode, virt, xlate_flags, type};
662
664
}
0 commit comments