|
@@ -13,7 +13,8 @@
|
|
|
#include "arm.h"
|
|
|
|
|
|
enum {
|
|
|
- Ntimevec = 20 /* # of time buckets for each intr */
|
|
|
+ Ntimevec = 20, /* # of time buckets for each intr */
|
|
|
+ Nvecs = 256,
|
|
|
};
|
|
|
|
|
|
extern int notify(Ureg*);
|
|
@@ -33,7 +34,7 @@ static Vctl* vctl[32];
|
|
|
|
|
|
uvlong ninterrupt;
|
|
|
uvlong ninterruptticks;
|
|
|
-ulong intrtimes[256][Ntimevec];
|
|
|
+ulong intrtimes[Nvecs][Ntimevec];
|
|
|
|
|
|
typedef struct Handler Handler;
|
|
|
struct Handler {
|
|
@@ -85,6 +86,7 @@ intrtime(Mach*, int vno)
|
|
|
diff /= (m->cpuhz/1000000)*100; /* quantum = 100µsec */
|
|
|
if(diff >= Ntimevec)
|
|
|
diff = Ntimevec-1;
|
|
|
+ assert(vno >= 0 && vno < Nvecs);
|
|
|
intrtimes[vno][diff]++;
|
|
|
}
|
|
|
|
|
@@ -185,6 +187,7 @@ intrs(Ureg *ur, int sort)
|
|
|
Handler *h;
|
|
|
Irq irq;
|
|
|
|
|
|
+ assert(sort >= 0 && sort < nelem(irqs));
|
|
|
irq = irqs[sort];
|
|
|
ibits = *irq.irq;
|
|
|
ibits &= *irq.irqmask;
|
|
@@ -262,6 +265,9 @@ trapinit(void)
|
|
|
|
|
|
intrenable(Irqlo, IRQ0hisum, intrhi, nil, "hi");
|
|
|
intrenable(Irqlo, IRQ0bridge, intrbridge, nil, "bridge");
|
|
|
+
|
|
|
+ /* enable watchdog & access-error interrupts */
|
|
|
+ cpu->irqmask = 1<<IRQcputimerwd | 1<<IRQaccesserr;
|
|
|
}
|
|
|
|
|
|
static char *trapnames[PsrMask+1] = {
|