- * packet should allocate its own data. */
- Packet(Packet *origPkt, bool clearFlags = false)
- : cmd(origPkt->cmd), req(origPkt->req),
- data(origPkt->staticData ? origPkt->data : NULL),
- staticData(origPkt->staticData),
- dynamicData(false), arrayData(false),
- addr(origPkt->addr), size(origPkt->size),
- src(origPkt->src), dest(origPkt->dest),
- addrSizeValid(origPkt->addrSizeValid),
- srcValid(origPkt->srcValid), destValid(origPkt->destValid),
- flags(clearFlags ? 0 : origPkt->flags),
- time(curTick), senderState(origPkt->senderState)
- {
- }
-
- /** Destructor. */
+ * packet should allocate its own data.
+ */
+ Packet(Packet *pkt, bool clearFlags = false)
+ : cmd(pkt->cmd), req(pkt->req),
+ data(pkt->flags.isSet(STATIC_DATA) ? pkt->data : NULL),
+ addr(pkt->addr), _isSecure(pkt->_isSecure), size(pkt->size),
+ src(pkt->src), dest(pkt->dest),
+ bytesValidStart(pkt->bytesValidStart),
+ bytesValidEnd(pkt->bytesValidEnd),
+ firstWordDelay(pkt->firstWordDelay),
+ lastWordDelay(pkt->lastWordDelay),
+ senderState(pkt->senderState)
+ {
+ if (!clearFlags)
+ flags.set(pkt->flags & COPY_FLAGS);
+
+ flags.set(pkt->flags & (VALID_ADDR|VALID_SIZE));
+ flags.set(pkt->flags & STATIC_DATA);
+ }
+
+ /**
+ * Change the packet type based on request type.
+ */
+ void
+ refineCommand()
+ {
+ if (cmd == MemCmd::ReadReq) {
+ if (req->isLLSC()) {
+ cmd = MemCmd::LoadLockedReq;
+ } else if (req->isPrefetch()) {
+ cmd = MemCmd::SoftPFReq;
+ }
+ } else if (cmd == MemCmd::WriteReq) {
+ if (req->isLLSC()) {
+ cmd = MemCmd::StoreCondReq;
+ } else if (req->isSwap()) {
+ cmd = MemCmd::SwapReq;
+ }
+ }
+ }
+
+ /**
+ * Constructor-like methods that return Packets based on Request objects.
+ * Will call refineCommand() to fine-tune the Packet type if it's not a
+ * vanilla read or write.
+ */
+ static PacketPtr
+ createRead(Request *req)
+ {
+ PacketPtr pkt = new Packet(req, MemCmd::ReadReq);
+ pkt->refineCommand();
+ return pkt;
+ }
+
+ static PacketPtr
+ createWrite(Request *req)
+ {
+ PacketPtr pkt = new Packet(req, MemCmd::WriteReq);
+ pkt->refineCommand();
+ return pkt;
+ }
+
+ /**
+ * clean up packet variables
+ */