aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYenHaoChen <howard25336284@gmail.com>2024-08-16 15:04:42 +0800
committerYenHaoChen <howard25336284@gmail.com>2024-08-16 15:04:45 +0800
commit38330930daa2d5887d8f163661a18bf6e5378be8 (patch)
tree43806a5f1e10674c2b087cfaa5ed6d92c62a3d86
parentbfe9173c284594cfa73c99eb0bcbd0a4e67d1076 (diff)
downloadriscv-isa-sim-38330930daa2d5887d8f163661a18bf6e5378be8.zip
riscv-isa-sim-38330930daa2d5887d8f163661a18bf6e5378be8.tar.gz
riscv-isa-sim-38330930daa2d5887d8f163661a18bf6e5378be8.tar.bz2
pointer masking: Fix: Let transformed_addr of fetching be unchanged
The transformation does not apply to implicit accesses such as instruction fetches.
-rw-r--r--riscv/mmu.cc9
1 files changed, 5 insertions, 4 deletions
diff --git a/riscv/mmu.cc b/riscv/mmu.cc
index ffbe66d..62e8402 100644
--- a/riscv/mmu.cc
+++ b/riscv/mmu.cc
@@ -643,6 +643,7 @@ mem_access_info_t mmu_t::generate_access_info(reg_t addr, access_type type, xlat
return {addr, addr, 0, false, {}, type};
bool virt = proc->state.v;
reg_t mode = proc->state.prv;
+ reg_t transformed_addr = addr;
if (type != FETCH) {
if (in_mprv()) {
mode = get_field(proc->state.mstatus->read(), MSTATUS_MPP);
@@ -653,10 +654,10 @@ mem_access_info_t mmu_t::generate_access_info(reg_t addr, access_type type, xlat
virt = true;
mode = get_field(proc->state.hstatus->read(), HSTATUS_SPVP);
}
+ 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;
+ transformed_addr = is_physical_addr ? zext(addr, 64 - pmlen) : sext(addr, 64 - pmlen);
}
- 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);
return {addr, transformed_addr, mode, virt, xlate_flags, type};
}