diff -r 1676b148c47b -r ca3202df990f src/cpu/BaseCPU.py --- a/src/cpu/BaseCPU.py Sat Jul 10 02:13:36 2010 +0100 +++ b/src/cpu/BaseCPU.py Sat Jul 10 02:13:51 2010 +0100 @@ -185,6 +185,12 @@ self.l2cache.cpu_side = self.toL2Bus.port self._mem_ports = ['l2cache.mem_side'] + def getInstsExecuted(self, thread_num): + return self._ccObject.getInstsExecuted(thread_num) + + def setMaxInsts(self, insts): + self._ccObject.setMaxInsts(insts) + if buildEnv['TARGET_ISA'] == 'mips': CP0_IntCtl_IPTI = Param.Unsigned(0,"No Description") CP0_IntCtl_IPPCI = Param.Unsigned(0,"No Description") diff -r 1676b148c47b -r ca3202df990f src/cpu/base.hh --- a/src/cpu/base.hh Sat Jul 10 02:13:36 2010 +0100 +++ b/src/cpu/base.hh Sat Jul 10 02:13:51 2010 +0100 @@ -226,6 +226,9 @@ /// sampling. virtual void takeOverFrom(BaseCPU *, Port *ic, Port *dc, bool connectMem); + /** Set the maximum number of instructions for all threads to execute. */ + void setMaxInsts(uint64_t insts); + /** * Number of threads we're actually simulating (<= SMT_MAX_THREADS). * This is a constant for the duration of the simulation. diff -r 1676b148c47b -r ca3202df990f src/cpu/base.cc --- a/src/cpu/base.cc Sat Jul 10 02:13:36 2010 +0100 +++ b/src/cpu/base.cc Sat Jul 10 02:13:51 2010 +0100 @@ -450,3 +450,21 @@ functionEntryTick = curTick; } } + +void +BaseCPU::setMaxInsts(uint64_t insts) +{ + if (insts != 0) { + const char *cause = "all threads reached the max instruction count"; + + // allocate & initialize shared downcounter: each event will + // decrement this when triggered; simulation will terminate + // when counter reaches 0 + int *counter = new int; + *counter = numThreads; + for (ThreadID tid = 0; tid < numThreads; ++tid) { + Event *event = new CountedExitEvent(cause, *counter); + comInstEventQueue[tid]->schedule(event, insts); + } + } +} diff -r 1676b148c47b -r ca3202df990f src/cpu/o3/cpu.hh --- a/src/cpu/o3/cpu.hh Sat Jul 10 02:13:36 2010 +0100 +++ b/src/cpu/o3/cpu.hh Sat Jul 10 02:13:51 2010 +0100 @@ -362,6 +362,14 @@ /** Takes over from another CPU. */ virtual void takeOverFrom(BaseCPU *oldCPU, bool connectMem); + /** Get the number of instructions executed by this CPU and thread. */ + virtual Counter + getInstsExecuted(int thread_num) + { + assert(thread_num < thread.size()); + return thread[thread_num]->numInst; + } + /** Get the current instruction sequence number, and increment it. */ InstSeqNum getAndIncrementInstSeq() { return globalSeqNum++; } diff -r 1676b148c47b -r ca3202df990f src/cpu/simple/base.hh --- a/src/cpu/simple/base.hh Sat Jul 10 02:13:36 2010 +0100 +++ b/src/cpu/simple/base.hh Sat Jul 10 02:13:51 2010 +0100 @@ -195,6 +195,13 @@ return numInst - startNumInst; } + /** Get the number of instructions executed by this CPU and thread. */ + virtual Counter + getInstsExecuted(int thread_num) + { + return totalInstructions(); + } + // Mask to align PCs to MachInst sized boundaries static const Addr PCMask = ~((Addr)sizeof(TheISA::MachInst) - 1); diff -r 1676b148c47b -r ca3202df990f src/python/swig/sim_object.i --- a/src/python/swig/sim_object.i Sat Jul 10 02:13:36 2010 +0100 +++ b/src/python/swig/sim_object.i Sat Jul 10 02:13:51 2010 +0100 @@ -54,6 +54,8 @@ void resume(); void switchOut(); void takeOverFrom(BaseCPU *cpu, bool connectMem); + void setMaxInsts(uint64_t insts); + Counter getInstsExecuted(int thread_num); SimObject(const SimObjectParams *p); }; diff -r 1676b148c47b -r ca3202df990f src/sim/eventq.hh --- a/src/sim/eventq.hh Sat Jul 10 02:13:36 2010 +0100 +++ b/src/sim/eventq.hh Sat Jul 10 02:13:51 2010 +0100 @@ -486,7 +486,6 @@ inline void EventQueue::schedule(Event *event, Tick when) { - assert((UTick)when >= (UTick)curTick); assert(!event->scheduled()); assert(event->initialized()); diff -r 1676b148c47b -r ca3202df990f src/sim/sim_object.hh --- a/src/sim/sim_object.hh Sat Jul 10 02:13:36 2010 +0100 +++ b/src/sim/sim_object.hh Sat Jul 10 02:13:51 2010 +0100 @@ -126,6 +126,8 @@ virtual void setMemoryMode(State new_mode); virtual void switchOut(); virtual void takeOverFrom(BaseCPU *cpu, bool connectMem); + virtual void setMaxInsts(uint64_t insts); + virtual Counter getInstsExecuted(int thread_num); #ifdef DEBUG public: diff -r 1676b148c47b -r ca3202df990f src/sim/sim_object.cc --- a/src/sim/sim_object.cc Sat Jul 10 02:13:36 2010 +0100 +++ b/src/sim/sim_object.cc Sat Jul 10 02:13:51 2010 +0100 @@ -269,6 +269,18 @@ panic("Unimplemented!"); } +void +SimObject::setMaxInsts(uint64_t insts) +{ + panic("Unimplemented!"); +} + +Counter +SimObject::getInstsExecuted(int thread_num) +{ + panic("Unimplemented!"); + return 0; +} SimObject * SimObject::find(const char *name)