summaryrefslogtreecommitdiff
path: root/src/mem/abstract_mem.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/abstract_mem.hh')
-rw-r--r--src/mem/abstract_mem.hh104
1 files changed, 72 insertions, 32 deletions
diff --git a/src/mem/abstract_mem.hh b/src/mem/abstract_mem.hh
index 66d4a1f16..d6d33c8ee 100644
--- a/src/mem/abstract_mem.hh
+++ b/src/mem/abstract_mem.hh
@@ -57,6 +57,43 @@
class System;
/**
+ * Locked address class that represents a physical address and a
+ * context id.
+ */
+class LockedAddr {
+
+ private:
+
+ // on alpha, minimum LL/SC granularity is 16 bytes, so lower
+ // bits need to masked off.
+ static const Addr Addr_Mask = 0xf;
+
+ public:
+
+ // locked address
+ Addr addr;
+
+ // locking hw context
+ const int contextId;
+
+ static Addr mask(Addr paddr) { return (paddr & ~Addr_Mask); }
+
+ // check for matching execution context
+ bool matchesContext(Request *req) const
+ {
+ return (contextId == req->contextId());
+ }
+
+ LockedAddr(Request *req) : addr(mask(req->getPaddr())),
+ contextId(req->contextId())
+ {}
+
+ // constructor for unserialization use
+ LockedAddr(Addr _addr, int _cid) : addr(_addr), contextId(_cid)
+ {}
+};
+
+/**
* An abstract memory represents a contiguous block of physical
* memory, with an associated address range, and also provides basic
* functionality for reading and writing this memory without any
@@ -79,34 +116,6 @@ class AbstractMemory : public MemObject
// Should the memory appear in the global address map
bool inAddrMap;
- class LockedAddr {
-
- public:
- // on alpha, minimum LL/SC granularity is 16 bytes, so lower
- // bits need to masked off.
- static const Addr Addr_Mask = 0xf;
-
- static Addr mask(Addr paddr) { return (paddr & ~Addr_Mask); }
-
- Addr addr; // locked address
- int contextId; // locking hw context
-
- // check for matching execution context
- bool matchesContext(Request *req)
- {
- return (contextId == req->contextId());
- }
-
- LockedAddr(Request *req) : addr(mask(req->getPaddr())),
- contextId(req->contextId())
- {
- }
- // constructor for unserialization use
- LockedAddr(Addr _addr, int _cid) : addr(_addr), contextId(_cid)
- {
- }
- };
-
std::list<LockedAddr> lockedAddrList;
// helper function for checkLockedAddrs(): we really want to
@@ -183,7 +192,41 @@ class AbstractMemory : public MemObject
typedef AbstractMemoryParams Params;
AbstractMemory(const Params* p);
- virtual ~AbstractMemory();
+ virtual ~AbstractMemory() {}
+
+ /**
+ * See if this is a null memory that should never store data and
+ * always return zero.
+ *
+ * @return true if null
+ */
+ bool isNull() const { return params()->null; }
+
+ /**
+ * See if this memory should be initialized to zero or not.
+ *
+ * @return true if zero
+ */
+ bool initToZero() const { return params()->zero; }
+
+ /**
+ * Set the host memory backing store to be used by this memory
+ * controller.
+ *
+ * @param pmem_addr Pointer to a segment of host memory
+ */
+ void setBackingStore(uint8_t* pmem_addr);
+
+ /**
+ * Get the list of locked addresses to allow checkpointing.
+ */
+ const std::list<LockedAddr>& getLockedAddrList() const
+ { return lockedAddrList; }
+
+ /**
+ * Add a locked address to allow for checkpointing.
+ */
+ void addLockedAddr(LockedAddr addr) { lockedAddrList.push_back(addr); }
/** read the system pointer
* Implemented for completeness with the setter
@@ -265,9 +308,6 @@ class AbstractMemory : public MemObject
*/
virtual void regStats();
- virtual void serialize(std::ostream &os);
- virtual void unserialize(Checkpoint *cp, const std::string &section);
-
};
#endif //__ABSTRACT_MEMORY_HH__