Browse Source

Allow TLB hits on LR/SC

pull/2151/head
Andrew Waterman 5 months ago
parent
commit
fa368ff7ed
  1. 11
      riscv/mmu.cc
  2. 5
      riscv/mmu.h

11
riscv/mmu.cc

@ -252,16 +252,17 @@ void mmu_t::load_slow_path_intrapage(reg_t len, uint8_t* bytes, mem_access_info_
{
reg_t vaddr = access_info.vaddr;
auto [tlb_hit, host_addr, paddr] = access_tlb(tlb_load, vaddr, TLB_FLAGS);
if (!tlb_hit || access_info.flags.is_special_access()) {
bool special = access_info.flags.is_special_access() && !access_info.flags.lr;
if (!tlb_hit || special) {
paddr = translate(access_info, len);
host_addr = (uintptr_t)sim->addr_to_mem(paddr);
if (!access_info.flags.is_special_access())
if (!special)
refill_tlb(vaddr, paddr, (char*)host_addr, LOAD);
}
if (access_info.flags.lr && !sim->reservable(paddr)) {
throw trap_load_access_fault(access_info.effective_virt, access_info.transformed_vaddr, 0, 0);
}
if (access_info.flags.lr && !sim->reservable(paddr)) {
throw trap_load_access_fault(access_info.effective_virt, access_info.transformed_vaddr, 0, 0);
}
perform_intrapage_load(vaddr, host_addr, paddr, len, bytes, access_info.flags);

5
riscv/mmu.h

@ -274,7 +274,10 @@ public:
store_slow_path(vaddr, size, nullptr, {}, false, true);
}
reg_t paddr = translate(generate_access_info(vaddr, STORE, {}), 1);
auto [tlb_hit, host_addr, paddr] = access_tlb(tlb_store, vaddr);
if (!tlb_hit)
paddr = translate(generate_access_info(vaddr, STORE, {}), 1);
if (sim->reservable(paddr))
return load_reservation_address == paddr;
else

Loading…
Cancel
Save