fix problem with multiple irqs on the same rdt. need to route to the same mach and vector number, so just stash that information in the rdt tracking structure Reference: /n/atom/patch/applied/multipleirqrdt Date: Tue Jan 7 04:11:03 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/k10/ioapic.c Tue Jan 7 04:10:27 2014 +++ /sys/src/nix/k10/ioapic.c Tue Jan 7 04:10:27 2014 @@ -23,6 +23,9 @@ int intin; u32int lo; + u64int vec; /* remember vector and mach */ + int affinity; + int ref; /* could map to multiple busses */ int enabled; /* times enabled */ }; @@ -549,19 +552,25 @@ lock(rdt->apic); ainc(&rdt->enabled); lo = (rdt->lo & ~Im); - ioapicphysdd(v, &hi, &lo); if((rdt->lo & 0xff) == 0){ + ioapicphysdd(v, &hi, &lo); rdt->lo |= lo & 0xff; + rdt->vec = (u64int)hi<<32 | lo; + rdt->affinity = v->affinity; rdtvecno[lo&0xff] = rdt; - }else - DBG("%T: mutiple irq bus %d dev %d\n", v->tbdf, busno, devno); - - rtblput(rdt->apic, rdt->intin, hi, lo); + rtblput(rdt->apic, rdt->intin, hi, lo); + }else{ + DBG("%T: mutiple irq bus %d dev %d %s\n", v->tbdf, busno, devno, v->name); + hi = rdt->vec>>32; + lo = rdt->vec; + v->affinity = rdt->affinity; + v->vno = lo & 0xff; + } unlock(rdt->apic); - DBG("busno %d devno %d hi %#.8ux lo %#.8ux vecno %d\n", - busno, devno, hi, lo, v->vno); + DBG("busno %d devno %d hi %#.8ux lo %#.8ux vno %d af %d\n", + busno, devno, hi, lo, v->vno, v->affinity); v->eoi = lapiceoi; v->type = "ioapic";