aboutsummaryrefslogtreecommitdiff
path: root/riscv/mmu.cc
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2022-10-05 17:17:40 -0700
committerGitHub <noreply@github.com>2022-10-05 17:17:40 -0700
commitcb7e6b840be13ebc46fdcdb23df6db61ff306fde (patch)
tree549393ded86f05531e63f2bc00caf4f5511f504d /riscv/mmu.cc
parent9b074198357b77189df989f0e274b23353f7f528 (diff)
parentab104011ba66fb3c88ce8405236908dc8700c679 (diff)
downloadspike-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.cc25
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);