style: cleanup the Ruby Tester
[gem5.git] / src / cpu / base.cc
index 4845cbfaf7041c66a5c4910ffd3c8bf1a5aa1405..556e7ec6f66c2497e100deaf644aa40c005b32c8 100644 (file)
@@ -61,11 +61,11 @@ vector<BaseCPU *> BaseCPU::cpuList;
 int maxThreadsPerCPU = 1;
 
 CPUProgressEvent::CPUProgressEvent(BaseCPU *_cpu, Tick ival)
-    : Event(Event::Progress_Event_Pri), interval(ival), lastNumInst(0),
-      cpu(_cpu)
+    : Event(Event::Progress_Event_Pri), _interval(ival), lastNumInst(0),
+      cpu(_cpu), _repeatEvent(true)
 {
-    if (interval)
-        cpu->schedule(this, curTick + interval);
+    if (_interval)
+        cpu->schedule(this, curTick + _interval);
 }
 
 void
@@ -73,17 +73,21 @@ CPUProgressEvent::process()
 {
     Counter temp = cpu->totalInstructions();
 #ifndef NDEBUG
-    double ipc = double(temp - lastNumInst) / (interval / cpu->ticks(1));
+    double ipc = double(temp - lastNumInst) / (_interval / cpu->ticks(1));
 
-    DPRINTFN("%s progress event, instructions committed: %lli, IPC: %0.8d\n",
-             cpu->name(), temp - lastNumInst, ipc);
+    DPRINTFN("%s progress event, total committed:%i, progress insts committed: "
+             "%lli, IPC: %0.8d\n", cpu->name(), temp, temp - lastNumInst,
+             ipc);
     ipc = 0.0;
 #else
-    cprintf("%lli: %s progress event, instructions committed: %lli\n",
-            curTick, cpu->name(), temp - lastNumInst);
+    cprintf("%lli: %s progress event, total committed:%i, progress insts "
+            "committed: %lli\n", curTick, cpu->name(), temp,
+            temp - lastNumInst);
 #endif
     lastNumInst = temp;
-    cpu->schedule(this, curTick + interval);
+
+    if (_repeatEvent)
+        cpu->schedule(this, curTick + _interval);
 }
 
 const char *
@@ -96,12 +100,12 @@ CPUProgressEvent::description() const
 BaseCPU::BaseCPU(Params *p)
     : MemObject(p), clock(p->clock), instCnt(0), _cpuId(p->cpu_id),
       interrupts(p->interrupts),
-      number_of_threads(p->numThreads), system(p->system),
+      numThreads(p->numThreads), system(p->system),
       phase(p->phase)
 #else
 BaseCPU::BaseCPU(Params *p)
     : MemObject(p), clock(p->clock), _cpuId(p->cpu_id),
