Sascha Bischoff has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/64340?usp=email )

Change subject: mem-cache: masked writes are not whole-line writes
......................................................................

mem-cache: masked writes are not whole-line writes

We now explicitly check in both the cache and the MSHRs if writes are
masked or not before promoting to a whole-line write. Failure to do
this previously was resulting in data loss when dirty data was present
in lower level caches and a coincidentally aligned and
cache-line-sized masked write occured.

Change-Id: I9434590d8b22e4d993167d789eb9d15a2e866bf1
---
M src/mem/cache/mshr.cc
M src/mem/packet.hh
2 files changed, 19 insertions(+), 2 deletions(-)



diff --git a/src/mem/cache/mshr.cc b/src/mem/cache/mshr.cc
index 871125a..b7e9357 100644
--- a/src/mem/cache/mshr.cc
+++ b/src/mem/cache/mshr.cc
@@ -140,6 +140,7 @@
             Request::MEM_SWAP_COND | Request::SECURE | Request::LOCKED_RMW;
         const auto &req_flags = pkt->req->getFlags();
         bool compat_write = !req_flags.isSet(no_merge_flags);
+        bool masked_write = pkt->isMaskedWrite();

         // if this is the first write, it might be a whole
         // line write and even if we can't merge any
@@ -147,7 +148,7 @@
         // it as a whole line write (e.g., SECURE whole line
         // write)
         bool first_write = empty();
-        if (first_write || compat_write) {
+        if (!masked_write && (first_write || compat_write)) {
             auto offset = pkt->getOffset(blkSize);
             auto begin = writesBitmap.begin() + offset;
             std::fill(begin, begin + pkt->getSize(), true);
diff --git a/src/mem/packet.hh b/src/mem/packet.hh
index 7d32634..d69fcd6 100644
--- a/src/mem/packet.hh
+++ b/src/mem/packet.hh
@@ -623,7 +623,8 @@
     bool isWholeLineWrite(unsigned blk_size)
     {
         return (cmd == MemCmd::WriteReq || cmd == MemCmd::WriteLineReq) &&
-            getOffset(blk_size) == 0 && getSize() == blk_size;
+            getOffset(blk_size) == 0 && getSize() == blk_size &&
+            !isMaskedWrite();
     }

     //@{

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/64340?usp=email To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I9434590d8b22e4d993167d789eb9d15a2e866bf1
Gerrit-Change-Number: 64340
Gerrit-PatchSet: 1
Gerrit-Owner: Sascha Bischoff <sascha.bisch...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org

Reply via email to