make activation of exec contexts happen in startup
authorNathan Binkert <binkertn@umich.edu>
Thu, 4 Nov 2004 01:46:33 +0000 (20:46 -0500)
committerNathan Binkert <binkertn@umich.edu>
Thu, 4 Nov 2004 01:46:33 +0000 (20:46 -0500)
the registration stuff all moves into BaseCPU

cpu/base_cpu.cc:
    Move the registration stuff into the BaseCPU since all
    other CPUs use it.
cpu/base_cpu.hh:
    Move the defer registration stuff into the BaseCPU since all
    other CPUs use it.
cpu/simple_cpu/simple_cpu.cc:
cpu/simple_cpu/simple_cpu.hh:
    registration stuff moved to base class
sim/system.cc:
    the activation of exec contexts should happen at startup, not
    when they are registered.
sim/system.hh:
    the system now has a startup function

--HG--
extra : convert_revision : bb6a7c2da5a1ecf5fe7ede1078200bfe5245f8ef

cpu/base_cpu.cc
cpu/base_cpu.hh
cpu/simple_cpu/simple_cpu.cc
cpu/simple_cpu/simple_cpu.hh
sim/system.cc
sim/system.hh

index 8a9c9a102a659f9ab8e1a337aadd6f65478ed232..7fb8b414fcb2962e0927bd26acb59a37282dcd79 100644 (file)
@@ -47,21 +47,22 @@ vector<BaseCPU *> BaseCPU::cpuList;
 int maxThreadsPerCPU = 1;
 
 #ifdef FULL_SYSTEM
