mem-cache: Fix setting prefetch bit
[gem5.git] / src / mem / abstract_mem.cc
index 678527e69e9615e8b88fc8974479c7ff1e7458c8..7e098327a66241ff054841281b0c1f216229955e 100644 (file)
@@ -45,7 +45,6 @@
 #include "arch/locked_mem.hh"
 #include "base/loader/memory_image.hh"
 #include "base/loader/object_file.hh"
-#include "cpu/base.hh"
 #include "cpu/thread_context.hh"
 #include "debug/LLSC.hh"
 #include "debug/MemoryAccess.hh"
 
 using namespace std;
 
-AbstractMemory::AbstractMemory(const Params *p) :
-    ClockedObject(p), range(params()->range), pmemAddr(NULL),
-    backdoor(params()->range, nullptr,
+AbstractMemory::AbstractMemory(const Params &p) :
+    ClockedObject(p), range(p.range), pmemAddr(NULL),
+    backdoor(params().range, nullptr,
              (MemBackdoor::Flags)(MemBackdoor::Readable |
                                   MemBackdoor::Writeable)),
-    confTableReported(p->conf_table_reported), inAddrMap(p->in_addr_map),
-    kvmMap(p->kvm_map), _system(NULL),
+    confTableReported(p.conf_table_reported), inAddrMap(p.in_addr_map),
+    kvmMap(p.kvm_map), _system(NULL),
     stats(*this)
 {
     panic_if(!range.valid() || !range.size(),
@@ -73,16 +72,14 @@ AbstractMemory::initState()
 {
     ClockedObject::initState();
 
-    const auto &file = params()->image_file;
+    const auto &file = params().image_file;
     if (file == "")
         return;
 
     auto *object = Loader::createObjectFile(file, true);
     fatal_if(!object, "%s: Could not load %s.", name(), file);
 
-    panic_if(!object->loadGlobalSymbols(&Loader::debugSymbolTable),
-             "%s: Could not load symbols from %s.", name(), file);
-
+    Loader::debugSymbolTable.insert(*object->symtab().globals());
     Loader::MemoryImage image = object->buildImage();
 
     AddrRange image_range(image.minAddr(), image.maxAddr());
@@ -95,7 +92,8 @@ AbstractMemory::initState()
     panic_if(!image_range.isSubset(range), "%s: memory image %s doesn't fit.",
              name(), file);
 
-    PortProxy proxy([this](PacketPtr pkt) { functionalAccess(pkt); }, size());
+    PortProxy proxy([this](PacketPtr pkt) { functionalAccess(pkt); },
+                    system()->cacheLineSize());
 
     panic_if(!image.write(proxy), "%s: Unable to write image.");
 }
@@ -147,54 +145,54 @@ AbstractMemory::MemStats::regStats()
 
     System *sys = mem.system();
     assert(sys);
-    const auto max_masters = sys->maxMasters();
+    const auto max_requestors = sys->maxRequestors();
 
     bytesRead
-        .init(max_masters)
+        .init(max_requestors)
         .flags(total | nozero | nonan)
         ;
-    for (int i = 0; i < max_masters; i++) {
-        bytesRead.subname(i, sys->getMasterName(i));
+    for (int i = 0; i < max_requestors; i++) {
+        bytesRead.subname(i, sys->getRequestorName(i));
     }
 
     bytesInstRead
-        .init(max_masters)
+        .init(max_requestors)
         .flags(total | nozero | nonan)
         ;
-    for (int i = 0; i < max_masters; i++) {
-        bytesInstRead.subname(i, sys->getMasterName(i));
+    for (int i = 0; i < max_requestors; i++) {
+        bytesInstRead.subname(i, sys->getRequestorName(i));
     }
 
     bytesWritten
-        .init(max_masters)
+        .init(max_requestors)
         .flags(total | nozero | nonan)
         ;
-    for (int i = 0; i < max_masters; i++) {
-        bytesWritten.subname(i, sys->getMasterName(i));
+    for (int i = 0; i < max_requestors; i++) {
+        bytesWritten.subname(i, sys->getRequestorName(i));
     }
 
     numReads
-        .init(max_masters)
+        .init(max_requestors)
         .flags(total | nozero | nonan)
         ;
-    for (int i = 0; i < max_masters; i++) {
-        numReads.subname(i, sys->getMasterName(i));
+    for (int i = 0; i < max_requestors; i++) {
+        numReads.subname(i, sys->getRequestorName(i));
     }
 
     numWrites
-        .init(max_masters)
+        .init(max_requestors)
         .flags(total | nozero | nonan)
         ;
-    for (int i = 0; i < max_masters; i++) {
-        numWrites.subname(i, sys->getMasterName(i));
+    for (int i = 0; i < max_requestors; i++) {
+        numWrites.subname(i, sys->getRequestorName(i));
     }
 
     numOther
-        .init(max_masters)
+        .init(max_requestors)
         .flags(total | nozero | nonan)
         ;
-    for (int i = 0; i < max_masters; i++) {
-        numOther.subname(i, sys->getMasterName(i));
+    for (int i = 0; i < max_requestors; i++) {
+        numOther.subname(i, sys->getRequestorName(i));
     }
 
     bwRead
@@ -202,8 +200,8 @@ AbstractMemory::MemStats::regStats()
         .prereq(bytesRead)
         .flags(total | nozero | nonan)
         ;
-    for (int i = 0; i < max_masters; i++) {
-        bwRead.subname(i, sys->getMasterName(i));
+    for (int i = 0; i < max_requestors; i++) {
+        bwRead.subname(i, sys->getRequestorName(i));
     }
 
     bwInstRead
@@ -211,8 +209,8 @@ AbstractMemory::MemStats::regStats()
         .prereq(bytesInstRead)
         .flags(total | nozero | nonan)
         ;
-    for (int i = 0; i < max_masters; i++) {
-        bwInstRead.subname(i, sys->getMasterName(i));
+    for (int i = 0; i < max_requestors; i++) {
+        bwInstRead.subname(i, sys->getRequestorName(i));
     }
 
     bwWrite
@@ -220,8 +218,8 @@ AbstractMemory::MemStats::regStats()
         .prereq(bytesWritten)
         .flags(total | nozero | nonan)
         ;
-    for (int i = 0; i < max_masters; i++) {
-        bwWrite.subname(i, sys->getMasterName(i));
+    for (int i = 0; i < max_requestors; i++) {
+        bwWrite.subname(i, sys->getRequestorName(i));
     }
 
     bwTotal
@@ -229,8 +227,8 @@ AbstractMemory::MemStats::regStats()
         .prereq(bwTotal)
         .flags(total | nozero | nonan)
         ;
-    for (int i = 0; i < max_masters; i++) {
-        bwTotal.subname(i, sys->getMasterName(i));
+    for (int i = 0; i < max_requestors; i++) {
+        bwTotal.subname(i, sys->getRequestorName(i));
     }
 
     bwRead = bytesRead / simSeconds;
@@ -271,6 +269,7 @@ AbstractMemory::trackLoadLocked(PacketPtr pkt)
     DPRINTF(LLSC, "Adding lock record: context %d addr %#x\n",
             req->contextId(), paddr);
     lockedAddrList.push_front(LockedAddr(req));
+    backdoor.invalidate();
 }
 
 
@@ -326,11 +325,11 @@ AbstractMemory::checkLockedAddrList(PacketPtr pkt)
                         i->contextId, paddr);
                 ContextID owner_cid = i->contextId;
                 assert(owner_cid != InvalidContextID);
-                ContextID requester_cid = req->hasContextId() ?
+                ContextID requestor_cid = req->hasContextId() ?
                                            req->contextId() :
                                            InvalidContextID;
-                if (owner_cid != requester_cid) {
-                    ThreadContext* ctx = system()->getThreadContext(owner_cid);
+                if (owner_cid != requestor_cid) {
+                    ThreadContext* ctx = system()->threads[owner_cid];
                     TheISA::globalClearExclusive(ctx);
                 }
                 i = lockedAddrList.erase(i);
@@ -348,17 +347,17 @@ static inline void
 tracePacket(System *sys, const char *label, PacketPtr pkt)
 {
     int size = pkt->getSize();
-#if THE_ISA != NULL_ISA
     if (size == 1 || size == 2 || size == 4 || size == 8) {
-        DPRINTF(MemoryAccess,"%s from %s of size %i on address %#x data "
-                "%#x %c\n", label, sys->getMasterName(pkt->req->masterId()),
-                size, pkt->getAddr(), pkt->getUintX(TheISA::GuestByteOrder),
+        ByteOrder byte_order = sys->getGuestByteOrder();
+        DPRINTF(MemoryAccess, "%s from %s of size %i on address %#x data "
+                "%#x %c\n", label, sys->getRequestorName(pkt->req->
+                requestorId()), size, pkt->getAddr(),
+                size, pkt->getAddr(), pkt->getUintX(byte_order),
                 pkt->req->isUncacheable() ? 'U' : 'C');
         return;
     }
-#endif
     DPRINTF(MemoryAccess, "%s from %s of size %i on address %#x %c\n",
-            label, sys->getMasterName(pkt->req->masterId()),
+            label, sys->getRequestorName(pkt->req->requestorId()),
             size, pkt->getAddr(), pkt->req->isUncacheable() ? 'U' : 'C');
     DDUMP(MemoryAccess, pkt->getConstPtr<uint8_t>(), pkt->getSize());
 }
@@ -425,7 +424,7 @@ AbstractMemory::access(PacketPtr pkt)
 
             assert(!pkt->req->isInstFetch());
             TRACE_PACKET("Read/Write");
-            stats.numOther[pkt->req->masterId()]++;
+            stats.numOther[pkt->req->requestorId()]++;
         }
     } else if (pkt->isRead()) {
         assert(!pkt->isWrite());
@@ -439,10 +438,10 @@ AbstractMemory::access(PacketPtr pkt)
             pkt->setData(host_addr);
         }
         TRACE_PACKET(pkt->req->isInstFetch() ? "IFetch" : "Read");
-        stats.numReads[pkt->req->masterId()]++;
-        stats.bytesRead[pkt->req->masterId()] += pkt->getSize();
+        stats.numReads[pkt->req->requestorId()]++;
+        stats.bytesRead[pkt->req->requestorId()] += pkt->getSize();
         if (pkt->req->isInstFetch())
-            stats.bytesInstRead[pkt->req->masterId()] += pkt->getSize();
+            stats.bytesInstRead[pkt->req->requestorId()] += pkt->getSize();
     } else if (pkt->isInvalidate() || pkt->isClean()) {
         assert(!pkt->isWrite());
         // in a fastmem system invalidating and/or cleaning packets
@@ -458,8 +457,8 @@ AbstractMemory::access(PacketPtr pkt)
             }
             assert(!pkt->req->isInstFetch());
             TRACE_PACKET("Write");
-            stats.numWrites[pkt->req->masterId()]++;
-            stats.bytesWritten[pkt->req->masterId()] += pkt->getSize();
+            stats.numWrites[pkt->req->requestorId()]++;
+            stats.bytesWritten[pkt->req->requestorId()] += pkt->getSize();
         }
     } else {
         panic("Unexpected packet %s", pkt->print());