From 38330930daa2d5887d8f163661a18bf6e5378be8 Mon Sep 17 00:00:00 2001 From: YenHaoChen Date: Fri, 16 Aug 2024 15:04:42 +0800 Subject: [PATCH 1/2] pointer masking: Fix: Let transformed_addr of fetching be unchanged The transformation does not apply to implicit accesses such as instruction fetches. --- riscv/mmu.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/riscv/mmu.cc b/riscv/mmu.cc index ffbe66dce..62e8402d3 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}; } From 0648ab40fc0742a8dbdbfbf82d71bbe0a3385317 Mon Sep 17 00:00:00 2001 From: YenHaoChen Date: Sun, 18 Aug 2024 10:07:45 +0800 Subject: [PATCH 2/2] pointer masking: refactor: Use xlen to avoid sketchy, hardcoded number 64 --- riscv/mmu.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/riscv/mmu.cc b/riscv/mmu.cc index 62e8402d3..5d3454163 100644 --- a/riscv/mmu.cc +++ b/riscv/mmu.cc @@ -654,10 +654,11 @@ 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); } + auto xlen = proc->get_const_xlen(); 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); + transformed_addr = is_physical_addr ? zext(addr, xlen - pmlen) : sext(addr, xlen - pmlen); } return {addr, transformed_addr, mode, virt, xlate_flags, type}; }