Get rid of the Unallocated thread context state.
authorSteve Reinhardt <steve.reinhardt@amd.com>
Wed, 15 Apr 2009 20:13:47 +0000 (13:13 -0700)
committerSteve Reinhardt <steve.reinhardt@amd.com>
Wed, 15 Apr 2009 20:13:47 +0000 (13:13 -0700)
Basically merge it in with Halted.
Also had to get rid of a few other functions that
called ThreadContext::deallocate(), including:
 - InOrderCPU's setThreadRescheduleCondition.
 - ThreadContext::exit().  This function was there to avoid terminating
   simulation when one thread out of a multi-thread workload exits, but we
   need to find a better (non-cpu-centric) way.

20 files changed:
src/arch/sparc/ua2005.cc
src/cpu/checker/thread_context.hh
src/cpu/inorder/cpu.hh
src/cpu/inorder/inorder_dyn_inst.cc
src/cpu/inorder/inorder_dyn_inst.hh
src/cpu/inorder/thread_context.cc
src/cpu/inorder/thread_context.hh
src/cpu/o3/thread_context.hh
src/cpu/o3/thread_context_impl.hh
src/cpu/ozone/cpu.hh
src/cpu/ozone/cpu_impl.hh
src/cpu/simple/base.cc
src/cpu/simple_thread.cc
src/cpu/simple_thread.hh
src/cpu/thread_context.hh
src/kern/tru64/tru64.hh
src/sim/process.cc
src/sim/syscall_emul.cc
src/sim/system.cc
src/sim/system.hh

index 880d2c3ebf908f66546061efe94ff5137bbd4a51..d126d5944c499797c878749034ef7f644dede8b7 100644 (file)
@@ -346,8 +346,7 @@ MiscRegFile::processHSTickCompare(ThreadContext *tc)
     // we're actually at the correct cycle or we need to wait a little while
     // more
     int ticks;
-    if ( tc->status() == ThreadContext::Halted ||
-         tc->status() == ThreadContext::Unallocated)
+    if ( tc->status() == ThreadContext::Halted)
        return;
 
     ticks = ((int64_t)(hstick_cmpr & mask(63)) - (int64_t)stick) -
index 6b21bf670dcc25afe49b12eb1bfc2133cff01aa9..2176c597ad6316558f407a901eeb8886cef7f4dd 100644 (file)
@@ -121,9 +121,6 @@ class CheckerThreadContext : public ThreadContext
     /// Set the status to Suspended.
     void suspend() { actualTC->suspend(); }
 
-    /// Set the status to Unallocated.
-    void deallocate(int delay = 0) { actualTC->deallocate(delay); }
-
     /// Set the status to Halted.
     void halt() { actualTC->halt(); }
 
index f30ef128bd4de598fc3e859e5e84a93c514508f7..0545f4bf8dbdaf411422b132d9aab38200907de8 100644 (file)
@@ -340,12 +340,6 @@ class InOrderCPU : public BaseCPU
     virtual void disableMultiThreading(unsigned tid, unsigned vpe);
     void disableThreads(unsigned tid, unsigned vpe);
 
-    // Sets a thread-rescheduling condition.
-    void setThreadRescheduleCondition(uint32_t tid)
-    {
-      //@TODO: IMPLEMENT ME
-    }
-
     /** Activate a Thread When CPU Resources are Available. */
     void activateWhenReady(int tid);
 
index ceb3cbe516cc0e8572537e65dd6fbc574edf01da..7fc953da207a24b8a622896b6f240c9129968cb4 100644 (file)
@@ -573,12 +573,6 @@ InOrderDynInst::disableMultiThreading(unsigned vpe)
     this->cpu->disableMultiThreading(threadNumber, vpe);
 }
 
-void
-InOrderDynInst::setThreadRescheduleCondition(uint32_t cond)
-{
-    this->cpu->setThreadRescheduleCondition(cond);
-}
-
 template<class T>
 inline Fault
 InOrderDynInst::read(Addr addr, T &data, unsigned flags)
index 55c61ffb98516a82532c7ef01cea16c683b18ac6..3b47624fbb071f9540086a4fe6c2dc5b8af00035 100644 (file)
@@ -481,8 +481,6 @@ class InOrderDynInst : public FastAlloc, public RefCounted
     virtual void enableMultiThreading(unsigned vpe);
     virtual void disableMultiThreading(unsigned vpe);
 
-    virtual void setThreadRescheduleCondition(uint32_t cond);
-
     ////////////////////////////////////////////////////////////
     //
     //  PROGRAM COUNTERS - PC/NPC/NPC
