summaryrefslogtreecommitdiff
path: root/src/sim
diff options
context:
space:
mode:
authorSteve Reinhardt <steve.reinhardt@amd.com>2009-04-15 13:13:47 -0700
committerSteve Reinhardt <steve.reinhardt@amd.com>2009-04-15 13:13:47 -0700
commit8882dc1283771463a20194c083f4b8940a2d574b (patch)
treed33aa3b7b59a4a466d43643e0b8bc64acc66e951 /src/sim
parent9b66e8289781025bbc4d0e152737fa7c5d024ec8 (diff)
downloadgem5-8882dc1283771463a20194c083f4b8940a2d574b.tar.xz
Get rid of the Unallocated thread context state.
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.
Diffstat (limited to 'src/sim')
-rw-r--r--src/sim/process.cc2
-rw-r--r--src/sim/syscall_emul.cc9
-rw-r--r--src/sim/system.cc11
-rw-r--r--src/sim/system.hh10
4 files changed, 25 insertions, 7 deletions
diff --git a/src/sim/process.cc b/src/sim/process.cc
index 4be97f2f6..c45844a51 100644
--- a/src/sim/process.cc
+++ b/src/sim/process.cc
@@ -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;
}
diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc
index 5fe30c269..f0a693db0 100644
--- a/src/sim/syscall_emul.cc
+++ b/src/sim/syscall_emul.cc
@@ -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;
diff --git a/src/sim/system.cc b/src/sim/system.cc
index d16524c41..f10167bba 100644
--- a/src/sim/system.cc
+++ b/src/sim/system.cc
@@ -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()
{
diff --git a/src/sim/system.hh b/src/sim/system.hh
index bfa5ea8bb..e1c30490b 100644
--- a/src/sim/system.hh
+++ b/src/sim/system.hh
@@ -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;