Skip to content

Commit 8b5cb0f

Browse files
committed
pointer masking: Let HLVX.* instructions not subject to pointer masking
1 parent fb76125 commit 8b5cb0f

File tree

2 files changed

+4
-4
lines changed

2 files changed

+4
-4
lines changed

riscv/mmu.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -613,8 +613,8 @@ void mmu_t::register_memtracer(memtracer_t* t)
613613
tracer.hook(t);
614614
}
615615

616-
reg_t mmu_t::get_pmlen(bool effective_virt, reg_t effective_priv) const {
617-
if (!proc || proc->get_xlen() != 64 || (in_mprv() && (proc->state.sstatus->read() & MSTATUS_MXR)))
616+
reg_t mmu_t::get_pmlen(bool effective_virt, reg_t effective_priv, xlate_flags_t flags) const {
617+
if (!proc || proc->get_xlen() != 64 || (in_mprv() && (proc->state.sstatus->read() & MSTATUS_MXR)) || flags.hlvx)
618618
return 0;
619619

620620
reg_t pmm = 0;
@@ -644,7 +644,7 @@ mem_access_info_t mmu_t::generate_access_info(reg_t addr, access_type type, xlat
644644
mode = get_field(proc->state.hstatus->read(), HSTATUS_SPVP);
645645
}
646646
}
647-
reg_t pmlen = get_pmlen(virt, mode);
647+
reg_t pmlen = get_pmlen(virt, mode, xlate_flags);
648648
reg_t satp = proc->state.satp->readvirt(virt);
649649
bool is_physical_addr = mode == PRV_M || get_field(satp, SATP64_MODE) == SATP_MODE_OFF;
650650
reg_t transformed_addr = is_physical_addr ? zext(addr, 64 - pmlen) : sext(addr, 64 - pmlen);

riscv/mmu.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class mmu_t
7272
std::map<reg_t, reg_t> alloc_cache;
7373
std::vector<std::pair<reg_t, reg_t >> addr_tbl;
7474

75-
reg_t get_pmlen(bool effective_virt, reg_t effective_priv) const;
75+
reg_t get_pmlen(bool effective_virt, reg_t effective_priv, xlate_flags_t flags) const;
7676
mem_access_info_t generate_access_info(reg_t addr, access_type type, xlate_flags_t xlate_flags);
7777

7878
public:

0 commit comments

Comments
 (0)