Browse Source
Only check instruction-fetch data triggers on complete instructions
Signed-off-by: Andrew Waterman <andrew@sifive.com>
pull/2357/head
Andrew Waterman
1 week ago
Failed to extract signature
2 changed files with
7 additions and
9 deletions
-
riscv/mmu.cc
-
riscv/mmu.h
|
|
@ -137,15 +137,7 @@ mmu_t::insn_parcel_t mmu_t::fetch_slow_path(reg_t vaddr) |
|
|
refill_tlb(vaddr, paddr, (char*)host_addr, FETCH); |
|
|
refill_tlb(vaddr, paddr, (char*)host_addr, FETCH); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
auto res = perform_intrapage_fetch(vaddr, host_addr, paddr); |
|
|
return perform_intrapage_fetch(vaddr, host_addr, paddr); |
|
|
|
|
|
|
|
|
if (!check_triggers_fetch) |
|
|
|
|
|
return res; |
|
|
|
|
|
|
|
|
|
|
|
check_triggers(triggers::OPERATION_EXECUTE, vaddr, |
|
|
|
|
|
access_info.effective_virt, sizeof(insn_parcel_t), res); |
|
|
|
|
|
|
|
|
|
|
|
return res; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static reg_t reg_from_bytes(size_t len, const uint8_t* bytes) |
|
|
static reg_t reg_from_bytes(size_t len, const uint8_t* bytes) |
|
|
|
|
|
@ -545,6 +545,12 @@ private: |
|
|
length = insn_length(insn); |
|
|
length = insn_length(insn); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (check_triggers_fetch) { |
|
|
|
|
|
auto access_info = generate_access_info(addr, FETCH, {}); |
|
|
|
|
|
check_triggers(triggers::OPERATION_EXECUTE, addr, |
|
|
|
|
|
access_info.effective_virt, length, insn); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return std::make_tuple(insn, length); |
|
|
return std::make_tuple(insn, length); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|