index 13f8ecdad7439f484e0eb675be07769adea4a886..0cac51559ab8c5c8148c47c805bde0908ac72290 100644 (file)
@@ -46,7 +46,7 @@ InOrderThreadContext::takeOverFrom(ThreadContext *old_context)
     copyArchRegs(old_context);
 
     thread->funcExeInst = old_context->readFuncExeInst();
-    old_context->setStatus(ThreadContext::Unallocated);
+    old_context->setStatus(ThreadContext::Halted);
     thread->inSyscall = false;
     thread->trapPending = false;
 }
@@ -79,19 +79,6 @@ InOrderThreadContext::suspend(int delay)
     cpu->suspendContext(thread->readTid(), delay);
 }
 
-void
-InOrderThreadContext::deallocate(int delay)
-{
-    DPRINTF(InOrderCPU, "Calling deallocate on Thread Context %d\n",
-            getThreadNum());
-
-    if (thread->status() == ThreadContext::Unallocated)
-        return;
-
-    thread->setStatus(ThreadContext::Unallocated);
-    cpu->deallocateContext(thread->readTid(), delay);
-}
-
 void
 InOrderThreadContext::halt(int delay)
 {
index 3a1cb1379fbeecfb8502305244d0199a5ac35235..ec8cc197996295b5ce1b2335e0c80fa1c6424161 100644 (file)
@@ -118,9 +118,6 @@ class InOrderThreadContext : public ThreadContext
     /** Set the status to Suspended. */
     virtual void suspend(int delay = 0);
 
-    /** Set the status to Unallocated. */
-    virtual void deallocate(int delay = 1);
-
     /** Set the status to Halted. */
     virtual void halt(int delay = 0);
 
@@ -244,32 +241,6 @@ class InOrderThreadContext : public ThreadContext
     virtual void changeRegFileContext(unsigned param,
                                       unsigned val)
     { panic("Not supported!"); }
-
-    /** This function exits the thread context in the CPU and returns
-     * 1 if the CPU has no more active threads (meaning it's OK to exit);
-     * Used in syscall-emulation mode when a thread executes the 'exit'
-     * syscall.
-     */
-    virtual int exit()
-    {
-        this->deallocate();
-
-        // If there are still threads executing in the system (for now
-        // this single cpu)
-        if (this->cpu->numActiveThreads() - 1 > 0)
-            return 0; // don't exit simulation
-        else
-            return 1; // exit simulation
-    }
-
-    virtual void setThreadRescheduleCondition(uint64_t cond)
-    {
-        this->deallocate();
-
-        this->setStatus(ThreadContext::Suspended);
-
-        activateContext(cond);
-    }
 };
 
 #endif
index c402e8fd976a82f8654bd3563980460f6c632cd2..e7c9c3b8fa65ec13663b08a4760c79a8c664d80f 100755 (executable)
@@ -122,9 +122,6 @@ class O3ThreadContext : public ThreadContext
     /** Set the status to Suspended. */
     virtual void suspend(int delay = 0);
 
-    /** Set the status to Unallocated. */
-    virtual void deallocate(int delay = 0);
-
     /** Set the status to Halted. */
     virtual void halt(int delay = 0);
 
@@ -273,22 +270,6 @@ class O3ThreadContext : public ThreadContext
 #endif
         this->cpu->setNextNPC(val, this->thread->threadId());
     }
-
-    /** This function exits the thread context in the CPU and returns
-     * 1 if the CPU has no more active threads (meaning it's OK to exit);
-     * Used in syscall-emulation mode when a thread executes the 'exit'
-     * syscall.
-     */
-    virtual int exit()
-    {
-        this->deallocate();
-
-        // If there are still threads executing in the system
-        if (this->cpu->numActiveThreads())
-            return 0; // don't exit simulation
-        else
-            return 1; // exit simulation
-    }
 };
 
 #endif
index fc8b66b83f31669d02513bdc479901d36c76cf4d..07140a19f913a13b064eb499ac61a6e049448635 100755 (executable)
@@ -84,7 +84,7 @@ O3ThreadContext<Impl>::takeOverFrom(ThreadContext *old_context)
     cpu->lockFlag = false;
 #endif
 
-    old_context->setStatus(ThreadContext::Unallocated);
+    old_context->setStatus(ThreadContext::Halted);
 
     thread->inSyscall = false;
     thread->trapPending = false;
