cpu: Avoid unnecessary dynamic_pointer_cast in atomic model
[gem5.git] / src / cpu / thread_state.hh
index 775f6fbd4d3780e02a7ae34864fbd30f1632e872..5cbc3322b1a607426084898afcff1b78689303dc 100644 (file)
@@ -56,22 +56,24 @@ class Checkpoint;
  *  memory, quiesce events, and certain stats.  This can be expanded
  *  to hold more thread-specific stats within it.
  */
-struct ThreadState {
+struct ThreadState : public Serializable {
     typedef ThreadContext::Status Status;
 
     ThreadState(BaseCPU *cpu, ThreadID _tid, Process *_process);
 
     virtual ~ThreadState();
 
-    void serialize(std::ostream &os);
+    void serialize(CheckpointOut &cp) const override;
 
-    void unserialize(Checkpoint *cp, const std::string &section);
+    void unserialize(CheckpointIn &cp) override;
 
     int cpuId() const { return baseCpu->cpuId(); }
 
-    int contextId() const { return _contextId; }
+    uint32_t socketId() const { return baseCpu->socketId(); }
 
-    void setContextId(int id) { _contextId = id; }
+    ContextID contextId() const { return _contextId; }
+
+    void setContextId(ContextID id) { _contextId = id; }
 
     void setThreadId(ThreadID id) { _threadId = id; }
 
@@ -105,6 +107,21 @@ struct ThreadState {
 
     Process *getProcessPtr() { return process; }
 
+    void setProcessPtr(Process *p)
+    {
+        process = p;
+        /**
+         * When the process pointer changes while operating in SE Mode,
+         * the se translating port proxy needs to be reinitialized since it
+         * holds a pointer to the process class.
+         */
+        if (proxy) {
+            delete proxy;
+            proxy = NULL;
+            initMemProxies(NULL);
+        }
+    }
+
     SETranslatingPortProxy &getMemProxy();
 
     /** Reads the number of instructions functionally executed and
@@ -151,7 +168,7 @@ struct ThreadState {
     BaseCPU *baseCpu;
 
     // system wide HW context id
-    int _contextId;
+    ContextID _contextId;
 
     // Index of hardware thread context on the CPU that this represents.
     ThreadID _threadId;