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.
This commit is contained in:
Nathan Binkert 2009-01-24 07:27:21 -08:00
parent 56d5212ba7
commit f0fb3ac060
8 changed files with 47 additions and 47 deletions

View file

@ -389,24 +389,6 @@ BaseCPU::ProfileEvent::process()
cpu->schedule(this, curTick + interval);
}
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)
{

View file

@ -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

View file

@ -893,18 +893,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()

View file

@ -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();

View file

@ -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;

View file

@ -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();

View file

@ -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

View file

@ -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;