uint64_t pmcgetctr(uint32_t coreno, uint32_t regno) { PmcCtr *p; Mach *mp; uint64_t v; if(coreno == machp()->machno){ v = getctr(regno); if (pmcdebug) { print("int getctr[%#ux, %#ux] = %#llux\n", regno, coreno, v); } return v; } mp = sys->machptr[coreno]; p = &mp->pmc[regno]; ilock(&mp->pmclock); p->ctrset |= PmcGet; if(shouldipi(mp)){ waitnotstale(mp, p); ilock(&mp->pmclock); } v = p->ctr; iunlock(&mp->pmclock); if (pmcdebug) { print("ext getctr[%#ux, %#ux] = %#llux\n", regno, coreno, v); } return v; }
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); } }
u64int pmcgetctr(u32int coreno, u32int regno) { PmcCtr *p; Mach *mp; u64int v; if(coreno == m->machno){ v = getctr(regno); if (pmcdebug) { print("int getctr[%#ux, %#ux] = %#llux\n", regno, coreno, v); } return v; } mp = sys->machptr[coreno]; p = &mp->pmc[regno]; ilock(&mp->pmclock); p->ctrset |= PmcGet; p->stale = 1; if(mp->proc != nil || mp->nixtype != NIXAC){ waitnotstale(mp, p); ilock(&mp->pmclock); } v = p->ctr; iunlock(&mp->pmclock); if (pmcdebug) { print("ext getctr[%#ux, %#ux] = %#llux\n", regno, coreno, v); } return v; }