@@ -104,11 +104,6 @@ O3ThreadContext<Impl>::activate(int delay)
     thread->lastActivate = curTick;
 #endif
 
-    if (thread->status() == ThreadContext::Unallocated) {
-        cpu->activateWhenReady(thread->threadId());
-        return;
-    }
-
     thread->setStatus(ThreadContext::Active);
 
     // status() == Suspended
@@ -142,20 +137,6 @@ O3ThreadContext<Impl>::suspend(int delay)
     cpu->suspendContext(thread->threadId());
 }
 
-template <class Impl>
-void
-O3ThreadContext<Impl>::deallocate(int delay)
-{
-    DPRINTF(O3CPU, "Calling deallocate on Thread Context %d delay %d\n",
-            threadId(), delay);
-
-    if (thread->status() == ThreadContext::Unallocated)
-        return;
-
-    thread->setStatus(ThreadContext::Unallocated);
-    cpu->deallocateContext(thread->threadId(), true, delay);
-}
-
 template <class Impl>
 void
 O3ThreadContext<Impl>::halt(int delay)
index af62f863adbffa81fb03f272f713475962d37016..2e21411ae71cac7a695b82ac34a140eae36eef5e 100644 (file)
@@ -148,9 +148,6 @@ class OzoneCPU : public BaseCPU
         /// Set the status to Suspended.
         void suspend();
 
-        /// Set the status to Unallocated.
-        void deallocate(int delay = 0);
-
         /// Set the status to Halted.
         void halt();
 
index aa76c8aa6642c2404dee39ead7db31b3006f8dca..060ea6d7894746a519befe982f2b123609cdddc3 100644 (file)
@@ -737,14 +737,6 @@ OzoneCPU<Impl>::OzoneTC::suspend()
     cpu->suspendContext(thread->threadId());
 }
 
-/// Set the status to Unallocated.
-template <class Impl>
-void
-OzoneCPU<Impl>::OzoneTC::deallocate(int delay)
-{
-    cpu->deallocateContext(thread->threadId(), delay);
-}
-
 /// Set the status to Halted.
 template <class Impl>
 void
@@ -799,7 +791,7 @@ OzoneCPU<Impl>::OzoneTC::takeOverFrom(ThreadContext *old_context)
     cpu->lockFlag = false;
 #endif
 
-    old_context->setStatus(ThreadContext::Unallocated);
+    old_context->setStatus(ThreadContext::Halted);
 }
 
 template <class Impl>
index 348d2392f3e6a657b12e8e89e0b8d4308b128804..71d26f828ed1af4498d3ad27d3025c39d1e7714b 100644 (file)
@@ -81,7 +81,7 @@ BaseSimpleCPU::BaseSimpleCPU(BaseSimpleCPUParams *p)
             p->itb, p->dtb, /* asid */ 0);
 #endif // !FULL_SYSTEM
 
-    thread->setStatus(ThreadContext::Unallocated);
+    thread->setStatus(ThreadContext::Halted);
 
     tc = thread->getTC();
 
index 6ede3f429c127abb2019edd08d7b41bd95d1e868..73b23f89adc6ab6d1ab526a76571a470e5f11e77 100644 (file)
@@ -152,7 +152,7 @@ SimpleThread::takeOverFrom(ThreadContext *oldContext)
 
     storeCondFailures = 0;
 
-    oldContext->setStatus(ThreadContext::Unallocated);
+    oldContext->setStatus(ThreadContext::Halted);
 }
 
 void
@@ -253,15 +253,6 @@ SimpleThread::suspend()
     cpu->suspendContext(_threadId);
 }
 
-void
-SimpleThread::deallocate()
-{
-    if (status() == ThreadContext::Unallocated)
-        return;
-
-    _status = ThreadContext::Unallocated;
-    cpu->deallocateContext(_threadId);
-}
 
 void
 SimpleThread::halt()
index 5194a01ec57a7401f978541c3f17c57e5b4e68a0..3daa557910efea916cd51bbcbf8edaa36ed18cc8 100644 (file)
@@ -208,9 +208,6 @@ class SimpleThread : public ThreadState
     /// Set the status to Suspended.
     void suspend();
 
-    /// Set the status to Unallocated.
-    void deallocate();
-
     /// Set the status to Halted.
     void halt();
 
index 72c9df33dfcf16784044723c70944f0e86a3ac12..ca649b40e65f49a53c9f64bb408b62d3cae0b685 100644 (file)
@@ -87,14 +87,9 @@ class ThreadContext
     typedef TheISA::MiscRegFile MiscRegFile;
     typedef TheISA::MiscReg MiscReg;
   public:
