Browse Source
Correctly check for misalignment on SC/AMO
pull/2266/head
Andrew Waterman
1 month ago
Failed to extract signature
1 changed files with
2 additions and
1 deletions
-
riscv/mmu.cc
|
|
@ -377,8 +377,9 @@ void mmu_t::store_slow_path(reg_t original_addr, std::size_t len, |
|
|
auto [tlb_hit, host_addr, paddr] = access_tlb(tlb_store, original_addr, TLB_FLAGS & ~TLB_CHECK_TRIGGERS); |
|
|
auto [tlb_hit, host_addr, paddr] = access_tlb(tlb_store, original_addr, TLB_FLAGS & ~TLB_CHECK_TRIGGERS); |
|
|
bool intrapage = (original_addr % PGSIZE) + len <= PGSIZE; |
|
|
bool intrapage = (original_addr % PGSIZE) + len <= PGSIZE; |
|
|
bool aligned = (original_addr & (len - 1)) == 0; |
|
|
bool aligned = (original_addr & (len - 1)) == 0; |
|
|
|
|
|
bool misaligned_ok = !require_alignment && intrapage && is_misaligned_enabled(); |
|
|
|
|
|
|
|
|
if (likely(tlb_hit && (aligned || (intrapage && is_misaligned_enabled())))) { |
|
|
if (likely(tlb_hit && (aligned || misaligned_ok))) { |
|
|
if (actually_store) |
|
|
if (actually_store) |
|
|
perform_intrapage_store(original_addr, host_addr, paddr, len, bytes, xlate_flags); |
|
|
perform_intrapage_store(original_addr, host_addr, paddr, len, bytes, xlate_flags); |
|
|
return; |
|
|
return; |
|
|
|