summaryrefslogtreecommitdiff
path: root/src/mem/ruby/slicc_interface
diff options
context:
space:
mode:
authorAli Jafri <ali.jafri@arm.com>2015-03-02 04:00:34 -0500
committerAli Jafri <ali.jafri@arm.com>2015-03-02 04:00:34 -0500
commit6ebe8d863ae0c5a7799e9421da32593ac35e1cc7 (patch)
tree4cec332a59408c6a2e7bb031f528cdf894949a5e /src/mem/ruby/slicc_interface
parentde46eeade74746aa4939ce9522b3c50a609f3be5 (diff)
downloadgem5-6ebe8d863ae0c5a7799e9421da32593ac35e1cc7.tar.xz
mem: Fix prefetchSquash + memInhibitAsserted bug
This patch resolves a bug with hardware prefetches. Before a hardware prefetch is sent towards the memory, the system generates a snoop request to check all caches above the prefetch generating cache for the presence of the prefetth target. If the prefetch target is found in the tags or the MSHRs of the upper caches, the cache sets the prefetchSquashed flag in the snoop packet. When the snoop packet returns with the prefetchSquashed flag set, the prefetch generating cache deallocates the MSHR reserved for the prefetch. If the prefetch target is found in the writeback buffer of the upper cache, the cache sets the memInhibit flag, which signals the prefetch generating cache to expect the data from the writeback. When the snoop packet returns with the memInhibitAsserted flag set, it marks the allocated MSHR as inService and waits for the data from the writeback. If the prefetch target is found in multiple upper level caches, specifically in the tags or MSHRs of one upper level cache and the writeback buffer of another, the snoop packet will return with both prefetchSquashed and memInhibitAsserted set, while the current code is not written to handle such an outcome. Current code checks for the prefetchSquashed flag first, if it finds the flag, it deallocates the reserved MSHR. This leads to assert failure when the data from the writeback appears at cache. In this fix, we simply switch the order of checks. We first check for memInhibitAsserted and then for prefetch squashed.
Diffstat (limited to 'src/mem/ruby/slicc_interface')
0 files changed, 0 insertions, 0 deletions