diff --git a/sys/src/9/pc64/trap.c b/sys/src/9/pc64/trap.c --- a/sys/src/9/pc64/trap.c +++ b/sys/src/9/pc64/trap.c @@ -28,6 +28,7 @@ enum Ntimevec = 20 /* number of time buckets for each intr */ }; ulong intrtimes[256][Ntimevec]; +ulong intrcount[256]; void intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf, char *name) @@ -153,6 +154,35 @@ irqallocread(Chan*, void *a, long n, vlo return 0; } +static long +irqstatread(Chan*, void *a, long n, vlong offset) +{ + char buf[READSTR]; + char *p, *e; + int i, vno; + ulong *t; + Vctl *v; + + p = buf; + e = p+sizeof(buf); + + for(vno = 0; vno < nelem(vctl); vno++){ + if((v = vctl[vno]) == nil) + continue; + + t = intrtimes[vno]; + + p = seprint(p, e, "%-3d %-15q %lud", vno, v->name, intrcount[vno]); + + for(i = 0; i < Ntimevec; i++) + p = seprint(p, e, " %lud", t[i]); + + p = strecpy(p, e, "\n"); + } + + return readstr(offset, a, n, buf); +} + void trapenable(int vno, void (*f)(Ureg*, void*), void* a, char *name) { @@ -243,6 +273,7 @@ trapinit(void) trapenable(Vector15, unexpected, 0, "unexpected"); nmienable(); addarchfile("irqalloc", 0444, irqallocread, nil); + addarchfile("irqstat", 0444, irqstatread, nil); trapinited = 1; } @@ -282,7 +313,7 @@ static char* excname[32] = { }; /* - * keep histogram of interrupt service times + * keep histogram of interrupt service times and count */ void intrtime(Mach*, int vno) @@ -302,6 +333,7 @@ intrtime(Mach*, int vno) if(diff >= Ntimevec) diff = Ntimevec-1; intrtimes[vno][diff]++; + intrcount[vno]++; } /* go to user space */