int pmcsetctr(uint32_t coreno, uint64_t v, uint32_t regno) { PmcCtr *p; Mach *mp; if(coreno == machp()->machno){ if (pmcdebug) { print("int getctr[%#ux, %#ux] = %#llux\n", regno, coreno, v); } return setctr(v, regno); } mp = sys->machptr[coreno]; p = &mp->pmc[regno]; if (pmcdebug) { print("ext setctr[%#ux, %#ux] = %#llux\n", regno, coreno, v); } ilock(&mp->pmclock); p->ctr = v; p->ctrset |= PmcSet; if(shouldipi(mp)) waitnotstale(mp, p); else iunlock(&mp->pmclock); return 0; }
void pmcupdate(Mach *m) { PmcCtr *p; int i, maxct, wk; PmcWait *w; return; maxct = pmcnregs(); for (i = 0; i < maxct; i++) { p = &m->pmc[i]; ilock(&m->pmclock); if(p->ctrset & PmcSet) setctr(p->ctr, i); if(p->ctlset & PmcSet) setctl(&p->PmcCtl, i); p->ctr = getctr(i); getctl(&p->PmcCtl, i); p->ctrset = PmcIgn; p->ctlset = PmcIgn; wk = p->stale; p->stale = 0; if(wk){ for(w = p->wq; w != nil; w = w->next){ p->wq = w->next; wakeup(&w->rend); pmcwclose(w); } } iunlock(&m->pmclock); } }
int pmcsetctr(u32int coreno, u64int v, u32int regno) { PmcCtr *p; Mach *mp; if(coreno == m->machno){ if (pmcdebug) { print("int getctr[%#ux, %#ux] = %#llux\n", regno, coreno, v); } return setctr(v, regno); } mp = sys->machptr[coreno]; p = &mp->pmc[regno]; if (pmcdebug) { print("ext setctr[%#ux, %#ux] = %#llux\n", regno, coreno, v); } ilock(&mp->pmclock); p->ctr = v; p->ctrset |= PmcSet; p->stale = 1; if(mp->proc != nil || mp->nixtype != NIXAC) waitnotstale(mp, p); else iunlock(&mp->pmclock); return 0; }