summaryrefslogtreecommitdiff
path: root/src/cpu/minor/lsq.cc
diff options
context:
space:
mode:
authorKrishnendra Nathella <krinat01@arm.com>2015-07-19 15:03:30 -0500
committerKrishnendra Nathella <krinat01@arm.com>2015-07-19 15:03:30 -0500
commitcabd4768c7186911fda91b9ea458df775b79486a (patch)
treeded7b5edfa8d62f144258f9c8032744a86158d96 /src/cpu/minor/lsq.cc
parentc0d19391d423d16c5dc587c4946e8395b9c0db91 (diff)
downloadgem5-cabd4768c7186911fda91b9ea458df775b79486a.tar.xz
cpu: Fix LLSC atomic CPU wakeup
Writes to locked memory addresses (LLSC) did not wake up the locking CPU. This can lead to deadlocks on multi-core runs. In AtomicSimpleCPU, recvAtomicSnoop was checking if the incoming packet was an invalidation (isInvalidate) and only then handled a locked snoop. But, writes are seen instead of invalidates when running without caches (fast-forward configurations). As as simple fix, now handleLockedSnoop is also called even if the incoming snoop packet are from writes.
Diffstat (limited to 'src/cpu/minor/lsq.cc')
-rw-r--r--src/cpu/minor/lsq.cc4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/cpu/minor/lsq.cc b/src/cpu/minor/lsq.cc
index e644951f8..e0c5796c8 100644
--- a/src/cpu/minor/lsq.cc
+++ b/src/cpu/minor/lsq.cc
@@ -1617,7 +1617,9 @@ LSQ::recvTimingSnoopReq(PacketPtr pkt)
* this action on snoops. */
/* THREAD */
- TheISA::handleLockedSnoop(cpu.getContext(0), pkt, cacheBlockMask);
+ if (pkt->isInvalidate() || pkt->isWrite()) {
+ TheISA::handleLockedSnoop(cpu.getContext(0), pkt, cacheBlockMask);
+ }
}
}