summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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;