cpu: Initialize the O3 pipeline from startup()
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>
Mon, 7 Jan 2013 18:05:44 +0000 (13:05 -0500)
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>
Mon, 7 Jan 2013 18:05:44 +0000 (13:05 -0500)
The entire O3 pipeline used to be initialized from init(), which is
called before initState() or unserialize(). This causes the pipeline
to be initialized from an incorrect thread context. This doesn't
currently lead to correctness problems as instructions fetched from
the incorrect start PC will be squashed a few cycles after
initialization.

This patch will affect the regressions since the O3 CPU now issues its
first instruction fetch to the correct PC instead of 0x0.

src/cpu/o3/commit.hh
src/cpu/o3/commit_impl.hh
src/cpu/o3/cpu.cc
src/cpu/o3/cpu.hh
src/cpu/o3/fetch.hh
src/cpu/o3/fetch_impl.hh
src/cpu/o3/iew.hh
src/cpu/o3/iew_impl.hh
src/cpu/o3/rename.hh
src/cpu/o3/rename_impl.hh

index 489656a7d10fee132b2a74bcb61b4f185a1695bf..fdd9609a41d1622d419ee0fab2868724886543b2 100644 (file)
@@ -195,7 +195,7 @@ class DefaultCommit
     void setROB(ROB *rob_ptr);
 
     /** Initializes stage by sending back the number of free entries. */
-    void initStage();
+    void startupStage();
 
     /** Initializes the draining of commit. */
     bool drain();
index 351b4794d769279dccd7e6c802728277ee72cd48..bff5c5ae987fc0ab352654426934fd079c952f0c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2011 ARM Limited
+ * Copyright (c) 2010-2012 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -348,7 +348,7 @@ DefaultCommit<Impl>::setROB(ROB *rob_ptr)
 
 template <class Impl>
 void
-DefaultCommit<Impl>::initStage()
+DefaultCommit<Impl>::startupStage()
 {
     rob->setActiveThreads(activeThreads);
     rob->resetEntries();
index 2e972b765bf5b6375392f0f6fbc54723454f3f95..0419a61737d664c7d73b86b888ece921684fd546 100644 (file)
@@ -679,15 +679,19 @@ FullO3CPU<Impl>::init()
     for (int tid = 0; tid < numThreads; ++tid)
         thread[tid]->noSquashFromTC = false;
 
-    // Initialize stages.
-    fetch.initStage();
-    iew.initStage();
-    rename.initStage();
-    commit.initStage();
-
     commit.setThreads(thread);
 }
 
+template <class Impl>
+void
+FullO3CPU<Impl>::startup()
+{
+    fetch.startupStage();
+    iew.startupStage();
+    rename.startupStage();
+    commit.startupStage();
+}
+
 template <class Impl>
 void
 FullO3CPU<Impl>::activateThread(ThreadID tid)
index 06e1ea33627581bd967630c5bf8861af5d6fa0a4..eda9d9e9151bfdff9da1e2f9e6352d63fd804819 100644 (file)
@@ -369,6 +369,8 @@ class FullO3CPU : public BaseO3CPU
     /** Initialize the CPU */
     void init();
 
+    void startup();
+
     /** Returns the Number of Active Threads in the CPU */
     int numActiveThreads()
     { return activeThreads.size(); }
index 42ea5cb7128ccd2ad48b4c5803de308eba63e934..702a45e15554b944a550d929b487f48e045e657e 100644 (file)
@@ -215,7 +215,7 @@ class DefaultFetch
     void setFetchQueue(TimeBuffer<FetchStruct> *fq_ptr);
 
     /** Initialize stage. */
-    void initStage();
+    void startupStage();
 
     /** Tells the fetch stage that the Icache is set. */
     void setIcache();
index 9efe30309dd66ed985a2bcc9c1d53bc1ba6584d0..87d2bc593cfcbada84e3ec3a958b41e239123df8 100644 (file)
@@ -302,7 +302,7 @@ DefaultFetch<Impl>::setFetchQueue(TimeBuffer<FetchStruct> *fq_ptr)
 
 template<class Impl>
 void
-DefaultFetch<Impl>::initStage()
+DefaultFetch<Impl>::startupStage()
 {
     // Setup PC and nextPC with initial state.
     for (ThreadID tid = 0; tid < numThreads; tid++) {
index 0a519996d7291504c6a7abd3099e161e69567d9e..dcc8ecf82d6d673a48a84c828d4e618fb0c8601c 100644 (file)
@@ -133,7 +133,7 @@ class DefaultIEW
     void regStats();
 
     /** Initializes stage; sends back the number of free IQ and LSQ entries. */
-    void initStage();
+    void startupStage();
 
     /** Sets main time buffer used for backwards communication. */
     void setTimeBuffer(TimeBuffer<TimeStruct> *tb_ptr);
index 60f4604a253c96316d4ca765eddc66aa733ebfd7..e25c8829bbcf67704ec951f1c478090b829a7f57 100644 (file)
@@ -283,7 +283,7 @@ DefaultIEW<Impl>::regStats()
 
 template<class Impl>
 void
-DefaultIEW<Impl>::initStage()
+DefaultIEW<Impl>::startupStage()
 {
     for (ThreadID tid = 0; tid < numThreads; tid++) {
         toRename->iewInfo[tid].usedIQ = true;
@@ -408,7 +408,7 @@ DefaultIEW<Impl>::takeOverFrom()
     ldstQueue.takeOverFrom();
     fuPool->takeOver();
 
-    initStage();
+    startupStage();
     cpu->activityThisCycle();
 
     for (ThreadID tid = 0; tid < numThreads; tid++) {
index a5c83dfea7dffbe9d484157e1c341943961c2304..0aa238c068c5a2f82048c040f0dcb00b3e192c8a 100644 (file)
@@ -143,7 +143,7 @@ class DefaultRename
 
   public:
     /** Initializes variables for the stage. */
-    void initStage();
+    void startupStage();
 
     /** Sets pointer to list of active threads. */
     void setActiveThreads(std::list<ThreadID> *at_ptr);
index 592bc059f71e386409f14d41d0e034a94e19cc62..4996cfcad951bf18fc02be84edab75219a9bb070 100644 (file)
@@ -228,7 +228,7 @@ DefaultRename<Impl>::setDecodeQueue(TimeBuffer<DecodeStruct> *dq_ptr)
 
 template <class Impl>
 void
-DefaultRename<Impl>::initStage()
+DefaultRename<Impl>::startupStage()
 {
     // Grab the number of free entries directly from the stages.
     for (ThreadID tid = 0; tid < numThreads; tid++) {
@@ -317,7 +317,7 @@ void
 DefaultRename<Impl>::takeOverFrom()
 {
     _status = Inactive;
-    initStage();
+    startupStage();
 
     // Reset all state prior to taking over from the other CPU.
     for (ThreadID tid = 0; tid < numThreads; tid++) {