diff options
author | Andrew Waterman <andrew@sifive.com> | 2022-10-05 17:17:40 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-05 17:17:40 -0700 |
commit | cb7e6b840be13ebc46fdcdb23df6db61ff306fde (patch) | |
tree | 549393ded86f05531e63f2bc00caf4f5511f504d /riscv/mmu.cc | |
parent | 9b074198357b77189df989f0e274b23353f7f528 (diff) | |
parent | ab104011ba66fb3c88ce8405236908dc8700c679 (diff) | |
download | spike-cb7e6b840be13ebc46fdcdb23df6db61ff306fde.zip spike-cb7e6b840be13ebc46fdcdb23df6db61ff306fde.tar.gz spike-cb7e6b840be13ebc46fdcdb23df6db61ff306fde.tar.bz2 |
Merge pull request #1105 from YenHaoChen/pr-trigger-priority
Fix trigger priority
Diffstat (limited to 'riscv/mmu.cc')
-rw-r--r-- | riscv/mmu.cc | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/riscv/mmu.cc b/riscv/mmu.cc index 1028026..367c859 100644 --- a/riscv/mmu.cc +++ b/riscv/mmu.cc @@ -141,6 +141,13 @@ bool mmu_t::mmio_store(reg_t addr, size_t len, const uint8_t* bytes) void mmu_t::load_slow_path(reg_t addr, reg_t len, uint8_t* bytes, uint32_t xlate_flags) { + if (!matched_trigger) { + reg_t data = reg_from_bytes(len, bytes); + matched_trigger = trigger_exception(triggers::OPERATION_LOAD, addr, false); + if (matched_trigger) + throw *matched_trigger; + } + reg_t paddr = translate(addr, len, LOAD, xlate_flags); if (auto host_addr = sim->addr_to_mem(paddr)) { @@ -155,7 +162,7 @@ void mmu_t::load_slow_path(reg_t addr, reg_t len, uint8_t* bytes, uint32_t xlate if (!matched_trigger) { reg_t data = reg_from_bytes(len, bytes); - matched_trigger = trigger_exception(triggers::OPERATION_LOAD, addr, data); + matched_trigger = trigger_exception(triggers::OPERATION_LOAD, addr, true, data); if (matched_trigger) throw *matched_trigger; } @@ -163,15 +170,17 @@ void mmu_t::load_slow_path(reg_t addr, reg_t len, uint8_t* bytes, uint32_t xlate void mmu_t::store_slow_path(reg_t addr, reg_t len, const uint8_t* bytes, uint32_t xlate_flags, bool actually_store) { - reg_t paddr = translate(addr, len, STORE, xlate_flags); - - if (!matched_trigger) { - reg_t data = reg_from_bytes(len, bytes); - matched_trigger = trigger_exception(triggers::OPERATION_STORE, addr, data); - if (matched_trigger) - throw *matched_trigger; + if (actually_store) { + if (!matched_trigger) { + reg_t data = reg_from_bytes(len, bytes); + matched_trigger = trigger_exception(triggers::OPERATION_STORE, addr, true, data); + if (matched_trigger) + throw *matched_trigger; + } } + reg_t paddr = translate(addr, len, STORE, xlate_flags); + if (actually_store) { if (auto host_addr = sim->addr_to_mem(paddr)) { memcpy(host_addr, bytes, len); |