aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--riscv/mmu.cc14
1 files changed, 12 insertions, 2 deletions
diff --git a/riscv/mmu.cc b/riscv/mmu.cc
index 30fc47a..b080697 100644
--- a/riscv/mmu.cc
+++ b/riscv/mmu.cc
@@ -369,8 +369,18 @@ void mmu_t::store_slow_path(reg_t original_addr, reg_t len, const uint8_t* bytes
store_slow_path_intrapage(len, bytes, access_info, actually_store);
}
- if (actually_store && proc && unlikely(proc->get_log_commits_enabled()))
- proc->state.log_mem_write.push_back(std::make_tuple(original_addr, reg_from_bytes(len, bytes), len));
+ if (actually_store && proc && unlikely(proc->get_log_commits_enabled())) {
+ // amocas.q sends len == 16, reg_from_bytes only supports up to 8
+ // bytes per conversion. Make multiple entries in the log
+ reg_t offset = 0;
+ const auto reg_size = sizeof(reg_t);
+ while (unlikely(len > reg_size)) {
+ proc->state.log_mem_write.push_back(std::make_tuple(original_addr + offset, reg_from_bytes(reg_size, bytes + offset), reg_size));
+ offset += reg_size;
+ len -= reg_size;
+ }
+ proc->state.log_mem_write.push_back(std::make_tuple(original_addr + offset, reg_from_bytes(len, bytes + offset), len));
+ }
}
tlb_entry_t mmu_t::refill_tlb(reg_t vaddr, reg_t paddr, char* host_addr, access_type type)