- if (paddr < memsz) {
- memcpy(mem + paddr, bytes, len);
- if (!tracer.interested_in_range(paddr, paddr + PGSIZE, STORE))
- refill_tlb(addr, paddr, STORE);
- } else if (!proc || !proc->sim->mmio_store(addr, len, bytes)) {
+
+ if (!matched_trigger) {
+ reg_t data = reg_from_bytes(len, bytes);
+ matched_trigger = trigger_exception(OPERATION_STORE, addr, data);
+ if (matched_trigger)
+ throw *matched_trigger;
+ }
+
+ if (auto host_addr = sim->addr_to_mem(paddr)) {
+ memcpy(host_addr, bytes, len);
+ if (tracer.interested_in_range(paddr, paddr + PGSIZE, STORE))
+ tracer.trace(paddr, len, STORE);
+ else
+ refill_tlb(addr, paddr, host_addr, STORE);
+ } else if (!sim->mmio_store(paddr, len, bytes)) {