INLINE void cpu_reset_instcount_and_cputime(REGS* regs) { /* Reset instruction counts, I/O counts and real CPU time */ regs->prevcount = 0; regs->instcount = 0; regs->mipsrate = 0; regs->siocount = 0; regs->siosrate = 0; regs->siototal = 0; regs->cpupct = 0; regs->rcputime = 0; regs->bcputime = thread_cputime_us(regs); }
/*-------------------------------------------------------------------*/ int ARCH_DEP(cpu_reset) (REGS *regs) { int i, rc = 0; /* Array subscript */ regs->ip = regs->inst; /* Clear indicators */ regs->loadstate = 0; regs->checkstop = 0; regs->sigpreset = 0; regs->extccpu = 0; for (i = 0; i < sysblk.maxcpu; i++) regs->emercpu[i] = 0; regs->instinvalid = 1; regs->instcount = regs->prevcount = 0; /* Clear interrupts */ SET_IC_INITIAL_MASK(regs); SET_IC_INITIAL_STATE(regs); /* Clear the translation exception identification */ regs->EA_G = 0; regs->excarid = 0; /* Clear monitor code */ regs->MC_G = 0; /* Purge the lookaside buffers */ ARCH_DEP(purge_tlb) (regs); #if defined(FEATURE_ACCESS_REGISTERS) ARCH_DEP(purge_alb) (regs); #endif /*defined(FEATURE_ACCESS_REGISTERS)*/ if(regs->host) { /* Put the CPU into the stopped state */ regs->opinterv = 0; regs->cpustate = CPUSTATE_STOPPED; ON_IC_INTERRUPT(regs); } #ifdef FEATURE_INTERVAL_TIMER ARCH_DEP(store_int_timer_nolock) (regs); #endif if(regs->host && regs->guestregs) { rc = ARCH_DEP(cpu_reset)(regs->guestregs); /* CPU state of SIE copy cannot be controlled */ regs->guestregs->opinterv = 0; regs->guestregs->cpustate = CPUSTATE_STARTED; } /* Initialize Architecture Level Set */ init_als(regs); /* Reset real CPU time used */ regs->rcputime = 0; regs->bcputime = thread_cputime_us(regs); return rc; } /* end function cpu_reset */