memtest: move check on outstanding requests
authorNilay Vaish <nilay@cs.wisc.edu>
Mon, 15 Oct 2012 22:27:17 +0000 (17:27 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Mon, 15 Oct 2012 22:27:17 +0000 (17:27 -0500)
The Memtest tester allows for only one request to be outstanding for a
particular physical address. The check has been written separately for
reads and writes. This patch moves the check earlier than its current
position so that it need not be written separately for reads and writes.

src/cpu/testers/memtest/memtest.cc
src/cpu/testers/memtest/memtest.hh

index ea3e5fd9b6d6b4e076515aeebe0994056e66d968..37684ec5d86cdb060b0214b4e10fc0a417ce6a83 100644 (file)
@@ -183,7 +183,7 @@ MemTest::completeRequest(PacketPtr pkt)
 
     if (pkt->isError()) {
         if (!suppress_func_warnings) {
-          warn("Functional Access failed for %x at %x\n",
+          warn("Functional %s access failed at %#x\n",
                pkt->isWrite() ? "write" : "read", req->getPaddr());
         }
     } else {
@@ -280,7 +280,6 @@ MemTest::tick()
     access_size = 0;
     dma_access_size = 0;
 
-    Request *req = new Request();
     Request::Flags flags;
     Addr paddr;
 
@@ -290,7 +289,17 @@ MemTest::tick()
     } else  {
         paddr = ((base) ? baseAddr1 : baseAddr2) + offset;
     }
+
+    // For now we only allow one outstanding request per address
+    // per tester This means we assume CPU does write forwarding
+    // to reads that alias something in the cpu store buffer.
+    if (outstandingAddrs.find(paddr) != outstandingAddrs.end()) {
+        return;
+    }
+
     bool do_functional = (random() % 100 < percentFunctional) && !uncacheable;
+    Request *req = new Request();
+    uint8_t *result = new uint8_t[8];
 
     if (issueDmas) {
         paddr &= ~((1 << dma_access_size) - 1);
@@ -303,20 +312,8 @@ MemTest::tick()
     }
     assert(req->getSize() == 1);
 
-    uint8_t *result = new uint8_t[8];
-
     if (cmd < percentReads) {
         // read
-
-        // For now we only allow one outstanding request per address
-        // per tester This means we assume CPU does write forwarding
-        // to reads that alias something in the cpu store buffer.
-        if (outstandingAddrs.find(paddr) != outstandingAddrs.end()) {
-            delete [] result;
-            delete req;
-            return;
-        }
-
         outstandingAddrs.insert(paddr);
 
         // ***** NOTE FOR RON: I'm not sure how to access checkMem. - Kevin
@@ -342,16 +339,6 @@ MemTest::tick()
         }
     } else {
         // write
-
-        // For now we only allow one outstanding request per addreess
-        // per tester.  This means we assume CPU does write forwarding
-        // to reads that alias something in the cpu store buffer.
-        if (outstandingAddrs.find(paddr) != outstandingAddrs.end()) {
-            delete [] result;
-            delete req;
-            return;
-        }
-
         outstandingAddrs.insert(paddr);
 
         DPRINTF(MemTest, "initiating %swrite at addr %x (blk %x) value %x\n",
index cb5f8300fd8f235e212ece4087c5585f72e8b4fd..7052ad42974c110e03832a2a74c6ca9917859ed6 100644 (file)
@@ -190,6 +190,3 @@ class MemTest : public MemObject
 };
 
 #endif // __CPU_MEMTEST_MEMTEST_HH__
-
-
-