diff options
author | Andreas Hansson <andreas.hansson@arm.com> | 2015-07-30 03:41:38 -0400 |
---|---|---|
committer | Andreas Hansson <andreas.hansson@arm.com> | 2015-07-30 03:41:38 -0400 |
commit | 41b39b22cd72bb9095d3ee62c95d52597ac09e1e (patch) | |
tree | cc31c2257f89d4115abb1f0248d9a37bc806d256 | |
parent | 222d920d6b5506a549990122578a6d4c5ce8d4bb (diff) | |
download | gem5-41b39b22cd72bb9095d3ee62c95d52597ac09e1e.tar.xz |
mem: Tidy up packet
Some minor fixes and removal of dead code. Changing the flags to be
enums rather than static const (to avoid any linking issues caused by
the latter). Also adding a getBlockAddr member which hopefully can
slowly finds its way into caches, snoop filters etc.
-rw-r--r-- | src/mem/packet.hh | 91 |
1 files changed, 48 insertions, 43 deletions
diff --git a/src/mem/packet.hh b/src/mem/packet.hh index f294cdf29..fe5e10d0a 100644 --- a/src/mem/packet.hh +++ b/src/mem/packet.hh @@ -236,35 +236,41 @@ class Packet : public Printable typedef ::Flags<FlagsType> Flags; private: - static const FlagsType PUBLIC_FLAGS = 0x00000000; - static const FlagsType PRIVATE_FLAGS = 0x00007F0F; - static const FlagsType COPY_FLAGS = 0x0000000F; - static const FlagsType SHARED = 0x00000001; - // Special control flags - /// Special timing-mode atomic snoop for multi-level coherence. - static const FlagsType EXPRESS_SNOOP = 0x00000002; - /// Does supplier have exclusive copy? - /// Useful for multi-level coherence. - static const FlagsType SUPPLY_EXCLUSIVE = 0x00000004; - // Snoop response flags - static const FlagsType MEM_INHIBIT = 0x00000008; - /// Are the 'addr' and 'size' fields valid? - static const FlagsType VALID_ADDR = 0x00000100; - static const FlagsType VALID_SIZE = 0x00000200; - /// Is the data pointer set to a value that shouldn't be freed - /// when the packet is destroyed? - static const FlagsType STATIC_DATA = 0x00001000; - /// The data pointer points to a value that should be freed when - /// the packet is destroyed. The pointer is assumed to be pointing - /// to an array, and delete [] is consequently called - static const FlagsType DYNAMIC_DATA = 0x00002000; - /// suppress the error if this packet encounters a functional - /// access failure. - static const FlagsType SUPPRESS_FUNC_ERROR = 0x00008000; - // Signal block present to squash prefetch and cache evict packets - // through express snoop flag - static const FlagsType BLOCK_CACHED = 0x00010000; + enum : FlagsType { + // Flags to transfer across when copying a packet + COPY_FLAGS = 0x0000000F, + + SHARED = 0x00000001, + // Special control flags + /// Special timing-mode atomic snoop for multi-level coherence. + EXPRESS_SNOOP = 0x00000002, + /// Does supplier have exclusive copy? + /// Useful for multi-level coherence. + SUPPLY_EXCLUSIVE = 0x00000004, + // Snoop response flags + MEM_INHIBIT = 0x00000008, + + /// Are the 'addr' and 'size' fields valid? + VALID_ADDR = 0x00000100, + VALID_SIZE = 0x00000200, + + /// Is the data pointer set to a value that shouldn't be freed + /// when the packet is destroyed? + STATIC_DATA = 0x00001000, + /// The data pointer points to a value that should be freed when + /// the packet is destroyed. The pointer is assumed to be pointing + /// to an array, and delete [] is consequently called + DYNAMIC_DATA = 0x00002000, + + /// suppress the error if this packet encounters a functional + /// access failure. + SUPPRESS_FUNC_ERROR = 0x00008000, + + // Signal block present to squash prefetch and cache evict packets + // through express snoop flag + BLOCK_CACHED = 0x00010000 + }; Flags flags; @@ -298,14 +304,6 @@ class Packet : public Printable unsigned size; /** - * The original value of the command field. Only valid when the - * current command field is an error condition; in that case, the - * previous contents of the command field are copied here. This - * field is *not* set on non-error responses. - */ - MemCmd origCmd; - - /** * Track the bytes found that satisfy a functional read. */ std::vector<bool> bytesValid; @@ -520,7 +518,6 @@ class Packet : public Printable cmd = MemCmd::BadAddressError; } - bool hadBadAddress() const { return cmd == MemCmd::BadAddressError; } void copyError(Packet *pkt) { assert(pkt->isError()); cmd = pkt->cmd; } Addr getAddr() const { assert(flags.isSet(VALID_ADDR)); return addr; } @@ -534,7 +531,16 @@ class Packet : public Printable void setAddr(Addr _addr) { assert(flags.isSet(VALID_ADDR)); addr = _addr; } unsigned getSize() const { assert(flags.isSet(VALID_SIZE)); return size; } - Addr getOffset(int blkSize) const { return getAddr() & (Addr)(blkSize - 1); } + + Addr getOffset(unsigned int blk_size) const + { + return getAddr() & Addr(blk_size - 1); + } + + Addr getBlockAddr(unsigned int blk_size) const + { + return getAddr() & ~(Addr(blk_size - 1)); + } bool isSecure() const { @@ -544,7 +550,7 @@ class Packet : public Printable /** * It has been determined that the SC packet should successfully update - * memory. Therefore, convert this SC packet to a normal write. + * memory. Therefore, convert this SC packet to a normal write. */ void convertScToWrite() @@ -555,8 +561,8 @@ class Packet : public Printable } /** - * When ruby is in use, Ruby will monitor the cache line and thus M5 - * phys memory should treat LL ops as normal reads. + * When ruby is in use, Ruby will monitor the cache line and the + * phys memory should treat LL ops as normal reads. */ void convertLlToRead() @@ -567,7 +573,7 @@ class Packet : public Printable } /** - * Constructor. Note that a Request object must be constructed + * Constructor. Note that a Request object must be constructed * first, but the Requests's physical address and size fields need * not be valid. The command must be supplied. */ @@ -717,7 +723,6 @@ class Packet : public Printable { assert(needsResponse()); assert(isRequest()); - origCmd = cmd; cmd = cmd.responseCommand(); // responses are never express, even if the snoop that |