summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNathan Binkert <nate@binkert.org>2009-01-24 07:27:21 -0800
committerNathan Binkert <nate@binkert.org>2009-01-24 07:27:21 -0800
commitf0fb3ac060234ed5860c8d5bca3e84dbd8d30c36 (patch)
tree89c7c0673592e9abc1f7b79189ea7357c6ec1154 /src
parent56d5212ba7a3588feb8ce0ed5d3a31c704106730 (diff)
downloadgem5-f0fb3ac060234ed5860c8d5bca3e84dbd8d30c36.tar.xz
cpu: provide a wakeup mechanism that can be used to pull CPUs out of sleep.
Make interrupts use the new wakeup method, and pull all of the interrupt stuff into the cpu base class so that only the wakeup code needs to be updated. I tried to make wakeup, wakeCPU, and the various other mechanisms for waking and sleeping a little more sane, but I couldn't understand why the statistics were changing the way they were. Maybe we'll try again some day.
Diffstat (limited to 'src')
-rw-r--r--src/cpu/base.cc18
-rw-r--r--src/cpu/base.hh23
-rw-r--r--src/cpu/o3/cpu.cc27
-rw-r--r--src/cpu/o3/cpu.hh7
-rw-r--r--src/cpu/ozone/cpu.hh2
-rw-r--r--src/cpu/ozone/cpu_impl.hh4
-rw-r--r--src/cpu/simple/base.cc11
-rw-r--r--src/cpu/simple/base.hh2
8 files changed, 47 insertions, 47 deletions
diff --git a/src/cpu/base.cc b/src/cpu/base.cc
index 167606135..29095f12a 100644
--- a/src/cpu/base.cc
+++ b/src/cpu/base.cc
@@ -390,24 +390,6 @@ BaseCPU::ProfileEvent::process()
}
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)
{
SERIALIZE_SCALAR(instCnt);
diff --git a/src/cpu/base.hh b/src/cpu/base.hh
index 83d73ede0..c8215e047 100644
--- a/src/cpu/base.hh
+++ b/src/cpu/base.hh
@@ -125,9 +125,26 @@ class BaseCPU : public MemObject
return interrupts;
}
- virtual void postInterrupt(int int_num, int index);
- virtual void clearInterrupt(int int_num, int index);
- virtual void clearInterrupts();
+ virtual void wakeup() = 0;
+
+ void
+ postInterrupt(int int_num, int index)
+ {
+ interrupts->post(int_num, index);
+ wakeup();
+ }
+
+ void
+ clearInterrupt(int int_num, int index)
+ {
+ interrupts->clear(int_num, index);
+ }
+
+ void
+ clearInterrupts()
+ {
+ interrupts->clearAll();
+ }
bool
checkInterrupts(ThreadContext *tc) const
diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc
index f567c1868..4f6d5d41c 100644
--- a/src/cpu/o3/cpu.cc
+++ b/src/cpu/o3/cpu.cc
@@ -894,18 +894,6 @@ FullO3CPU<Impl>::activateWhenReady(int tid)
#if FULL_SYSTEM
template <class Impl>
-void
-FullO3CPU<Impl>::postInterrupt(int int_num, int index)
-{
- BaseCPU::postInterrupt(int_num, index);
-
- if (this->thread[0]->status() == ThreadContext::Suspended) {
- DPRINTF(IPI,"Suspended Processor awoke\n");
- this->threadContexts[0]->activate();
- }
-}
-
-template <class Impl>
Fault
FullO3CPU<Impl>::hwrei(unsigned tid)
{
@@ -1689,6 +1677,21 @@ FullO3CPU<Impl>::wakeCPU()
schedule(tickEvent, nextCycle());
}
+#if FULL_SYSTEM
+template <class Impl>
+void
+FullO3CPU<Impl>::wakeup()
+{
+ if (this->thread[0]->status() != ThreadContext::Suspended)
+ return;
+
+ this->wakeCPU();
+
+ DPRINTF(Quiesce, "Suspended Processor woken\n");
+ this->threadContexts[0]->activate();
+}
+#endif
+
template <class Impl>
int
FullO3CPU<Impl>::getFreeTid()
diff --git a/src/cpu/o3/cpu.hh b/src/cpu/o3/cpu.hh
index d24e8c383..d14001d0d 100644
--- a/src/cpu/o3/cpu.hh
+++ b/src/cpu/o3/cpu.hh
@@ -402,9 +402,6 @@ class FullO3CPU : public BaseO3CPU
void trap(Fault fault, unsigned tid);
#if FULL_SYSTEM
- /** Posts an interrupt. */
- void postInterrupt(int int_num, int index);
-
/** HW return from error interrupt. */
Fault hwrei(unsigned tid);
@@ -701,6 +698,10 @@ class FullO3CPU : public BaseO3CPU
/** Wakes the CPU, rescheduling the CPU if it's not already active. */
void wakeCPU();
+#if FULL_SYSTEM
+ virtual void wakeup();
+#endif
+
/** Gets a free thread id. Use if thread ids change across system. */
int getFreeTid();
diff --git a/src/cpu/ozone/cpu.hh b/src/cpu/ozone/cpu.hh
index 6b5e7282d..55ad7b3fb 100644
--- a/src/cpu/ozone/cpu.hh
+++ b/src/cpu/ozone/cpu.hh
@@ -333,7 +333,7 @@ class OzoneCPU : public BaseCPU
Status _status;
public:
- void postInterrupt(int int_num, int index);
+ void wakeup();
void zero_fill_64(Addr addr) {
static int warned = 0;
diff --git a/src/cpu/ozone/cpu_impl.hh b/src/cpu/ozone/cpu_impl.hh
index 1402f4b72..84ee69464 100644
--- a/src/cpu/ozone/cpu_impl.hh
+++ b/src/cpu/ozone/cpu_impl.hh
@@ -582,10 +582,8 @@ OzoneCPU<Impl>::dbg_vtophys(Addr addr)
#if FULL_SYSTEM
template <class Impl>
void
-OzoneCPU<Impl>::postInterrupt(int int_num, int index)
+OzoneCPU<Impl>::wakeup()
{
- BaseCPU::postInterrupt(int_num, index);
-
if (_status == Idle) {
DPRINTF(IPI,"Suspended Processor awoke\n");
// thread.activate();
diff --git a/src/cpu/simple/base.cc b/src/cpu/simple/base.cc
index 3c154afb6..89d9ce383 100644
--- a/src/cpu/simple/base.cc
+++ b/src/cpu/simple/base.cc
@@ -303,14 +303,13 @@ BaseSimpleCPU::dbg_vtophys(Addr addr)
#if FULL_SYSTEM
void
-BaseSimpleCPU::postInterrupt(int int_num, int index)
+BaseSimpleCPU::wakeup()
{
- BaseCPU::postInterrupt(int_num, index);
+ if (thread->status() != ThreadContext::Suspended)
+ return;
- if (thread->status() == ThreadContext::Suspended) {
- DPRINTF(Quiesce,"Suspended Processor awoke\n");
- thread->activate();
- }
+ DPRINTF(Quiesce,"Suspended Processor awoke\n");
+ thread->activate();
}
#endif // FULL_SYSTEM
diff --git a/src/cpu/simple/base.hh b/src/cpu/simple/base.hh
index 6e72b8f6c..34d0f5954 100644
--- a/src/cpu/simple/base.hh
+++ b/src/cpu/simple/base.hh
@@ -98,7 +98,7 @@ class BaseSimpleCPU : public BaseCPU
}
public:
- void postInterrupt(int int_num, int index);
+ void wakeup();
void zero_fill_64(Addr addr) {
static int warned = 0;