diff options
author | Steve Reinhardt <stever@eecs.umich.edu> | 2006-05-18 22:54:19 -0400 |
---|---|---|
committer | Steve Reinhardt <stever@eecs.umich.edu> | 2006-05-18 22:54:19 -0400 |
commit | 86777c9db174c74be49667bce3dda99f8ba23696 (patch) | |
tree | 977260677d5e3f726811d919a0b1a36251398a59 /cpu/simple/timing.cc | |
parent | 796fa429fef8b038278c4a020374149d8b5ef8eb (diff) | |
download | gem5-86777c9db174c74be49667bce3dda99f8ba23696.tar.xz |
First steps toward getting full system to work with
TimingSimpleCPU. Not there yet.
cpu/simple/atomic.cc:
Only read SC result if store was an SC.
Don't fake SC here; fake it in PhysicalMemory so
all CPU models can share in the joy.
cpu/simple/timing.cc:
Don't forget to checkForInterrupts().
Only fetch subsequent instruction if we're still running
(i.e. not quiesced).
dev/io_device.hh:
Initialize port pointer in SendEvent object.
mem/physical.cc:
Move fake SC "implementation" here from AtomicSimpleCPU.
mem/request.hh:
Initialize flags to all clear, not uninitialized.
Otherwise we can't reliably look at flags w/o explicitly
setting them every time we create a request.
--HG--
extra : convert_revision : ae7601ce6fb54c54e19848aa5391327f9a6e61a6
Diffstat (limited to 'cpu/simple/timing.cc')
-rw-r--r-- | cpu/simple/timing.cc | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/cpu/simple/timing.cc b/cpu/simple/timing.cc index 80d3380a5..70b88c4b1 100644 --- a/cpu/simple/timing.cc +++ b/cpu/simple/timing.cc @@ -75,6 +75,9 @@ TimingSimpleCPU::CpuPort::recvFunctional(Packet *pkt) void TimingSimpleCPU::CpuPort::recvStatusChange(Status status) { + if (status == RangeChange) + return; + panic("TimingSimpleCPU doesn't expect recvStatusChange callback!"); } @@ -342,6 +345,8 @@ TimingSimpleCPU::write(int32_t data, Addr addr, unsigned flags, uint64_t *res) void TimingSimpleCPU::fetch() { + checkForInterrupts(); + Request *ifetch_req = new Request(true); ifetch_req->setSize(sizeof(MachInst)); @@ -380,7 +385,12 @@ TimingSimpleCPU::completeInst(Fault fault) advancePC(fault); - fetch(); + if (_status == Running) { + // kick off fetch of next instruction... callback from icache + // response will cause that instruction to be executed, + // keeping the CPU running. + fetch(); + } } @@ -397,6 +407,7 @@ TimingSimpleCPU::completeIfetch() Fault fault = curStaticInst->initiateAcc(this, traceData); assert(fault == NoFault); assert(_status == DcacheWaitResponse); + // instruction will complete in dcache response callback } else { // non-memory instruction: execute completely now Fault fault = curStaticInst->execute(this, traceData); |