allow direct manipulation of vectors for setting affinities, etc Reference: /n/atom/patch/applied/k10trapv Date: Sun Aug 16 19:06:38 CES 2015 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/k10/trap.c Sun Aug 16 19:06:28 2015 +++ /sys/src/nix/k10/trap.c Sun Aug 16 19:06:30 2015 @@ -24,28 +24,23 @@ static Lock vctllock; static Vctl *vctl[MACHMAX][256]; +void +vctlinit(Vctl *v) +{ + memset(v, 0, sizeof *v); + v->type = "unset"; + v->affinity = -1; +} + void* -intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf, char *name) +vintrenable(Vctl *v, char *name) { int vno; - Vctl *v, *old; - - if(f == nil){ - print("intrenable: nil handler for %d, tbdf %#ux for %s\n", - irq, tbdf, name); - return nil; - } + Vctl *old; - v = malloc(sizeof(Vctl)); + if(v->f == nil) + panic("intrenable: %s: no handler for %d, tbdf %#T", name, v->irq, v->tbdf); v->isintr = 1; - v->irq = irq; - v->tbdf = tbdf; - v->f = f; - v->a = a; - v->affinity = -1; - if(f == timerintr) - v->affinity = m->machno; /* hack! */ - strncpy(v->name, name, KNAMELEN-1); v->name[KNAMELEN-1] = 0; @@ -53,15 +48,18 @@ vno = ioapicintrenable(v); if(vno == -1){ iunlock(&vctllock); - print("intrenable: couldn't enable irq %d, tbdf %#ux for %s\n", - irq, tbdf, v->name); + print("vintrenable: %s: couldn't enable irq %d, %T\n", + v->name, v->irq, v->tbdf); free(v); return nil; } if((old = vctl[v->affinity][vno]) != nil){ if(old->isr != v->isr || old->eoi != v->eoi) - panic("intrenable: handler: %s %s %#p %#p %#p %#p", + panic("vintrenable: handler: %s %s %#p %#p %#p %#p", old->name, v->name, old->isr, v->isr, old->eoi, v->eoi); + if(old->f == v->f && old->a == v->a){ + iprint("vintrenable: duplicate intr fn %#p data %#p", v->f, v->a); + } } v->vno = vno; v->next = vctl[v->affinity][vno]; @@ -74,12 +72,30 @@ return v; } +void* +intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf, char *name) +{ + Vctl *v; + + v = malloc(sizeof(Vctl)); + vctlinit(v); + v->isintr = 1; + v->irq = irq; + v->tbdf = tbdf; + v->f = f; + v->a = a; + if(f == timerintr) + v->affinity = m->machno; /* hack! */ + return vintrenable(v, name); +} + void trapenable(int vno, void (*f)(Ureg*, void*), void* a, char *name) { Vctl *v; v = malloc(sizeof(Vctl)); + vctlinit(v); v->type = "trap"; v->tbdf = BUSUNKNOWN; v->f = f; @@ -302,6 +318,7 @@ cycles(&up->kentry); } + assert(m->ilockdepth == 0); clockintr = 0; if(ctl = vctl[m->machno][vno]){ @@ -373,7 +390,7 @@ splhi(); /* delaysched set because we held a lock or because our quantum ended */ - if(up && up->delaysched && clockintr){ + if(clockintr && up && up->nlocks == 0 && up->delaysched){ sched(); splhi(); }