-      number_of_threads(p->numThreads), system(p->system),
+      numThreads(p->numThreads), system(p->system),
       phase(p->phase)
 #endif
 {
@@ -117,22 +121,23 @@ BaseCPU::BaseCPU(Params *p)
 
     DPRINTF(SyscallVerbose, "Constructing CPU with id %d\n", _cpuId);
 
-    if (number_of_threads > maxThreadsPerCPU)
-        maxThreadsPerCPU = number_of_threads;
+    if (numThreads > maxThreadsPerCPU)
+        maxThreadsPerCPU = numThreads;
 
     // allocate per-thread instruction-based event queues
-    comInstEventQueue = new EventQueue *[number_of_threads];
-    for (int i = 0; i < number_of_threads; ++i)
-        comInstEventQueue[i] = new EventQueue("instruction-based event queue");
+    comInstEventQueue = new EventQueue *[numThreads];
+    for (ThreadID tid = 0; tid < numThreads; ++tid)
+        comInstEventQueue[tid] =
+            new EventQueue("instruction-based event queue");
 
     //
     // set up instruction-count-based termination events, if any
     //
     if (p->max_insts_any_thread != 0) {
         const char *cause = "a thread reached the max instruction count";
-        for (int i = 0; i < number_of_threads; ++i) {
+        for (ThreadID tid = 0; tid < numThreads; ++tid) {
             Event *event = new SimLoopExitEvent(cause, 0);
-            comInstEventQueue[i]->schedule(event, p->max_insts_any_thread);
+            comInstEventQueue[tid]->schedule(event, p->max_insts_any_thread);
         }
     }
 
@@ -143,26 +148,26 @@ BaseCPU::BaseCPU(Params *p)
         // decrement this when triggered; simulation will terminate
         // when counter reaches 0
         int *counter = new int;
-        *counter = number_of_threads;
-        for (int i = 0; i < number_of_threads; ++i) {
+        *counter = numThreads;
+        for (ThreadID tid = 0; tid < numThreads; ++tid) {
             Event *event = new CountedExitEvent(cause, *counter);
-            comInstEventQueue[i]->schedule(event, p->max_insts_any_thread);
+            comInstEventQueue[tid]->schedule(event, p->max_insts_all_threads);
         }
     }
 
     // allocate per-thread load-based event queues
-    comLoadEventQueue = new EventQueue *[number_of_threads];
-    for (int i = 0; i < number_of_threads; ++i)
-        comLoadEventQueue[i] = new EventQueue("load-based event queue");
+    comLoadEventQueue = new EventQueue *[numThreads];
+    for (ThreadID tid = 0; tid < numThreads; ++tid)
+        comLoadEventQueue[tid] = new EventQueue("load-based event queue");
 
     //
     // set up instruction-count-based termination events, if any
     //
     if (p->max_loads_any_thread != 0) {
         const char *cause = "a thread reached the max load count";
-        for (int i = 0; i < number_of_threads; ++i) {
+        for (ThreadID tid = 0; tid < numThreads; ++tid) {
             Event *event = new SimLoopExitEvent(cause, 0);
-            comLoadEventQueue[i]->schedule(event, p->max_loads_any_thread);
+            comLoadEventQueue[tid]->schedule(event, p->max_loads_any_thread);
         }
     }
 
@@ -172,10 +177,10 @@ BaseCPU::BaseCPU(Params *p)
         // decrement this when triggered; simulation will terminate
         // when counter reaches 0
         int *counter = new int;
-        *counter = number_of_threads;
-        for (int i = 0; i < number_of_threads; ++i) {
+        *counter = numThreads;
+        for (ThreadID tid = 0; tid < numThreads; ++tid) {
             Event *event = new CountedExitEvent(cause, *counter);
-            comLoadEventQueue[i]->schedule(event, p->max_loads_all_threads);
+            comLoadEventQueue[tid]->schedule(event, p->max_loads_all_threads);
         }
     }
 
@@ -194,6 +199,8 @@ BaseCPU::BaseCPU(Params *p)
         }
     }
 #if FULL_SYSTEM
+    interrupts->setCPU(this);
+
     profileEvent = NULL;
     if (params()->profile)
         profileEvent = new ProfileEvent(this, params()->profile);
@@ -228,8 +235,9 @@ BaseCPU::startup()
 
     if (params()->progress_interval) {
         Tick num_ticks = ticks(params()->progress_interval);
-        Event *event = new CPUProgressEvent(this, num_ticks);
-        schedule(event, curTick + num_ticks);
+
+        Event *event;
+        event = new CPUProgressEvent(this, num_ticks);
     }
 }
 
