void SamplerPeriodic::queue(uint32_t insn, uint64_t pc, uint64_t addr, FlowID fid, char op, uint64_t icount, void *env) /* main qemu/gpu/tracer/... entry point {{{1 */ { I(fid < emul->getNumEmuls()); if(likely(!execute(fid, icount))) return; // QEMU can still send a few additional instructions (emul should stop soon) I(insn); // process the current sample mode if (nextSwitch>totalnInst) { if (mode == EmuRabbit || mode == EmuInit) return; if (mode == EmuDetail || mode == EmuTiming) { emul->queueInstruction(insn,pc,addr, (op&0xc0) /* thumb */ ,fid, env, getStatsFlag()); return; } I(mode == EmuWarmup); doWarmupOpAddr(op, addr); return; } // We did enough if (isItDone()) return; // We are not done yet though. Look for the new mode I(nextSwitch <= totalnInst); coordinateWithOthersAndNextMode(fid); I(mode == next_mode); //it was a detailed sync }
void SamplerSMARTS::queue(uint32_t insn, uint64_t pc, uint64_t addr, FlowID fid, char op, uint64_t icount, void *env) /* main qemu/gpu/tracer/... entry point {{{1 */ { I(fid < emul->getNumEmuls()); if(likely(!execute(fid, icount))) return; // QEMU can still send a few additional instructions (emul should stop soon) I(mode!=EmuInit); I(insn); // process the current sample mode if (getNextSwitch()>totalnInst) { if (mode == EmuRabbit || mode == EmuInit) return; if (mode == EmuDetail || mode == EmuTiming) { emul->queueInstruction(insn,pc,addr, (op&0xc0) /* thumb */ ,fid, env, getStatsFlag()); return; } I(mode == EmuWarmup); doWarmupOpAddr(op, addr); return; } // Look for the new mode I(getNextSwitch() <= totalnInst); // I(mode != next_mode); pthread_mutex_lock (&mode_lock); // if (getNextSwitch() > totalnInst){//another thread just changed the mode pthread_mutex_unlock (&mode_lock); return; } lastMode = mode; nextMode(ROTATE, fid); if (lastMode == EmuTiming) { // timing is going to be over if (getTime()>=maxnsTime || totalnInst>=nInstMax) { markDone(); pthread_mutex_unlock (&mode_lock); return; } if (doPower) { uint64_t mytime = getTime(); int64_t ti = mytime - lastTime; I(ti > 0); ti = (static_cast<int64_t>(freq)*ti)/1e9; BootLoader::getPowerModelPtr()->setSamplingRatio(getSamplingRatio()); BootLoader::getPowerModelPtr()->calcStats(ti, !(lastMode == EmuTiming), fid); lastTime = mytime; updateCPI(fid); if (doTherm) { BootLoader::getPowerModelPtr()->updateSescTherm(ti); } } } pthread_mutex_unlock (&mode_lock); }