summaryrefslogtreecommitdiff
path: root/src/mem/packet.cc
diff options
context:
space:
mode:
authorSteve Reinhardt <stever@gmail.com>2008-01-02 15:22:38 -0800
committerSteve Reinhardt <stever@gmail.com>2008-01-02 15:22:38 -0800
commit6c5a3ab8b28ae14e1f1c37076b7370b37c70de62 (patch)
treed89626ebae1a7b4a14f41fe6b33d01dbcb78bdc2 /src/mem/packet.cc
parentbf9b3821bda5f534a44b176c0ed738a17cb9b80a (diff)
downloadgem5-6c5a3ab8b28ae14e1f1c37076b7370b37c70de62.tar.xz
Add ReadRespWithInvalidate to handle multi-level coherence situation
where we defer a response to a read from a far-away cache A, then later defer a ReadExcl from a cache B on the same bus as us. We'll assert MemInhibit in both cases, but in the latter case MemInhibit will keep the invalidation from reaching cache A. This special response tells cache A that it gets the block to satisfy its read, but must immediately invalidate it. --HG-- extra : convert_revision : f85c8b47bb30232da37ac861b50a6539dc81161b
Diffstat (limited to 'src/mem/packet.cc')
-rw-r--r--src/mem/packet.cc9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/mem/packet.cc b/src/mem/packet.cc
index 164363860..f3bd06f36 100644
--- a/src/mem/packet.cc
+++ b/src/mem/packet.cc
@@ -59,6 +59,9 @@ MemCmd::commandInfo[] =
{ SET3(IsRead, IsRequest, NeedsResponse), ReadResp, "ReadReq" },
/* ReadResp */
{ SET3(IsRead, IsResponse, HasData), InvalidCmd, "ReadResp" },
+ /* ReadRespWithInvalidate */
+ { SET4(IsRead, IsResponse, HasData, IsInvalidate),
+ InvalidCmd, "ReadRespWithInvalidate" },
/* WriteReq */
{ SET5(IsWrite, NeedsExclusive, IsRequest, NeedsResponse, HasData),
WriteResp, "WriteReq" },
@@ -84,19 +87,19 @@ MemCmd::commandInfo[] =
IsRequest, HasData, NeedsResponse),
WriteInvalidateResp, "WriteInvalidateReq" },
/* WriteInvalidateResp */
- { SET4(IsWrite, NeedsExclusive, IsInvalidate, IsResponse),
+ { SET3(IsWrite, NeedsExclusive, IsResponse),
InvalidCmd, "WriteInvalidateResp" },
/* UpgradeReq */
{ SET4(IsInvalidate, NeedsExclusive, IsRequest, NeedsResponse),
UpgradeResp, "UpgradeReq" },
/* UpgradeResp */
- { SET3(IsInvalidate, NeedsExclusive, IsResponse),
+ { SET2(NeedsExclusive, IsResponse),
InvalidCmd, "UpgradeResp" },
/* ReadExReq */
{ SET5(IsRead, NeedsExclusive, IsInvalidate, IsRequest, NeedsResponse),
ReadExResp, "ReadExReq" },
/* ReadExResp */
- { SET5(IsRead, NeedsExclusive, IsInvalidate, IsResponse, HasData),
+ { SET4(IsRead, NeedsExclusive, IsResponse, HasData),
InvalidCmd, "ReadExResp" },
/* LoadLockedReq */
{ SET4(IsRead, IsLocked, IsRequest, NeedsResponse),