Skip to content

Commit fa368ff

Browse files
committed
Allow TLB hits on LR/SC
1 parent de09e78 commit fa368ff

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

riscv/mmu.cc

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -252,16 +252,17 @@ void mmu_t::load_slow_path_intrapage(reg_t len, uint8_t* bytes, mem_access_info_
252252
{
253253
reg_t vaddr = access_info.vaddr;
254254
auto [tlb_hit, host_addr, paddr] = access_tlb(tlb_load, vaddr, TLB_FLAGS);
255-
if (!tlb_hit || access_info.flags.is_special_access()) {
255+
bool special = access_info.flags.is_special_access() && !access_info.flags.lr;
256+
if (!tlb_hit || special) {
256257
paddr = translate(access_info, len);
257258
host_addr = (uintptr_t)sim->addr_to_mem(paddr);
258259

259-
if (!access_info.flags.is_special_access())
260+
if (!special)
260261
refill_tlb(vaddr, paddr, (char*)host_addr, LOAD);
262+
}
261263

262-
if (access_info.flags.lr && !sim->reservable(paddr)) {
263-
throw trap_load_access_fault(access_info.effective_virt, access_info.transformed_vaddr, 0, 0);
264-
}
264+
if (access_info.flags.lr && !sim->reservable(paddr)) {
265+
throw trap_load_access_fault(access_info.effective_virt, access_info.transformed_vaddr, 0, 0);
265266
}
266267

267268
perform_intrapage_load(vaddr, host_addr, paddr, len, bytes, access_info.flags);

riscv/mmu.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,10 @@ class mmu_t
274274
store_slow_path(vaddr, size, nullptr, {}, false, true);
275275
}
276276

277-
reg_t paddr = translate(generate_access_info(vaddr, STORE, {}), 1);
277+
auto [tlb_hit, host_addr, paddr] = access_tlb(tlb_store, vaddr);
278+
if (!tlb_hit)
279+
paddr = translate(generate_access_info(vaddr, STORE, {}), 1);
280+
278281
if (sim->reservable(paddr))
279282
return load_reservation_address == paddr;
280283
else

0 commit comments

Comments
 (0)