static int perf_proc_irq(void) { unsigned long snapshot; /* * It would be nice to do this as a loop, but we don't have * indirect access to CP0 registers. */ snapshot = read_c0_perfcntr0(); if ((long)snapshot < 0) { extencount[0] += (unsigned long long)((unsigned)read_c0_perfcntr0()); write_c0_perfcntr0(0); } snapshot = read_c0_perfcntr1(); if ((long)snapshot < 0) { extencount[1] += (unsigned long long)((unsigned)read_c0_perfcntr1()); write_c0_perfcntr1(0); } snapshot = read_c0_perfcntr2(); if ((long)snapshot < 0) { extencount[2] += (unsigned long long)((unsigned)read_c0_perfcntr2()); write_c0_perfcntr2(0); } snapshot = read_c0_perfcntr3(); if ((long)snapshot < 0) { extencount[3] += (unsigned long long)((unsigned)read_c0_perfcntr3()); write_c0_perfcntr3(0); } return 0; }
static int proc_read_perf(char *page, char **start, off_t off, int count, int *eof, void *data) { int totalen = 0; int len; len = sprintf(page, "PerfCnt[0].Ctl : 0x%08x\n", read_c0_perfctrl0()); totalen += len; page += len; len = sprintf(page, "PerfCnt[0].Cnt : %Lu\n", extencount[0] + (unsigned long long)((unsigned)read_c0_perfcntr0())); totalen += len; page += len; len = sprintf(page, "PerfCnt[1].Ctl : 0x%08x\n", read_c0_perfctrl1()); totalen += len; page += len; len = sprintf(page, "PerfCnt[1].Cnt : %Lu\n", extencount[1] + (unsigned long long)((unsigned)read_c0_perfcntr1())); totalen += len; page += len; len = sprintf(page, "PerfCnt[2].Ctl : 0x%08x\n", read_c0_perfctrl2()); totalen += len; page += len; len = sprintf(page, "PerfCnt[2].Cnt : %Lu\n", extencount[2] + (unsigned long long)((unsigned)read_c0_perfcntr2())); totalen += len; page += len; len = sprintf(page, "PerfCnt[3].Ctl : 0x%08x\n", read_c0_perfctrl3()); totalen += len; page += len; len = sprintf(page, "PerfCnt[3].Cnt : %Lu\n", extencount[3] + (unsigned long long)((unsigned)read_c0_perfcntr3())); totalen += len; page += len; return totalen; }
void read_cntrs(unsigned int *c0, unsigned int *c1) { *c0 = read_c0_perfcntr0(); *c1 = read_c0_perfcntr1(); }