Use ReadResp instead of LoadLockedResp for LoadLockedReq responses.
[gem5.git] / src / mem / request.hh
index d2ebc91d3eed31d49adfa176e2dcb1c45f637cce..85ff8a445460e0a7a4172d766ff88bd9c239db1a 100644 (file)
@@ -39,6 +39,7 @@
 #ifndef __MEM_REQUEST_HH__
 #define __MEM_REQUEST_HH__
 
+#include "base/fast_alloc.hh"
 #include "sim/host.hh"
 #include "sim/core.hh"
 
@@ -74,9 +75,11 @@ const uint32_t INST_READ        = 0x80000;
 /** This request is for a memory swap. */
 const uint32_t MEM_SWAP         = 0x100000;
 const uint32_t MEM_SWAP_COND    = 0x200000;
+/** The request should ignore unaligned access faults */
+const uint32_t NO_HALF_WORD_ALIGN_FAULT = 0x400000;
 
 
-class Request
+class Request : public FastAlloc
 {
   private:
     /**
@@ -153,6 +156,8 @@ class Request
         setVirt(_asid, _vaddr, _size, _flags, _pc);
     }
 
+    ~Request() {}  // for FastAlloc
+
     /**
      * Set up CPU and thread numbers. */
     void setThreadContext(int _cpuNum, int _threadNum)
@@ -215,6 +220,7 @@ class Request
     int getSize() { assert(validPaddr || validAsidVaddr); return size; }
     /** Accessor for time. */
     Tick getTime() { assert(validPaddr || validAsidVaddr); return time; }
+    void resetTime() { assert(validPaddr || validAsidVaddr); time = curTick; }
 
     /** Accessor for flags. */
     uint32_t getFlags() { assert(validPaddr || validAsidVaddr); return flags; }
@@ -269,6 +275,10 @@ class Request
 
     bool isCondSwap() { return (getFlags() & MEM_SWAP_COND) != 0; }
 
+    bool inline isMisaligned() {return (!(getFlags() & NO_ALIGN_FAULT) &&
+                                        ((vaddr & 1)  ||
+                                         (!(getFlags() & NO_HALF_WORD_ALIGN_FAULT)
+                                          && (vaddr & 0x2))));}
 
     friend class Packet;
 };