+
     enum Status
     {
-        /// Initialized but not running yet.  All CPUs start in
-        /// this state, but most transition to Active on cycle 1.
-        /// In MP or SMT systems, non-primary contexts will stay
-        /// in this state until a thread is assigned to them.
-        Unallocated,
-
         /// Running.  Instructions should be executed only when
         /// the context is in this state.
         Active,
@@ -154,9 +149,6 @@ class ThreadContext
     /// Set the status to Suspended.
     virtual void suspend(int delay = 0) = 0;
 
-    /// Set the status to Unallocated.
-    virtual void deallocate(int delay = 0) = 0;
-
     /// Set the status to Halted.
     virtual void halt(int delay = 0) = 0;
 
@@ -337,9 +329,6 @@ class ProxyThreadContext : public ThreadContext
     /// Set the status to Suspended.
     void suspend(int delay = 0) { actualTC->suspend(); }
 
-    /// Set the status to Unallocated.
-    void deallocate(int delay = 0) { actualTC->deallocate(); }
-
     /// Set the status to Halted.
     void halt(int delay = 0) { actualTC->halt(); }
 
index b1af4ec0e9420cb6d6b868c6e04621da20c239a7..2234f55fe233f35f730e53603dd07bcd68637714 100644 (file)
@@ -1074,7 +1074,7 @@ class Tru64 : public OperatingSystem
                        ThreadContext *tc)
     {
         assert(tc->status() == ThreadContext::Active);
-        tc->deallocate();
+        tc->halt();
 
         return 0;
     }
index 4be97f2f6f90eb77158f37d1e4bcdac088746313..c45844a51690c5c1835d9a605e015bfe34dd676e 100644 (file)
@@ -221,7 +221,7 @@ Process::findFreeContext()
     ThreadContext *tc;
     for (int i = 0; i < size; ++i) {
         tc = system->getThreadContext(contextIds[i]);
-        if (tc->status() == ThreadContext::Unallocated) {
+        if (tc->status() == ThreadContext::Halted) {
             // inactive context, free to use
             return tc;
         }
index 5fe30c26990380aa6c2285b58b488929547197b8..f0a693db019614aa60219e80116bbc380e6e4b81 100644 (file)
@@ -42,6 +42,7 @@
 #include "cpu/base.hh"
 #include "mem/page_table.hh"
 #include "sim/process.hh"
+#include "sim/system.hh"
 
 #include "sim/sim_exit.hh"
 
@@ -91,9 +92,13 @@ SyscallReturn
 exitFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
          ThreadContext *tc)
 {
-    if (tc->exit()) {
+    if (process->system->numRunningContexts() == 1) {
+        // Last running context... exit simulator
         exitSimLoop("target called exit()",
-                process->getSyscallArg(tc, 0) & 0xff);
+                    process->getSyscallArg(tc, 0) & 0xff);
+    } else {
+        // other running threads... just halt this one
+        tc->halt();
     }
 
     return 1;
index d16524c415b2c2b4981fbdc48eebcc9dcec94853..f10167bba244db1f1ba04a67598d4d264819bf88 100644 (file)
@@ -211,6 +211,17 @@ System::registerThreadContext(ThreadContext *tc, int assigned)
     return id;
 }
 
+int
+System::numRunningContexts()
+{
+    int running = 0;
+    for (int i = 0; i < _numContexts; ++i) {
+        if (threadContexts[i]->status() != ThreadContext::Halted)
+            ++running;
+    }
+    return running;
+}
+
 void
 System::startup()
 {
index bfa5ea8bba94ed5ed0ccc764cc346eb41c0c0eb0..e1c30490b6fddd5da01bedf37dfc2454348668ff 100644 (file)
@@ -89,19 +89,21 @@ class System : public SimObject
     std::vector<ThreadContext *> threadContexts;
     int _numContexts;
 
-    ThreadContext * getThreadContext(int tid)
+    ThreadContext *getThreadContext(int tid)
     {
         return threadContexts[tid];
     }
 
     int numContexts()
     {
-        if (_numContexts != threadContexts.size())
-            panic("cpu array not fully populated!");
-
+        assert(_numContexts == threadContexts.size());
         return _numContexts;
     }
 
+    /** Return number of running (non-halted) thread contexts in
+     * system.  These threads could be Active or Suspended. */
+    int numRunningContexts();
+
 #if FULL_SYSTEM
     Platform *platform;
     uint64_t init_param;