diff options
Diffstat (limited to 'riscv/mmu.h')
-rw-r--r-- | riscv/mmu.h | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/riscv/mmu.h b/riscv/mmu.h index 715d839..f66eb00 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -318,14 +318,20 @@ private: reg_t vpn = addr >> PGSHIFT; if (likely(tlb_insn_tag[vpn % TLB_ENTRIES] == vpn)) return tlb_data[vpn % TLB_ENTRIES]; + tlb_entry_t result; + if (unlikely(tlb_insn_tag[vpn % TLB_ENTRIES] != (vpn | TLB_CHECK_TRIGGERS))) { + result = fetch_slow_path(addr); + } else { + result = tlb_data[vpn % TLB_ENTRIES]; + } if (unlikely(tlb_insn_tag[vpn % TLB_ENTRIES] == (vpn | TLB_CHECK_TRIGGERS))) { uint16_t* ptr = (uint16_t*)(tlb_data[vpn % TLB_ENTRIES].host_offset + addr); int match = proc->trigger_match(OPERATION_EXECUTE, addr, *ptr); - if (match >= 0) + if (match >= 0) { throw trigger_matched_t(match, OPERATION_EXECUTE, addr, *ptr); - return tlb_data[vpn % TLB_ENTRIES]; + } } - return fetch_slow_path(addr); + return result; } inline const uint16_t* translate_insn_addr_to_host(reg_t addr) { |