@@ -282,12 +290,23 @@ BaseCPU::nextCycle(Tick begin_tick)
 void
 BaseCPU::registerThreadContexts()
 {
-    for (int i = 0; i < threadContexts.size(); ++i) {
-        ThreadContext *tc = threadContexts[i];
-
-        system->registerThreadContext(tc);
+    ThreadID size = threadContexts.size();
+    for (ThreadID tid = 0; tid < size; ++tid) {
+        ThreadContext *tc = threadContexts[tid];
+
+        /** This is so that contextId and cpuId match where there is a
+         * 1cpu:1context relationship.  Otherwise, the order of registration
+         * could affect the assignment and cpu 1 could have context id 3, for
+         * example.  We may even want to do something like this for SMT so that
+         * cpu 0 has the lowest thread contexts and cpu N has the highest, but
+         * I'll just do this for now
+         */
+        if (numThreads == 1)
+            tc->setContextId(system->registerThreadContext(tc, _cpuId));
+        else
+            tc->setContextId(system->registerThreadContext(tc));
 #if !FULL_SYSTEM
-        tc->getProcessPtr()->assignThreadContext(tc->cpuId());
+        tc->getProcessPtr()->assignThreadContext(tc->contextId());
 #endif
     }
 }
@@ -296,9 +315,10 @@ BaseCPU::registerThreadContexts()
 int
 BaseCPU::findContext(ThreadContext *tc)
 {
-    for (int i = 0; i < threadContexts.size(); ++i) {
-        if (tc == threadContexts[i])
-            return i;
+    ThreadID size = threadContexts.size();
+    for (ThreadID tid = 0; tid < size; ++tid) {
+        if (tc == threadContexts[tid])
+            return tid;
     }
     return 0;
 }
@@ -320,7 +340,8 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU, Port *ic, Port *dc)
 
     _cpuId = oldCPU->cpuId();
 
-    for (int i = 0; i < threadContexts.size(); ++i) {
+    ThreadID size = threadContexts.size();
+    for (ThreadID i = 0; i < size; ++i) {
         ThreadContext *newTC = threadContexts[i];
         ThreadContext *oldTC = oldCPU->threadContexts[i];
 
@@ -328,17 +349,23 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU, Port *ic, Port *dc)
 
         CpuEvent::replaceThreadContext(oldTC, newTC);
 
-        assert(newTC->cpuId() == oldTC->cpuId());
-        system->replaceThreadContext(newTC, newTC->cpuId());
+        assert(newTC->contextId() == oldTC->contextId());
+        assert(newTC->threadId() == oldTC->threadId());
+        system->replaceThreadContext(newTC, newTC->contextId());
 
-        if (DTRACE(Context))
+        /* This code no longer works since the zero register (e.g.,
+         * r31 on Alpha) doesn't necessarily contain zero at this
+         * point.
+           if (DTRACE(Context))
             ThreadContext::compare(oldTC, newTC);
+        */
     }
 
 #if FULL_SYSTEM
     interrupts = oldCPU->interrupts;
+    interrupts->setCPU(this);
 
-    for (int i = 0; i < threadContexts.size(); ++i)
+    for (ThreadID i = 0; i < size; ++i)
         threadContexts[i]->profileClear();
 
     if (profileEvent)
@@ -370,7 +397,8 @@ BaseCPU::ProfileEvent::ProfileEvent(BaseCPU *_cpu, Tick _interval)
 void
 BaseCPU::ProfileEvent::process()
 {
-    for (int i = 0, size = cpu->threadContexts.size(); i < size; ++i) {
+    ThreadID size = cpu->threadContexts.size();
+    for (ThreadID i = 0; i < size; ++i) {
         ThreadContext *tc = cpu->threadContexts[i];
         tc->profileSample();
     }
@@ -378,24 +406,6 @@ BaseCPU::ProfileEvent::process()
     cpu->schedule(this, curTick + interval);
 }
 
-void
-BaseCPU::postInterrupt(int int_num, int index)
-{
-    interrupts->post(int_num, index);
-}
-
-void
-BaseCPU::clearInterrupt(int int_num, int index)
-{
-    interrupts->clear(int_num, index);
-}
-
-void
-BaseCPU::clearInterrupts()
-{
-    interrupts->clearAll();
-}
-
 void
 BaseCPU::serialize(std::ostream &os)
 {