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:
parent
56d5212ba7
commit
f0fb3ac060
8 changed files with 47 additions and 47 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue