diff --git a/src/mem/protocol/MOESI_AMD_Base-RegionDir.sm b/src/mem/protocol/MOESI_AMD_Base-RegionDir.sm --- a/src/mem/protocol/MOESI_AMD_Base-RegionDir.sm +++ b/src/mem/protocol/MOESI_AMD_Base-RegionDir.sm @@ -492,6 +492,9 @@ } else { out_msg.Acks := 0; } + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } } @@ -519,6 +522,9 @@ } else { out_msg.Acks := 0; } + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } } @@ -549,6 +555,9 @@ } else { out_msg.Acks := 0; } + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } } @@ -580,6 +589,9 @@ } else { out_msg.Acks := 0; } + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } } @@ -767,6 +779,9 @@ out_msg.Requestor := machineID; out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := in_msg.InitialRequestTime; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } } @@ -781,6 +796,9 @@ out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := in_msg.InitialRequestTime; out_msg.NoAckNeeded := true; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } } @@ -794,6 +812,9 @@ out_msg.Requestor := machineID; out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := in_msg.InitialRequestTime; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } } @@ -807,6 +828,9 @@ out_msg.Requestor := machineID; out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := in_msg.InitialRequestTime; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } } @@ -823,6 +847,9 @@ out_msg.InitialRequestTime := tbe.InitialRequestTime; APPEND_TRANSITION_COMMENT("dest: "); APPEND_TRANSITION_COMMENT(out_msg.Destination); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -838,6 +865,9 @@ out_msg.InitialRequestTime := tbe.InitialRequestTime; APPEND_TRANSITION_COMMENT("dest: "); APPEND_TRANSITION_COMMENT(out_msg.Destination); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } diff --git a/src/mem/protocol/MOESI_AMD_Base-dir.sm b/src/mem/protocol/MOESI_AMD_Base-dir.sm --- a/src/mem/protocol/MOESI_AMD_Base-dir.sm +++ b/src/mem/protocol/MOESI_AMD_Base-dir.sm @@ -674,14 +674,14 @@ TBEs.allocate(address); set_tbe(TBEs.lookup(address)); if (in_msg.Type == CoherenceRequestType:WriteThrough) { - tbe.writeMask.clear(); + tbe.writeMask.clear(block_size_bytes); tbe.writeMask.orMask(in_msg.writeMask); tbe.wtData := true; tbe.WTRequestor := in_msg.WTRequestor; tbe.LastSender := in_msg.Requestor; } if (in_msg.Type == CoherenceRequestType:Atomic) { - tbe.writeMask.clear(); + tbe.writeMask.clear(block_size_bytes); tbe.writeMask.orMask(in_msg.writeMask); tbe.atomicData := true; tbe.WTRequestor := in_msg.WTRequestor; diff --git a/src/mem/protocol/MOESI_AMD_Base-probeFilter.sm b/src/mem/protocol/MOESI_AMD_Base-probeFilter.sm --- a/src/mem/protocol/MOESI_AMD_Base-probeFilter.sm +++ b/src/mem/protocol/MOESI_AMD_Base-probeFilter.sm @@ -800,7 +800,7 @@ check_allocate(TBEs); TBEs.allocate(address); set_tbe(TBEs.lookup(address)); - tbe.writeMask.clear(); + tbe.writeMask.clear(block_size_bytes); tbe.wtData := false; tbe.atomicData := false; tbe.DataBlk := getDirectoryEntry(address).DataBlk; // Data only for WBs @@ -814,14 +814,14 @@ TBEs.allocate(address); set_tbe(TBEs.lookup(address)); if (in_msg.Type == CoherenceRequestType:WriteThrough) { - tbe.writeMask.clear(); + tbe.writeMask.clear(block_size_bytes); tbe.writeMask.orMask(in_msg.writeMask); tbe.wtData := true; tbe.WTRequestor := in_msg.WTRequestor; tbe.LastSender := in_msg.Requestor; } if (in_msg.Type == CoherenceRequestType:Atomic) { - tbe.writeMask.clear(); + tbe.writeMask.clear(block_size_bytes); tbe.writeMask.orMask(in_msg.writeMask); tbe.atomicData := true; tbe.WTRequestor := in_msg.WTRequestor; diff --git a/src/mem/protocol/RubySlicc_Exports.sm b/src/mem/protocol/RubySlicc_Exports.sm --- a/src/mem/protocol/RubySlicc_Exports.sm +++ b/src/mem/protocol/RubySlicc_Exports.sm @@ -40,7 +40,7 @@ external_type(Tick, primitive="yes", default="0"); structure(WriteMask, external="yes", desc="...") { - void clear(); + void clear(uint32_t); bool cmpMask(WriteMask); bool isEmpty(); bool isFull(); diff --git a/src/mem/ruby/common/WriteMask.hh b/src/mem/ruby/common/WriteMask.hh --- a/src/mem/ruby/common/WriteMask.hh +++ b/src/mem/ruby/common/WriteMask.hh @@ -34,6 +34,8 @@ #include #include +#include "base/types.hh" +#include "mem/ruby/common/DataBlock.hh" #include "mem/ruby/common/TypeDefines.hh" #include "mem/ruby/system/RubySystem.hh" @@ -41,19 +43,19 @@ { public: WriteMask() - : mSize(RubySystem::getBlockSizeBytes()), mMask(mSize, false), + : mSize(0), mMask(mSize, false), mAtomic(false) {} - WriteMask(int size) + WriteMask(uint32_t size) : mSize(size), mMask(size, false), mAtomic(false) {} - WriteMask(int size, std::vector & mask) + WriteMask(uint32_t size, std::vector & mask) : mSize(size), mMask(mask), mAtomic(false) {} - WriteMask(int size, std::vector &mask, + WriteMask(uint32_t size, std::vector &mask, std::vector > atomicOp) : mSize(size), mMask(mask), mAtomic(true), mAtomicOp(atomicOp) {} @@ -62,8 +64,9 @@ {} void - clear() + clear(int size) { + mSize = size; mMask = std::vector(mSize, false); } @@ -93,8 +96,8 @@ bool getMask(int offset, int len) const { + assert(mSize >= (offset + len)); bool tmp = true; - assert(mSize >= (offset + len)); for (int i = 0; i < len; i++) { tmp = tmp & mMask.at(offset + i); } @@ -104,8 +107,8 @@ bool isOverlap(const WriteMask &readMask) const { + assert(mSize == readMask.mSize); bool tmp = false; - assert(mSize == readMask.mSize); for (int i = 0; i < mSize; i++) { if (readMask.mMask.at(i)) { tmp = tmp | mMask.at(i); @@ -117,8 +120,8 @@ bool cmpMask(const WriteMask &readMask) const { + assert(mSize == readMask.mSize); bool tmp = true; - assert(mSize == readMask.mSize); for (int i = 0; i < mSize; i++) { if (readMask.mMask.at(i)) { tmp = tmp & mMask.at(i); diff --git a/src/mem/protocol/MOESI_AMD_Base-Region-CorePair.sm b/src/mem/protocol/MOESI_AMD_Base-Region-CorePair.sm --- a/src/mem/protocol/MOESI_AMD_Base-Region-CorePair.sm +++ b/src/mem/protocol/MOESI_AMD_Base-Region-CorePair.sm @@ -714,6 +714,9 @@ out_msg.Destination.add(getPeer(machineID)); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -725,6 +728,9 @@ out_msg.Destination.add(getPeer(machineID)); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -736,6 +742,9 @@ out_msg.Destination.add(getPeer(machineID)); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.CtoDSinked := true; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -747,6 +756,9 @@ out_msg.Destination.add(getPeer(machineID)); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -758,6 +770,9 @@ out_msg.Destination.add(getPeer(machineID)); out_msg.CtoDSinked := true; out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -777,6 +792,9 @@ } else { out_msg.Shared := false; } + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -793,6 +811,9 @@ } else { out_msg.Shared := false; } + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -814,6 +835,9 @@ out_msg.Shared := false; } out_msg.Private := true; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -831,6 +855,9 @@ out_msg.Shared := false; } out_msg.Private := true; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -1342,6 +1369,9 @@ out_msg.Requestor := machineID; out_msg.Destination.add(getPeer(machineID)); out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } APPEND_TRANSITION_COMMENT(" Sending ack to r-buf "); } else { diff --git a/src/mem/protocol/MOESI_AMD_Base-Region-dir.sm b/src/mem/protocol/MOESI_AMD_Base-Region-dir.sm --- a/src/mem/protocol/MOESI_AMD_Base-Region-dir.sm +++ b/src/mem/protocol/MOESI_AMD_Base-Region-dir.sm @@ -959,14 +959,14 @@ TBEs.allocate(address); set_tbe(TBEs.lookup(address)); if (in_msg.Type == CoherenceRequestType:WriteThrough) { - tbe.writeMask.clear(); + tbe.writeMask.clear(block_size_bytes); tbe.writeMask.orMask(in_msg.writeMask); tbe.wtData := true; tbe.WTRequestor := in_msg.WTRequestor; tbe.LastSender := in_msg.Requestor; } if (in_msg.Type == CoherenceRequestType:Atomic) { - tbe.writeMask.clear(); + tbe.writeMask.clear(block_size_bytes); tbe.writeMask.orMask(in_msg.writeMask); tbe.atomicData := true; tbe.WTRequestor := in_msg.WTRequestor; @@ -994,14 +994,14 @@ TBEs.allocate(address); set_tbe(TBEs.lookup(address)); if (in_msg.Type == CoherenceRequestType:WriteThrough) { - tbe.writeMask.clear(); + tbe.writeMask.clear(block_size_bytes); tbe.writeMask.orMask(in_msg.writeMask); tbe.wtData := true; tbe.WTRequestor := in_msg.WTRequestor; tbe.LastSender := in_msg.Requestor; } if (in_msg.Type == CoherenceRequestType:Atomic) { - tbe.writeMask.clear(); + tbe.writeMask.clear(block_size_bytes); tbe.writeMask.orMask(in_msg.writeMask); tbe.atomicData := true; tbe.WTRequestor := in_msg.WTRequestor; @@ -1208,6 +1208,9 @@ out_msg.Destination.add(map_Address_to_RegionDir(address)); out_msg.Shared := in_msg.Shared; out_msg.MessageSize := in_msg.MessageSize; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } DPRINTF(RubySlicc, "out dest: %s\n", map_Address_to_RegionDir(address)); } } diff --git a/src/mem/protocol/MOESI_AMD_Base-RegionBuffer.sm b/src/mem/protocol/MOESI_AMD_Base-RegionBuffer.sm --- a/src/mem/protocol/MOESI_AMD_Base-RegionBuffer.sm +++ b/src/mem/protocol/MOESI_AMD_Base-RegionBuffer.sm @@ -502,6 +502,9 @@ if (getState(tbe, cache_entry, address) == State:S) { out_msg.ForceShared := true; } + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } DPRINTF(RubySlicc, "Fwd: %s\n", out_msg); //assert(getState(tbe, cache_entry, address) == State:P || getState(tbe, cache_entry, address) == State:S); if (getState(tbe, cache_entry, address) == State:NP_W) { @@ -593,6 +596,9 @@ // will this always be ok? probably not for multisocket out_msg.Destination.add(map_Address_to_RegionDir(address)); out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } DPRINTF(RubySlicc, "Private request %s\n", out_msg); } cache_entry.ProbeRequestTime := curCycle(); @@ -615,6 +621,9 @@ // will this always be ok? probably not for multisocket out_msg.Destination.add(map_Address_to_RegionDir(address)); out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } cache_entry.ProbeRequestTime := curCycle(); cache_entry.MsgSentToDir := true; @@ -630,6 +639,9 @@ out_msg.Requestor := machineID; out_msg.Destination.add(map_Address_to_RegionDir(address)); // will this always be ok? probably not for multisocket out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } out_msg.Dirty := tbe.dirty; APPEND_TRANSITION_COMMENT(getRegionBase(address)); } @@ -649,6 +661,9 @@ // will this always be ok? probably not for multisocket out_msg.Destination.add(map_Address_to_RegionDir(address)); out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } cache_entry.ProbeRequestTime := curCycle(); cache_entry.MsgSentToDir := true; diff --git a/src/mem/protocol/GPU_VIPER-TCP.sm b/src/mem/protocol/GPU_VIPER-TCP.sm --- a/src/mem/protocol/GPU_VIPER-TCP.sm +++ b/src/mem/protocol/GPU_VIPER-TCP.sm @@ -335,7 +335,7 @@ action(ic_invCache, "ic", desc="invalidate cache") { if(is_valid(cache_entry)) { - cache_entry.writeMask.clear(); + cache_entry.writeMask.clear(block_size_bytes); L1cache.deallocate(address); } unset_cache_entry(); @@ -350,6 +350,9 @@ TCC_select_low_bit, TCC_select_num_bits)); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -395,6 +398,9 @@ TCC_select_low_bit, TCC_select_num_bits)); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } } @@ -409,7 +415,7 @@ out_msg.Requestor := machineID; assert(is_valid(cache_entry)); out_msg.DataBlk := cache_entry.DataBlk; - out_msg.writeMask.clear(); + out_msg.writeMask.clear(block_size_bytes); out_msg.writeMask.orMask(cache_entry.writeMask); out_msg.Destination.add(mapAddressToRange(address,MachineType:TCC, TCC_select_low_bit, TCC_select_num_bits)); @@ -425,7 +431,7 @@ enqueue(requestNetwork_out, CPURequestMsg, issue_latency) { out_msg.addr := address; out_msg.Requestor := machineID; - out_msg.writeMask.clear(); + out_msg.writeMask.clear(block_size_bytes); out_msg.writeMask.orMask(in_msg.writeMask); out_msg.Destination.add(mapAddressToRange(address,MachineType:TCC, TCC_select_low_bit, TCC_select_num_bits)); @@ -441,7 +447,7 @@ if (is_invalid(cache_entry)) { set_cache_entry(L1cache.allocate(address, new Entry)); } - cache_entry.writeMask.clear(); + cache_entry.writeMask.clear(block_size_bytes); } action(t_allocateTBE, "t", desc="allocate TBE Entry") { diff --git a/src/mem/protocol/GPU_VIPER_Region-TCC.sm b/src/mem/protocol/GPU_VIPER_Region-TCC.sm --- a/src/mem/protocol/GPU_VIPER_Region-TCC.sm +++ b/src/mem/protocol/GPU_VIPER_Region-TCC.sm @@ -401,6 +401,9 @@ out_msg.Destination.add(getPeer(machineID)); out_msg.Shared := false; // unneeded for this request out_msg.MessageSize := in_msg.MessageSize; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } DPRINTF(RubySlicc, "%s\n", out_msg); } } @@ -463,7 +466,7 @@ action(a_allocateBlock, "a", desc="allocate TCC block") { if (is_invalid(cache_entry)) { set_cache_entry(L2cache.allocate(address, new Entry)); - cache_entry.writeMask.clear(); + cache_entry.writeMask.clear(block_size_bytes); } } @@ -516,6 +519,9 @@ out_msg.Type := CoherenceRequestType:WriteThrough; out_msg.Dirty := true; out_msg.DataBlk := in_msg.DataBlk; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } out_msg.writeMask.orMask(in_msg.writeMask); } } @@ -531,6 +537,9 @@ out_msg.Type := CoherenceRequestType:WriteThrough; out_msg.Dirty := true; out_msg.DataBlk := cache_entry.DataBlk; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } out_msg.writeMask.orMask(cache_entry.writeMask); } } @@ -545,6 +554,9 @@ out_msg.MessageSize := MessageSizeType:Data; out_msg.Type := CoherenceRequestType:Atomic; out_msg.Dirty := true; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } out_msg.writeMask.orMask(in_msg.writeMask); } } diff --git a/src/mem/protocol/MOESI_AMD_Base-CorePair.sm b/src/mem/protocol/MOESI_AMD_Base-CorePair.sm --- a/src/mem/protocol/MOESI_AMD_Base-CorePair.sm +++ b/src/mem/protocol/MOESI_AMD_Base-CorePair.sm @@ -694,6 +694,9 @@ DPRINTF(RubySlicc,"%s\n",out_msg.Destination); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -705,6 +708,9 @@ out_msg.Destination.add(map_Address_to_Directory(address)); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -716,6 +722,9 @@ out_msg.Destination.add(map_Address_to_Directory(address)); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -735,6 +744,9 @@ } else { out_msg.Shared := false; } + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -751,6 +763,9 @@ } else { out_msg.Shared := false; } + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } diff --git a/src/mem/protocol/MOESI_AMD_Base-L3cache.sm b/src/mem/protocol/MOESI_AMD_Base-L3cache.sm --- a/src/mem/protocol/MOESI_AMD_Base-L3cache.sm +++ b/src/mem/protocol/MOESI_AMD_Base-L3cache.sm @@ -409,6 +409,9 @@ out_msg.Shared := false; // unneeded for this request out_msg.MessageSize := in_msg.MessageSize; DPRINTF(RubySlicc, "%s\n", out_msg); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } } @@ -435,6 +438,9 @@ out_msg.Requestor := machineID; out_msg.Destination.add(map_Address_to_Directory(address)); out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -530,6 +536,9 @@ out_msg.Requestor := machineID; out_msg.Destination.add(map_Address_to_Directory(address)); out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } diff --git a/src/mem/protocol/GPU_RfO-TCCdir.sm b/src/mem/protocol/GPU_RfO-TCCdir.sm --- a/src/mem/protocol/GPU_RfO-TCCdir.sm +++ b/src/mem/protocol/GPU_RfO-TCCdir.sm @@ -767,6 +767,9 @@ out_msg.Requestor := machineID; out_msg.Destination.add(map_Address_to_Directory(address)); out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -777,6 +780,9 @@ out_msg.Requestor := machineID; out_msg.Destination.add(map_Address_to_Directory(address)); out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -787,6 +793,9 @@ out_msg.Requestor := machineID; out_msg.Destination.add(map_Address_to_Directory(address)); out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -827,6 +836,9 @@ out_msg.Shared := false; } out_msg.Dirty := true; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -843,6 +855,9 @@ out_msg.Shared := false; } out_msg.Dirty := false; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -858,6 +873,9 @@ TCC_select_low_bit, TCC_select_num_bits)); out_msg.Shared := in_msg.Shared; out_msg.MessageSize := in_msg.MessageSize; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } APPEND_TRANSITION_COMMENT(" requestor "); APPEND_TRANSITION_COMMENT(in_msg.Requestor); @@ -1175,6 +1193,9 @@ out_msg.Destination.add(map_Address_to_Directory(address)); out_msg.Requestor := machineID; out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } diff --git a/src/mem/protocol/GPU_RfO-TCP.sm b/src/mem/protocol/GPU_RfO-TCP.sm --- a/src/mem/protocol/GPU_RfO-TCP.sm +++ b/src/mem/protocol/GPU_RfO-TCP.sm @@ -372,6 +372,9 @@ TCC_select_low_bit, TCC_select_num_bits)); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -384,6 +387,9 @@ TCC_select_low_bit, TCC_select_num_bits)); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -404,6 +410,9 @@ out_msg.Shared := false; } out_msg.Dirty := cache_entry.Dirty; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -421,6 +430,9 @@ } else { out_msg.Shared := false; } + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } diff --git a/src/mem/protocol/GPU_VIPER-SQC.sm b/src/mem/protocol/GPU_VIPER-SQC.sm --- a/src/mem/protocol/GPU_VIPER-SQC.sm +++ b/src/mem/protocol/GPU_VIPER-SQC.sm @@ -264,6 +264,9 @@ TCC_select_low_bit, TCC_select_num_bits)); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } diff --git a/src/mem/protocol/GPU_VIPER-TCC.sm b/src/mem/protocol/GPU_VIPER-TCC.sm --- a/src/mem/protocol/GPU_VIPER-TCC.sm +++ b/src/mem/protocol/GPU_VIPER-TCC.sm @@ -383,6 +383,9 @@ out_msg.Destination.add(map_Address_to_Directory(address)); out_msg.Shared := false; // unneeded for this request out_msg.MessageSize := in_msg.MessageSize; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } DPRINTF(RubySlicc, "%s\n", out_msg); } } @@ -431,7 +434,7 @@ action(a_allocateBlock, "a", desc="allocate TCC block") { if (is_invalid(cache_entry)) { set_cache_entry(L2cache.allocate(address, new Entry)); - cache_entry.writeMask.clear(); + cache_entry.writeMask.clear(block_size_bytes); } } @@ -484,6 +487,9 @@ out_msg.Type := CoherenceRequestType:WriteThrough; out_msg.Dirty := true; out_msg.DataBlk := in_msg.DataBlk; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } out_msg.writeMask.orMask(in_msg.writeMask); } } @@ -499,6 +505,9 @@ out_msg.Type := CoherenceRequestType:WriteThrough; out_msg.Dirty := true; out_msg.DataBlk := cache_entry.DataBlk; + if (out_msg.writeMask.isEmpty()== true) { + out_msg.writeMask.clear(block_size_bytes); + } out_msg.writeMask.orMask(cache_entry.writeMask); } } @@ -513,6 +522,9 @@ out_msg.MessageSize := MessageSizeType:Data; out_msg.Type := CoherenceRequestType:Atomic; out_msg.Dirty := true; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } out_msg.writeMask.orMask(in_msg.writeMask); } } # Node ID 372b57df72d3d4a25bb64f60a5725dc0faddb8f1 # Parent 065361f6fd531c7bd2fefd8e3d895cfba47d7dcc diff --git a/src/mem/protocol/GPU_RfO-SQC.sm b/src/mem/protocol/GPU_RfO-SQC.sm --- a/src/mem/protocol/GPU_RfO-SQC.sm +++ b/src/mem/protocol/GPU_RfO-SQC.sm @@ -310,6 +310,9 @@ TCC_select_low_bit, TCC_select_num_bits)); out_msg.MessageSize := MessageSizeType:Request_Control; out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -328,6 +331,9 @@ out_msg.Shared := false; } out_msg.InitialRequestTime := curCycle(); + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } diff --git a/src/mem/protocol/GPU_RfO-TCC.sm b/src/mem/protocol/GPU_RfO-TCC.sm --- a/src/mem/protocol/GPU_RfO-TCC.sm +++ b/src/mem/protocol/GPU_RfO-TCC.sm @@ -425,6 +425,9 @@ TCC_select_low_bit, TCC_select_num_bits)); out_msg.Shared := false; // unneeded for this request out_msg.MessageSize := in_msg.MessageSize; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } DPRINTF(RubySlicc, "%s\n", out_msg); } } @@ -454,6 +457,9 @@ out_msg.Destination.add(mapAddressToRange(address,MachineType:TCCdir, TCC_select_low_bit, TCC_select_num_bits)); out_msg.MessageSize := MessageSizeType:Response_Data; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -466,6 +472,9 @@ out_msg.Destination.add(mapAddressToRange(address,MachineType:TCCdir, TCC_select_low_bit, TCC_select_num_bits)); out_msg.MessageSize := MessageSizeType:Response_Data; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } } @@ -571,6 +580,9 @@ out_msg.Destination.add(mapAddressToRange(address,MachineType:TCCdir, TCC_select_low_bit, TCC_select_num_bits)); out_msg.MessageSize := MessageSizeType:Request_Control; + if (out_msg.writeMask.isEmpty() == true) { + out_msg.writeMask.clear(block_size_bytes); + } } }