summaryrefslogtreecommitdiff
path: root/cpu/simple/atomic.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cpu/simple/atomic.cc')
-rw-r--r--cpu/simple/atomic.cc15
1 files changed, 12 insertions, 3 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);
}