Fix for FS O3CPU compile ... missing forward class declaration/header file after...
authorKorey Sewell <ksewell@umich.edu>
Mon, 3 Jul 2006 16:19:35 +0000 (12:19 -0400)
committerKorey Sewell <ksewell@umich.edu>
Mon, 3 Jul 2006 16:19:35 +0000 (12:19 -0400)
src/cpu/o3/alpha/thread_context.hh:
    Use 'this' when accessing cpu
src/cpu/o3/cpu.hh:
    add numActiveThreds function
src/cpu/o3/thread_context.hh:
    forward class declarations
src/cpu/o3/thread_context_impl.hh:
    add quiesce event header file
src/cpu/thread_context.hh:
    add exit() function to thread context (read comments in file)
src/sim/syscall_emul.cc:
    adjust exitFunc syscall

--HG--
extra : convert_revision : 323dc871e2b4f4ee5036be388ceb6634cd85a83e

src/cpu/o3/alpha/thread_context.hh
src/cpu/o3/cpu.hh
src/cpu/o3/thread_context.hh
src/cpu/o3/thread_context_impl.hh
src/cpu/thread_context.hh
src/sim/syscall_emul.cc

index 57190d65e3901fa7701f696965731c37e078b88f..78b0ee78826e2d3543eb5bed2cbbf5fe0d540a99 100644 (file)
@@ -37,21 +37,21 @@ class AlphaTC : public O3ThreadContext<Impl>
   public:
 #if FULL_SYSTEM
     /** Returns a pointer to the ITB. */
-    virtual AlphaITB *getITBPtr() { return cpu->itb; }
+    virtual AlphaITB *getITBPtr() { return this->cpu->itb; }
 
     /** Returns a pointer to the DTB. */
-    virtual AlphaDTB *getDTBPtr() { return cpu->dtb; }
+    virtual AlphaDTB *getDTBPtr() { return this->cpu->dtb; }
 
     /** Returns pointer to the quiesce event. */
     virtual EndQuiesceEvent *getQuiesceEvent()
     {
-        return thread->quiesceEvent;
+        return this->thread->quiesceEvent;
     }
 
     /** Returns if the thread is currently in PAL mode, based on
      * the PC's value. */
     virtual bool inPalMode()
-    { return TheISA::PcPAL(cpu->readPC(thread->readTid())); }
+    { return TheISA::PcPAL(this->cpu->readPC(this->thread->readTid())); }
 #endif
 
     virtual uint64_t readNextNPC()
@@ -68,4 +68,20 @@ class AlphaTC : public O3ThreadContext<Impl>
     virtual void changeRegFileContext(TheISA::RegFile::ContextParam param,
                                       TheISA::RegFile::ContextVal val)
     { panic("Not supported on Alpha!"); }
+
+
+    // 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->cpu->deallocateContext(this->thread->readTid());
+
+        // If there are still threads executing in the system
+        if (this->cpu->numActiveThreads())
+            return 0;
+        else
+            return 1;
+    }
 };
index 2a9ecff4ed0e1060c715ed3a059954ad9b5c9b66..1cff6142d3df9a2b07cd987feb96536b6ea2dc2e 100644 (file)
@@ -214,6 +214,10 @@ class FullO3CPU : public BaseO3CPU
     /** Initialize the CPU */
     void init();
 
+    /** Returns the Number of Active Threads in the CPU */
+    int numActiveThreads()
+    { return activeThreads.size(); }
+
     /** Add Thread to Active Threads List */
     void activateThread(unsigned int tid);
 
index d60867029a8c464424efbfc474c0855c6f2a2ce6..d097ee63eb97142716aaf3375d1c3aabdcadf977 100755 (executable)
 
 #include "cpu/o3/isa_specific.hh"
 
+class EndQuiesceEvent;
+namespace Kernel {
+    class Statistics;
+};
+
+class TranslatingPort;
+
 /**
  * Derived ThreadContext class for use with the O3CPU.  It
  * provides the interface for any external objects to access a
index fccabaf3633fed3f49c1a3a8ebf40f4a73caecaf..cfb71f623889f73dd4ce90ed698e756b995fbb42 100755 (executable)
@@ -30,6 +30,7 @@
  */
 
 #include "cpu/o3/thread_context.hh"
+#include "cpu/quiesce_event.hh"
 
 using namespace TheISA;
 
index 3c79e1116889fefb0f9925ba903b2112bd94e69a..70d70514419b29ac9e63f00f75235c853fcf17b9 100644 (file)
@@ -247,6 +247,11 @@ class ThreadContext
 
     // Same with st cond failures.
     virtual Counter readFuncExeInst() = 0;
+
+    // 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 calls the exit syscall.
+    virtual int exit() { return 1; };
 #endif
 
     virtual void changeRegFileContext(RegFile::ContextParam param,
index 848b6f8696c529af5e6d9f31b80d604a40fae94e..e72890612d5b9f556718e5f5cf7cd421757aeeb6 100644 (file)
@@ -27,7 +27,6 @@
  *
  * Authors: Steve Reinhardt
  *          Ali Saidi
- *          Korey Sewell
  */
 
 #include <fcntl.h>
@@ -92,7 +91,9 @@ SyscallReturn
 exitFunc(SyscallDesc *desc, int callnum, Process *process,
          ThreadContext *tc)
 {
-    exitSimLoop("target called exit()", tc->getSyscallArg(0) & 0xff);
+    if (tc->exit()) {
+        exitSimLoop("target called exit()", tc->getSyscallArg(0) & 0xff);
+    }
 
     return 1;
 }