diff --git a/src/mem/packet.hh b/src/mem/packet.hh --- a/src/mem/packet.hh +++ b/src/mem/packet.hh @@ -153,6 +153,8 @@ IsError, //!< Error response IsPrint, //!< Print state matching address (for debugging) IsFlush, //!< Flush the address from caches + IsAcquire, //!< Acquire operation + IsRelease, //!< Release operation NUM_COMMAND_ATTRIBUTES }; @@ -216,6 +218,8 @@ bool isError() const { return testCmdAttrib(IsError); } bool isPrint() const { return testCmdAttrib(IsPrint); } bool isFlush() const { return testCmdAttrib(IsFlush); } + bool isAcquire() const { return testCmdAttrib(IsAcquire); } + bool isRelease() const { return testCmdAttrib(IsRelease); } const Command responseCommand() const @@ -507,6 +511,8 @@ bool isError() const { return cmd.isError(); } bool isPrint() const { return cmd.isPrint(); } bool isFlush() const { return cmd.isFlush(); } + bool isAcquire() const { return cmd.isAcquire(); } + bool isRelease() const { return cmd.isRelease(); } // Snoop flags void assertMemInhibit() # Node ID 686de3fd198d0ff0d4c3b75e5489d12dde940ae2 # Parent 359d9b3e8dfe8e22884393eab4a2bfa2e47dfdd5 diff --git a/src/mem/packet.cc b/src/mem/packet.cc --- a/src/mem/packet.cc +++ b/src/mem/packet.cc @@ -171,13 +171,13 @@ /* IntResp -- for interrupts */ { SET2(IsWrite, IsResponse), InvalidCmd, "MessageResp" }, /* ReleaseReq -- for release synchronization */ - { SET2(IsRequest, NeedsResponse), ReleaseResp, "ReleaseReq" }, + { SET3(IsRelease, IsRequest, NeedsResponse), ReleaseResp, "ReleaseReq" }, /* ReleaseResp -- for release synchronization */ - { SET1(IsResponse), InvalidCmd, "ReleaseResp" }, + { SET2(IsRelease, IsResponse), InvalidCmd, "ReleaseResp" }, /* AcquireReq -- for release synchronization */ - { SET2(IsRequest, NeedsResponse), AcquireResp, "AcquireReq" }, + { SET3(IsAcquire, IsRequest, NeedsResponse), AcquireResp, "AcquireReq" }, /* AcquireResp -- for release synchronization */ - { SET2(IsResponse, NeedsResponse), InvalidCmd, "AcquireResp" }, + { SET3(IsAcquire, IsResponse, NeedsResponse), InvalidCmd, "AcquireResp" }, /* InvalidDestError -- packet dest field invalid */ { SET2(IsResponse, IsError), InvalidCmd, "InvalidDestError" }, /* BadAddressError -- memory address invalid */ diff --git a/src/mem/request.hh b/src/mem/request.hh --- a/src/mem/request.hh +++ b/src/mem/request.hh @@ -154,6 +154,10 @@ PF_EXCLUSIVE = 0x02000000, /** The request should be marked as LRU. */ EVICT_NEXT = 0x04000000, + /** The request should be marked with ACQUIRE. */ + ACQUIRE = 0x00020000, + /** The request should be marked with RELEASE. */ + RELEASE = 0x00040000, /** * The request should be handled by the generic IPR code (only @@ -655,6 +659,13 @@ bool isMmappedIpr() const { return _flags.isSet(MMAPPED_IPR); } bool isSecure() const { return _flags.isSet(SECURE); } bool isPTWalk() const { return _flags.isSet(PT_WALK); } + bool isAcquire() const { return _flags.isSet(ACQUIRE); } + bool isRelease() const { return _flags.isSet(RELEASE); } + + bool isAcquireRelease() const + { + return _flags.isSet(RELEASE) && _flags.isSet(ACQUIRE); + } }; #endif // __MEM_REQUEST_HH__