summaryrefslogtreecommitdiff
path: root/src/mem/packet.hh
diff options
context:
space:
mode:
authorAndreas Hansson <andreas.hansson@arm.com>2015-12-31 09:33:39 -0500
committerAndreas Hansson <andreas.hansson@arm.com>2015-12-31 09:33:39 -0500
commit7fca994d04230f1e41b9443b33f891460fc5368d (patch)
tree3bd62bc958f5c81b68c3517d3ed3251203790036 /src/mem/packet.hh
parentf1ec326be59b137ff0955b4d80e6516754016fd5 (diff)
downloadgem5-7fca994d04230f1e41b9443b33f891460fc5368d.tar.xz
mem: Do not allocate space for packet data if not needed
This patch looks at the request and response command to determine if either actually has any data payload, and if not, we do not allocate any space for packet data. The only tricky case is where the command type is changed as part of the MSHR functionality. In these cases where the original packet had no data, but the new packet does, we need to explicitly call allocate().
Diffstat (limited to 'src/mem/packet.hh')
-rw-r--r--src/mem/packet.hh15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/mem/packet.hh b/src/mem/packet.hh
index 4614799bf..94508f697 100644
--- a/src/mem/packet.hh
+++ b/src/mem/packet.hh
@@ -508,6 +508,11 @@ class Packet : public Printable
bool isEviction() const { return cmd.isEviction(); }
bool isWriteback() const { return cmd.isWriteback(); }
bool hasData() const { return cmd.hasData(); }
+ bool hasRespData() const
+ {
+ MemCmd resp_cmd = cmd.responseCommand();
+ return resp_cmd.hasData();
+ }
bool isLLSC() const { return cmd.isLLSC(); }
bool isError() const { return cmd.isError(); }
bool isPrint() const { return cmd.isPrint(); }
@@ -1058,9 +1063,13 @@ class Packet : public Printable
void
allocate()
{
- assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA));
- flags.set(DYNAMIC_DATA);
- data = new uint8_t[getSize()];
+ // if either this command or the response command has a data
+ // payload, actually allocate space
+ if (hasData() || hasRespData()) {
+ assert(flags.noneSet(STATIC_DATA|DYNAMIC_DATA));
+ flags.set(DYNAMIC_DATA);
+ data = new uint8_t[getSize()];
+ }
}
/** @} */