-BaseCPU::BaseCPU(const string &_name, int _number_of_threads,
+BaseCPU::BaseCPU(const string &_name, int _number_of_threads, bool _def_reg,
                  Counter max_insts_any_thread,
                  Counter max_insts_all_threads,
                  Counter max_loads_any_thread,
                  Counter max_loads_all_threads,
                  System *_system, Tick freq)
-    : SimObject(_name), frequency(freq),
+    : SimObject(_name), frequency(freq), deferRegistration(_def_reg),
       number_of_threads(_number_of_threads), system(_system)
 #else
-BaseCPU::BaseCPU(const string &_name, int _number_of_threads,
+BaseCPU::BaseCPU(const string &_name, int _number_of_threads, bool _def_reg,
                  Counter max_insts_any_thread,
                  Counter max_insts_all_threads,
                  Counter max_loads_any_thread,
                  Counter max_loads_all_threads)
-    : SimObject(_name), number_of_threads(_number_of_threads)
+    : SimObject(_name), deferRegistration(_def_reg),
+      number_of_threads(_number_of_threads)
 #endif
 {
     // add self to global list of CPUs
@@ -126,6 +127,12 @@ BaseCPU::BaseCPU(const string &_name, int _number_of_threads,
 #endif
 }
 
+void
+BaseCPU::init()
+{
+    if (!deferRegistration)
+        registerExecContexts();
+}
 
 void
 BaseCPU::regStats()
index f75f0040921daf9c620066be646d4a45789c7e6e..7e937c755fdea471dc0b1e0a27863cb3feaad291 100644 (file)
@@ -91,12 +91,12 @@ class BaseCPU : public SimObject
   public:
 
 #ifdef FULL_SYSTEM
-    BaseCPU(const std::string &_name, int _number_of_threads,
+    BaseCPU(const std::string &_name, int _number_of_threads, bool _def_reg,
             Counter max_insts_any_thread, Counter max_insts_all_threads,
             Counter max_loads_any_thread, Counter max_loads_all_threads,
             System *_system, Tick freq);
 #else
-    BaseCPU(const std::string &_name, int _number_of_threads,
+    BaseCPU(const std::string &_name, int _number_of_threads, bool _def_reg,
             Counter max_insts_any_thread = 0,
             Counter max_insts_all_threads = 0,
             Counter max_loads_any_thread = 0,
@@ -105,8 +105,10 @@ class BaseCPU : public SimObject
 
     virtual ~BaseCPU() {}
 
+    virtual void init();
     virtual void regStats();
 
+    bool deferRegistration;
     void registerExecContexts();
 
     /// Prepare for another CPU to take over execution.  Called by
@@ -140,7 +142,6 @@ class BaseCPU : public SimObject
 #ifdef FULL_SYSTEM
     System *system;
 
-
     /**
      * Serialize this object to the given output stream.
      * @param os The stream to serialize to.
index 8ea5798eac38b34947400a6553a5e153be8f4944..6af67eee0b6bfb9a9a2b9557d571180c9985c321 100644 (file)
@@ -124,7 +124,7 @@ SimpleCPU::SimpleCPU(const string &_name,
                      MemInterface *icache_interface,
                      MemInterface *dcache_interface,
                      bool _def_reg, Tick freq)
-    : BaseCPU(_name, /* number_of_threads */ 1,
+    : BaseCPU(_name, /* number_of_threads */ 1, _def_reg,
               max_insts_any_thread, max_insts_all_threads,
               max_loads_any_thread, max_loads_all_threads,
               _system, freq),
@@ -137,12 +137,11 @@ SimpleCPU::SimpleCPU(const string &_name, Process *_process,
                      MemInterface *icache_interface,
                      MemInterface *dcache_interface,
                      bool _def_reg)
-    : BaseCPU(_name, /* number_of_threads */ 1,
+    : BaseCPU(_name, /* number_of_threads */ 1, _def_reg,
               max_insts_any_thread, max_insts_all_threads,
               max_loads_any_thread, max_loads_all_threads),
 #endif
-      tickEvent(this), xc(NULL), defer_registration(_def_reg),
-      cacheCompletionEvent(this)
+      tickEvent(this), xc(NULL), cacheCompletionEvent(this)
 {
     _status = Idle;
 #ifdef FULL_SYSTEM
@@ -176,13 +175,6 @@ SimpleCPU::~SimpleCPU()
 {
 }
 
-void SimpleCPU::init()
-{
-    if (!defer_registration) {
-        this->registerExecContexts();
-    }
-}
-
 void
 SimpleCPU::switchOut()
 {
index d0000dc5b4fbfbf8bcb51e2ca09d9c94223a7147..1610d606068e0d96e9a2297608aaff7d59663c6c 100644 (file)
@@ -158,7 +158,6 @@ class SimpleCPU : public BaseCPU
 #endif
 
     virtual ~SimpleCPU();
-    virtual void init();
 
     // execution context
     ExecContext *xc;
@@ -178,8 +177,6 @@ class SimpleCPU : public BaseCPU
     // L1 data cache
     MemInterface *dcacheInterface;
 
-    bool defer_registration;
-
     // current instruction
     MachInst inst;
 
index 9fdadf64966600c4eed3f1b1a72a51f3a7fd31c1..1b1a145c6df7f83c0da094ce987dfc33b20b1f88 100644 (file)
@@ -194,12 +194,6 @@ System::registerExecContext(ExecContext *xc)
     int xcIndex = execContexts.size();
     execContexts.push_back(xc);
 
-    if (xcIndex == 0) {
-        // activate with zero delay so that we start ticking right
-        // away on cycle 0
-        xc->activate(0);
-    }
-
     RemoteGDB *rgdb = new RemoteGDB(this, xc);
     GDBListener *gdbl = new GDBListener(rgdb, 7000 + xcIndex);
     gdbl->listen();
@@ -218,6 +212,16 @@ System::registerExecContext(ExecContext *xc)
     return xcIndex;
 }
 
+void
+System::startup()
+{
+    if (!execContexts.empty()) {
+        // activate with zero delay so that we start ticking right
+        // away on cycle 0
+        execContexts[0]->activate(0);
+    }
+}
+
 void
 System::replaceExecContext(ExecContext *xc, int xcIndex)
 {
index 5294f417e5dbbff2d979dae5310101bcbc80fdb6..61784b0442bdfad96929ea4dbeb11356b8bde883 100644 (file)
@@ -122,6 +122,8 @@ class System : public SimObject
     System(Params *p);
     ~System();
 
+    void startup();
+
   public:
     /**
      * Returns the addess the kernel starts at.