mem: restructure Packet cmd initialization a bit more
authorSteve Reinhardt <steve.reinhardt@amd.com>
Wed, 11 Feb 2015 18:48:50 +0000 (10:48 -0800)
committerSteve Reinhardt <steve.reinhardt@amd.com>
Wed, 11 Feb 2015 18:48:50 +0000 (10:48 -0800)
Refactor the way that specific MemCmd values are generated for packets.
The new approach is a little more elegant in that we assign the right
value up front, and it's also more amenable to non-heap-allocated
Packet objects.

Also replaced the code in the Minor model that was still doing it the
ad-hoc way.

This is basically a refinement of http://repo.gem5.org/gem5/rev/711eb0e64249.

src/cpu/inorder/resources/cache_unit.cc
src/cpu/inorder/resources/cache_unit.hh
src/cpu/minor/lsq.cc
src/cpu/simple/atomic.cc
src/mem/packet.hh

index f8fa3b0d3365b6addc60a654ac9db29fe0185cf3..78b80350187f77a06db35fbde0d69b5b92b3a33a 100644 (file)
@@ -811,10 +811,17 @@ CacheUnit::finishCacheUnitReq(DynInstPtr inst, CacheRequest *cache_req)
 void
 CacheUnit::buildDataPacket(CacheRequest *cache_req)
 {
-    cache_req->dataPkt = new CacheReqPacket(cache_req,
-                                            cache_req->pktCmd,
+    MemCmd cmd;
+
+    if (cache_req->pktCmd == MemCmd::ReadReq) {
+        cmd = Packet::makeReadCmd(cache_req->memReq);
+    } else {
+        assert(cache_req->pktCmd == MemCmd::WriteReq);
+        cmd = Packet::makeWriteCmd(cache_req->memReq);
+    }
+
+    cache_req->dataPkt = new CacheReqPacket(cache_req, cmd,
                                             cache_req->instIdx);
-    cache_req->dataPkt->refineCommand(); // handle LL/SC, etc.
 
     DPRINTF(InOrderCachePort, "[slot:%i]: Slot marked for %x\n",
             cache_req->getSlot(),
index 65f18eedbceb13595ffba8ae937e5eb0059b404f..11eb9ddadfc6260eced1252674ad8b98396c0245 100644 (file)
@@ -230,7 +230,7 @@ class CacheRequest : public ResourceRequest
     bool isMemAccPending() { return memAccPending; }
 
     //Make this data private/protected!
-    MemCmd::Command pktCmd;
+    MemCmd pktCmd;
     RequestPtr memReq;
     PacketDataPtr reqData;
     CacheReqPacket *dataPkt;
@@ -252,7 +252,7 @@ class CacheReqPacket : public Packet
 {
   public:
     CacheReqPacket(CacheRequest *_req,
-                   Command _cmd, int _idx = 0)
+                   MemCmd _cmd, int _idx = 0)
         : Packet(&(*_req->memReq), _cmd), cacheReq(_req),
           instIdx(_idx), hasSlot(false), reqData(NULL), memReq(NULL)
     {
index 06b6c516589e91bada367238ffb767f8b2e1ec68..ff609deacfea729395e90f3812fc8dbca5993181 100644 (file)
@@ -1545,18 +1545,8 @@ PacketPtr
 makePacketForRequest(Request &request, bool isLoad,
     Packet::SenderState *sender_state, PacketDataPtr data)
 {
-    MemCmd command;
-
-    /* Make a ret with the right command type to match the request */
-    if (request.isLLSC()) {
-        command = (isLoad ? MemCmd::LoadLockedReq : MemCmd::StoreCondReq);
-    } else if (request.isSwap()) {
-        command = MemCmd::SwapReq;
-    } else {
-        command = (isLoad ? MemCmd::ReadReq : MemCmd::WriteReq);
-    }
-
-    PacketPtr ret = new Packet(&request, command);
+    PacketPtr ret = isLoad ? Packet::createRead(&request)
+                           : Packet::createWrite(&request);
 
     if (sender_state)
         ret->pushSenderState(sender_state);
index b564521ba65d61293c093f093e143cd7b73f2eee..007621feb6c5392f1b5f46cdf3b3037c151ecd1c 100644 (file)
@@ -341,8 +341,7 @@ AtomicSimpleCPU::readMem(Addr addr, uint8_t * data,
 
         // Now do the access.
         if (fault == NoFault && !req->getFlags().isSet(Request::NO_ACCESS)) {
-            Packet pkt(req, MemCmd::ReadReq);
-            pkt.refineCommand();
+            Packet pkt(req, Packet::makeReadCmd(req));
             pkt.dataStatic(data);
 
             if (req->isMmappedIpr())
index cb8a5cbf4fdc76d132de1ff6d243c2d0a8f6d5f5..8badc7c73cca14111108f25f1f94add5894cfd24 100644 (file)
@@ -643,45 +643,47 @@ class Packet : public Printable
     }
 
     /**
-     * Change the packet type based on request type.
+     * Generate the appropriate read MemCmd based on the Request flags.
      */
-    void
-    refineCommand()
+    static MemCmd
+    makeReadCmd(const RequestPtr req)
     {
-        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;
-            }
-        }
+        if (req->isLLSC())
+            return MemCmd::LoadLockedReq;
+        else if (req->isPrefetch())
+            return MemCmd::SoftPFReq;
+        else
+            return MemCmd::ReadReq;
+    }
+
+    /**
+     * Generate the appropriate write MemCmd based on the Request flags.
+     */
+    static MemCmd
+    makeWriteCmd(const RequestPtr req)
+    {
+        if (req->isLLSC())
+            return MemCmd::StoreCondReq;
+        else if (req->isSwap())
+            return MemCmd::SwapReq;
+        else
+            return MemCmd::WriteReq;
     }
 
     /**
      * 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.
+     * Fine-tune the MemCmd type if it's not a vanilla read or write.
      */
     static PacketPtr
     createRead(const RequestPtr req)
     {
-        PacketPtr pkt = new Packet(req, MemCmd::ReadReq);
-        pkt->refineCommand();
-        return pkt;
+        return new Packet(req, makeReadCmd(req));
     }
 
     static PacketPtr
     createWrite(const RequestPtr req)
     {
-        PacketPtr pkt = new Packet(req, MemCmd::WriteReq);
-        pkt->refineCommand();
-        return pkt;
+        return new Packet(req, makeWriteCmd(req));
     }
 
     /**