diff --git a/riscv/mmu.cc b/riscv/mmu.cc index 285ef6d364..6928e9b276 100644 --- a/riscv/mmu.cc +++ b/riscv/mmu.cc @@ -70,12 +70,10 @@ reg_t mmu_t::translate(mem_access_info_t access_info, reg_t len) tlb_entry_t mmu_t::fetch_slow_path(reg_t vaddr) { - auto access_info = generate_access_info(vaddr, FETCH, {false, false, false}); - check_triggers(triggers::OPERATION_EXECUTE, vaddr, access_info.effective_virt); - tlb_entry_t result; reg_t vpn = vaddr >> PGSHIFT; if (unlikely(tlb_insn_tag[vpn % TLB_ENTRIES] != (vpn | TLB_CHECK_TRIGGERS))) { + auto access_info = generate_access_info(vaddr, FETCH, {false, false, false}); reg_t paddr = translate(access_info, sizeof(fetch_temp)); if (auto host_addr = sim->addr_to_mem(paddr)) { result = refill_tlb(vaddr, paddr, host_addr, FETCH); @@ -88,8 +86,6 @@ tlb_entry_t mmu_t::fetch_slow_path(reg_t vaddr) result = tlb_data[vpn % TLB_ENTRIES]; } - check_triggers(triggers::OPERATION_EXECUTE, vaddr, access_info.effective_virt, from_le(*(const uint16_t*)(result.host_offset + vaddr))); - return result; } diff --git a/riscv/mmu.h b/riscv/mmu.h index ce505275df..e22c579a15 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -290,6 +290,10 @@ class mmu_t if (matched_trigger) throw *matched_trigger; + reg_t vpn = addr >> PGSHIFT; + auto access_info = generate_access_info(addr, FETCH, {false, false, false}); + if (unlikely(tlb_insn_tag[vpn % TLB_ENTRIES] != vpn)) + check_triggers(triggers::OPERATION_EXECUTE, addr, access_info.effective_virt); auto tlb_entry = translate_insn_addr(addr); insn_bits_t insn = from_le(*(uint16_t*)(tlb_entry.host_offset + addr)); int length = insn_length(insn); @@ -307,6 +311,8 @@ class mmu_t insn |= (insn_bits_t)from_le(*(const uint16_t*)translate_insn_addr_to_host(addr + 4)) << 32; insn |= (insn_bits_t)from_le(*(const uint16_t*)translate_insn_addr_to_host(addr + 6)) << 48; } + if (unlikely(tlb_insn_tag[vpn % TLB_ENTRIES] != vpn)) + check_triggers(triggers::OPERATION_EXECUTE, addr, access_info.effective_virt, insn); insn_fetch_t fetch = {proc->decode_insn(insn), insn}; entry->tag = addr;