Browse Source

pointer masking: Let HLVX.* instructions not subject to pointer masking

pull/1718/head
YenHaoChen 2 years ago
parent
commit
8b5cb0fff2
  1. 6
      riscv/mmu.cc
  2. 2
      riscv/mmu.h

6
riscv/mmu.cc

@ -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);

2
riscv/mmu.h

@ -72,7 +72,7 @@ private:
std::map<reg_t, reg_t> alloc_cache;
std::vector<std::pair<reg_t, reg_t >> addr_tbl;
reg_t get_pmlen(bool effective_virt, reg_t effective_priv) const;
reg_t get_pmlen(bool effective_virt, reg_t effective_priv, xlate_flags_t flags) const;
mem_access_info_t generate_access_info(reg_t addr, access_type type, xlate_flags_t xlate_flags);
public:

Loading…
Cancel
Save