diff options
Diffstat (limited to 'cpu/simple')
-rw-r--r-- | cpu/simple/atomic.cc | 15 | ||||
-rw-r--r-- | cpu/simple/base.cc | 3 |
2 files changed, 13 insertions, 5 deletions
diff --git a/cpu/simple/atomic.cc b/cpu/simple/atomic.cc index 8c38fe0d4..35a69cd4a 100644 --- a/cpu/simple/atomic.cc +++ b/cpu/simple/atomic.cc @@ -100,6 +100,9 @@ AtomicSimpleCPU::CpuPort::recvFunctional(Packet &pkt) void AtomicSimpleCPU::CpuPort::recvStatusChange(Status status) { + if (status == RangeChange) + return; + panic("AtomicSimpleCPU doesn't expect recvStatusChange callback!"); } @@ -227,10 +230,13 @@ AtomicSimpleCPU::suspendContext(int thread_num) assert(cpuXC); assert(_status == Running); - assert(tickEvent.scheduled()); + + // tick event may not be scheduled if this gets called from inside + // an instruction's execution, e.g. "quiesce" + if (tickEvent.scheduled()) + tickEvent.deschedule(); notIdleFraction--; - tickEvent.deschedule(); _status = Idle; } @@ -417,6 +423,8 @@ AtomicSimpleCPU::tick() for (int i = 0; i < width; ++i) { numCycles++; + checkForInterrupts(); + ifetch_req->resetMin(); ifetch_pkt->reset(); Fault fault = setupFetchPacket(ifetch_pkt); @@ -452,7 +460,8 @@ AtomicSimpleCPU::tick() advancePC(fault); } - tickEvent.schedule(curTick + latency); + if (_status != Idle) + tickEvent.schedule(curTick + latency); } diff --git a/cpu/simple/base.cc b/cpu/simple/base.cc index 40868e74d..30c002ed5 100644 --- a/cpu/simple/base.cc +++ b/cpu/simple/base.cc @@ -307,8 +307,7 @@ void BaseSimpleCPU::checkForInterrupts() { #if FULL_SYSTEM - if (checkInterrupts && check_interrupts() && !cpuXC->inPalMode() && - status() != IcacheAccessComplete) { + if (checkInterrupts && check_interrupts() && !cpuXC->inPalMode()) { int ipl = 0; int summary = 0; checkInterrupts = false; |