From 5a5fb03c77636fd243136b40ade10dbe6a65f9e8 Mon Sep 17 00:00:00 2001 From: Gabriel Busnot Date: Fri, 21 May 2021 11:00:32 +0200 Subject: [PATCH] mem-ruby: Fix wrong test in CHI functional reads MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A bad write mask inclusion test in CHI cache functionalRead and CHI data message functionalRead was causing clean data not to be read in some cases. The issue is detailed in issue GEM5-1002. Change-Id: I91254fa87636e8d22a8b2f27ad375f68f997932d Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/46559 Reviewed-by: Jason Lowe-Power Reviewed-by: Tiago Mück Maintainer: Jason Lowe-Power Tested-by: kokoro --- src/mem/ruby/protocol/chi/CHI-cache-funcs.sm | 2 +- src/mem/ruby/protocol/chi/CHI-msg.sm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mem/ruby/protocol/chi/CHI-cache-funcs.sm b/src/mem/ruby/protocol/chi/CHI-cache-funcs.sm index db008b0abf..40f33ce2f5 100644 --- a/src/mem/ruby/protocol/chi/CHI-cache-funcs.sm +++ b/src/mem/ruby/protocol/chi/CHI-cache-funcs.sm @@ -215,7 +215,7 @@ void functionalRead(Addr addr, Packet *pkt, WriteMask &mask) { WriteMask test_mask := mask; test_mask.orMask(read_mask); - if ((test_mask.cmpMask(mask) == false) || dirty) { + if ((mask.cmpMask(test_mask) == false) || dirty) { if (from_tbe) { if(testAndReadMask(addr, tbe.dataBlk, read_mask, pkt)) { DPRINTF(RubySlicc, "functionalRead tbe %x %s dirty=%d %s %s\n", addr, tbe.dataBlk, tbe.dataDirty, read_mask, mask); diff --git a/src/mem/ruby/protocol/chi/CHI-msg.sm b/src/mem/ruby/protocol/chi/CHI-msg.sm index d51fb76ca9..22fc508711 100644 --- a/src/mem/ruby/protocol/chi/CHI-msg.sm +++ b/src/mem/ruby/protocol/chi/CHI-msg.sm @@ -217,7 +217,7 @@ structure(CHIDataMsg, desc="", interface="Message") { assert(bitMask.isEmpty() == false); WriteMask test_mask := mask; test_mask.orMask(bitMask); - if ((test_mask.cmpMask(mask) == false) || is_dirty) { + if ((mask.cmpMask(test_mask) == false) || is_dirty) { if (testAndReadMask(addr, dataBlk, bitMask, pkt)) { mask.orMask(bitMask); return true;