diff options
Diffstat (limited to 'src/cpu')
-rw-r--r-- | src/cpu/cpu_exec_context.cc | 12 | ||||
-rw-r--r-- | src/cpu/cpu_models.py | 3 | ||||
-rw-r--r-- | src/cpu/simple/atomic.cc | 34 | ||||
-rw-r--r-- | src/cpu/simple/atomic.hh | 4 | ||||
-rw-r--r-- | src/cpu/simple/base.cc | 6 | ||||
-rw-r--r-- | src/cpu/simple/timing.cc | 72 | ||||
-rw-r--r-- | src/cpu/simple/timing.hh | 12 |
7 files changed, 67 insertions, 76 deletions
diff --git a/src/cpu/cpu_exec_context.cc b/src/cpu/cpu_exec_context.cc index ec1e94561..b8aa9a67e 100644 --- a/src/cpu/cpu_exec_context.cc +++ b/src/cpu/cpu_exec_context.cc @@ -80,12 +80,14 @@ CPUExecContext::CPUExecContext(BaseCPU *_cpu, int _thread_num, System *_sys, profilePC = 3; Port *mem_port; - physPort = new FunctionalPort(); + physPort = new FunctionalPort(csprintf("%s-%d-funcport", + cpu->name(), thread_num)); mem_port = system->physmem->getPort("functional"); mem_port->setPeer(physPort); physPort->setPeer(mem_port); - virtPort = new VirtualPort(); + virtPort = new VirtualPort(csprintf("%s-%d-vport", + cpu->name(), thread_num)); mem_port = system->physmem->getPort("functional"); mem_port->setPeer(virtPort); virtPort->setPeer(mem_port); @@ -100,7 +102,9 @@ CPUExecContext::CPUExecContext(BaseCPU *_cpu, int _thread_num, { /* Use this port to for syscall emulation writes to memory. */ Port *mem_port; - port = new TranslatingPort(process->pTable, false); + port = new TranslatingPort(csprintf("%s-%d-funcport", + cpu->name(), thread_num), + process->pTable, false); mem_port = memobj->getPort("functional"); mem_port->setPeer(port); port->setPeer(mem_port); @@ -300,7 +304,7 @@ CPUExecContext::getVirtPort(ExecContext *xc) VirtualPort *vp; Port *mem_port; - vp = new VirtualPort(xc); + vp = new VirtualPort("xc-vport", xc); mem_port = system->physmem->getPort("functional"); mem_port->setPeer(vp); vp->setPeer(mem_port); diff --git a/src/cpu/cpu_models.py b/src/cpu/cpu_models.py index 30cbabde1..8d0a15f61 100644 --- a/src/cpu/cpu_models.py +++ b/src/cpu/cpu_models.py @@ -62,9 +62,6 @@ CpuModel('AtomicSimpleCPU', 'atomic_simple_cpu_exec.cc', CpuModel('TimingSimpleCPU', 'timing_simple_cpu_exec.cc', '#include "cpu/simple/timing.hh"', { 'CPU_exec_context': 'TimingSimpleCPU' }) -CpuModel('FastCPU', 'fast_cpu_exec.cc', - '#include "cpu/fast/cpu.hh"', - { 'CPU_exec_context': 'FastCPU' }) CpuModel('FullCPU', 'full_cpu_exec.cc', '#include "encumbered/cpu/full/dyn_inst.hh"', { 'CPU_exec_context': 'DynInst' }) diff --git a/src/cpu/simple/atomic.cc b/src/cpu/simple/atomic.cc index e9422b9c0..3cad6e43f 100644 --- a/src/cpu/simple/atomic.cc +++ b/src/cpu/simple/atomic.cc @@ -117,7 +117,7 @@ AtomicSimpleCPU::CpuPort::recvRetry() AtomicSimpleCPU::AtomicSimpleCPU(Params *p) : BaseSimpleCPU(p), tickEvent(this), width(p->width), simulate_stalls(p->simulate_stalls), - icachePort(this), dcachePort(this) + icachePort(name() + "-iport", this), dcachePort(name() + "-iport", this) { _status = Idle; @@ -126,31 +126,23 @@ AtomicSimpleCPU::AtomicSimpleCPU(Params *p) // @todo fix me and get the real cpu iD!!! ifetch_req->setCpuNum(0); ifetch_req->setSize(sizeof(MachInst)); - ifetch_pkt = new Packet; - ifetch_pkt->cmd = Read; + ifetch_pkt = new Packet(ifetch_req, Packet::ReadReq, Packet::Broadcast); ifetch_pkt->dataStatic(&inst); - ifetch_pkt->req = ifetch_req; - ifetch_pkt->size = sizeof(MachInst); - ifetch_pkt->dest = Packet::Broadcast; data_read_req = new Request(true); // @todo fix me and get the real cpu iD!!! data_read_req->setCpuNum(0); data_read_req->setAsid(0); - data_read_pkt = new Packet; - data_read_pkt->cmd = Read; + data_read_pkt = new Packet(data_read_req, Packet::ReadReq, + Packet::Broadcast); data_read_pkt->dataStatic(&dataReg); - data_read_pkt->req = data_read_req; - data_read_pkt->dest = Packet::Broadcast; data_write_req = new Request(true); // @todo fix me and get the real cpu iD!!! data_write_req->setCpuNum(0); data_write_req->setAsid(0); - data_write_pkt = new Packet; - data_write_pkt->cmd = Write; - data_write_pkt->req = data_write_req; - data_write_pkt->dest = Packet::Broadcast; + data_write_pkt = new Packet(data_write_req, Packet::WriteReq, + Packet::Broadcast); } @@ -260,13 +252,12 @@ AtomicSimpleCPU::read(Addr addr, T &data, unsigned flags) // Now do the access. if (fault == NoFault) { data_read_pkt->reset(); - data_read_pkt->addr = data_read_req->getPaddr(); - data_read_pkt->size = sizeof(T); + data_read_pkt->reinitFromRequest(); dcache_complete = dcachePort.sendAtomic(data_read_pkt); dcache_access = true; - assert(data_read_pkt->result == Success); + assert(data_read_pkt->result == Packet::Success); data = data_read_pkt->get<T>(); } @@ -342,13 +333,12 @@ AtomicSimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res) data_write_pkt->reset(); data = htog(data); data_write_pkt->dataStatic(&data); - data_write_pkt->addr = data_write_req->getPaddr(); - data_write_pkt->size = sizeof(T); + data_write_pkt->reinitFromRequest(); dcache_complete = dcachePort.sendAtomic(data_write_pkt); dcache_access = true; - assert(data_write_pkt->result == Success); + assert(data_write_pkt->result == Packet::Success); if (res && data_write_req->getFlags() & LOCKED) { *res = data_write_req->getScResult(); @@ -435,10 +425,6 @@ AtomicSimpleCPU::tick() fault = curStaticInst->execute(this, traceData); postExecute(); - if (traceData) { - traceData->finalize(); - } - if (simulate_stalls) { // This calculation assumes that the icache and dcache // access latencies are always a multiple of the CPU's diff --git a/src/cpu/simple/atomic.hh b/src/cpu/simple/atomic.hh index d0ba085f0..ab3a3e8ef 100644 --- a/src/cpu/simple/atomic.hh +++ b/src/cpu/simple/atomic.hh @@ -84,8 +84,8 @@ class AtomicSimpleCPU : public BaseSimpleCPU public: - CpuPort(AtomicSimpleCPU *_cpu) - : cpu(_cpu) + CpuPort(const std::string &_name, AtomicSimpleCPU *_cpu) + : Port(_name), cpu(_cpu) { } protected: diff --git a/src/cpu/simple/base.cc b/src/cpu/simple/base.cc index 30c002ed5..18f170449 100644 --- a/src/cpu/simple/base.cc +++ b/src/cpu/simple/base.cc @@ -372,7 +372,7 @@ BaseSimpleCPU::setupFetchPacket(Packet *ifetch_pkt) Fault fault = cpuXC->translateInstReq(ifetch_req); if (fault == NoFault) { - ifetch_pkt->addr = ifetch_req->getPaddr(); + ifetch_pkt->reinitFromRequest(); } return fault; @@ -442,6 +442,10 @@ BaseSimpleCPU::postExecute() } traceFunctions(cpuXC->readPC()); + + if (traceData) { + traceData->finalize(); + } } diff --git a/src/cpu/simple/timing.cc b/src/cpu/simple/timing.cc index 70b88c4b1..7cdcdafa1 100644 --- a/src/cpu/simple/timing.cc +++ b/src/cpu/simple/timing.cc @@ -158,10 +158,11 @@ TimingSimpleCPU::suspendContext(int thread_num) assert(thread_num == 0); assert(cpuXC); - panic("TimingSimpleCPU::suspendContext not implemented"); - assert(_status == Running); + // just change status to Idle... if status != Running, + // completeInst() will not initiate fetch of next instruction. + notIdleFraction--; _status = Idle; } @@ -187,13 +188,9 @@ TimingSimpleCPU::read(Addr addr, T &data, unsigned flags) // Now do the access. if (fault == NoFault) { - Packet *data_read_pkt = new Packet; - data_read_pkt->cmd = Read; - data_read_pkt->req = data_read_req; + Packet *data_read_pkt = + new Packet(data_read_req, Packet::ReadReq, Packet::Broadcast); data_read_pkt->dataDynamic<T>(new T); - data_read_pkt->addr = data_read_req->getPaddr(); - data_read_pkt->size = sizeof(T); - data_read_pkt->dest = Packet::Broadcast; if (!dcachePort.sendTiming(data_read_pkt)) { _status = DcacheRetry; @@ -268,14 +265,10 @@ TimingSimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res) Fault fault = cpuXC->translateDataWriteReq(data_write_req); // Now do the access. if (fault == NoFault) { - Packet *data_write_pkt = new Packet; - data_write_pkt->cmd = Write; - data_write_pkt->req = data_write_req; + Packet *data_write_pkt = + new Packet(data_write_req, Packet::WriteReq, Packet::Broadcast); data_write_pkt->allocate(); - data_write_pkt->size = sizeof(T); data_write_pkt->set(data); - data_write_pkt->addr = data_write_req->getPaddr(); - data_write_pkt->dest = Packet::Broadcast; if (!dcachePort.sendTiming(data_write_pkt)) { _status = DcacheRetry; @@ -350,12 +343,8 @@ TimingSimpleCPU::fetch() Request *ifetch_req = new Request(true); ifetch_req->setSize(sizeof(MachInst)); - ifetch_pkt = new Packet; - ifetch_pkt->cmd = Read; + ifetch_pkt = new Packet(ifetch_req, Packet::ReadReq, Packet::Broadcast); ifetch_pkt->dataStatic(&inst); - ifetch_pkt->req = ifetch_req; - ifetch_pkt->size = sizeof(MachInst); - ifetch_pkt->dest = Packet::Broadcast; Fault fault = setupFetchPacket(ifetch_pkt); if (fault == NoFault) { @@ -369,20 +358,15 @@ TimingSimpleCPU::fetch() ifetch_pkt = NULL; } } else { - panic("TimingSimpleCPU fetch fault handling not implemented"); + // fetch fault: advance directly to next instruction (fault handler) + advanceInst(fault); } } void -TimingSimpleCPU::completeInst(Fault fault) +TimingSimpleCPU::advanceInst(Fault fault) { - postExecute(); - - if (traceData) { - traceData->finalize(); - } - advancePC(fault); if (_status == Running) { @@ -395,23 +379,35 @@ TimingSimpleCPU::completeInst(Fault fault) void -TimingSimpleCPU::completeIfetch() +TimingSimpleCPU::completeIfetch(Packet *pkt) { // received a response from the icache: execute the received // instruction + assert(pkt->result == Packet::Success); assert(_status == IcacheWaitResponse); _status = Running; + + delete pkt->req; + delete pkt; + preExecute(); - if (curStaticInst->isMemRef()) { + if (curStaticInst->isMemRef() && !curStaticInst->isDataPrefetch()) { // load or store: just send to dcache Fault fault = curStaticInst->initiateAcc(this, traceData); - assert(fault == NoFault); - assert(_status == DcacheWaitResponse); - // instruction will complete in dcache response callback + if (fault == NoFault) { + // successfully initiated access: instruction will + // complete in dcache response callback + assert(_status == DcacheWaitResponse); + } else { + // fault: complete now to invoke fault handler + postExecute(); + advanceInst(fault); + } } else { // non-memory instruction: execute completely now Fault fault = curStaticInst->execute(this, traceData); - completeInst(fault); + postExecute(); + advanceInst(fault); } } @@ -419,7 +415,7 @@ TimingSimpleCPU::completeIfetch() bool TimingSimpleCPU::IcachePort::recvTiming(Packet *pkt) { - cpu->completeIfetch(); + cpu->completeIfetch(pkt); return true; } @@ -441,13 +437,17 @@ TimingSimpleCPU::completeDataAccess(Packet *pkt) { // received a response from the dcache: complete the load or store // instruction - assert(pkt->result == Success); + assert(pkt->result == Packet::Success); assert(_status == DcacheWaitResponse); _status = Running; Fault fault = curStaticInst->completeAcc(pkt, this, traceData); - completeInst(fault); + delete pkt->req; + delete pkt; + + postExecute(); + advanceInst(fault); } diff --git a/src/cpu/simple/timing.hh b/src/cpu/simple/timing.hh index 83be025d9..b46631d5a 100644 --- a/src/cpu/simple/timing.hh +++ b/src/cpu/simple/timing.hh @@ -71,8 +71,8 @@ class TimingSimpleCPU : public BaseSimpleCPU public: - CpuPort(TimingSimpleCPU *_cpu) - : cpu(_cpu) + CpuPort(const std::string &_name, TimingSimpleCPU *_cpu) + : Port(_name), cpu(_cpu) { } protected: @@ -93,7 +93,7 @@ class TimingSimpleCPU : public BaseSimpleCPU public: IcachePort(TimingSimpleCPU *_cpu) - : CpuPort(_cpu) + : CpuPort(_cpu->name() + "-iport", _cpu) { } protected: @@ -108,7 +108,7 @@ class TimingSimpleCPU : public BaseSimpleCPU public: DcachePort(TimingSimpleCPU *_cpu) - : CpuPort(_cpu) + : CpuPort(_cpu->name() + "-dport", _cpu) { } protected: @@ -142,9 +142,9 @@ class TimingSimpleCPU : public BaseSimpleCPU Fault write(T data, Addr addr, unsigned flags, uint64_t *res); void fetch(); - void completeInst(Fault fault); - void completeIfetch(); + void completeIfetch(Packet *); void completeDataAccess(Packet *); + void advanceInst(Fault fault); }; #endif // __CPU_SIMPLE_TIMING_HH__ |