from the comment: if we find a gsi for an i/o apic that does not exist, and the gsi belongs to a bus that does not exist, assume that both belong to a processor that does not exist, and do not complain. this was observed in a 2p system with 1 installed p(ackage). there were a number of gsis for pci bus 128 which did not exist, and the gsi numbers were not covered by any discovered i/o apic. this is a bit of an assumption, but i think it's a safe bet that the bios writer accidentally included these interrupts, or didn't bother removing them. Reference: /n/atom/patch/applied2013/nixmissioapic Date: Wed Sep 18 15:01:18 CES 2013 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/k10/acpi.c Wed Sep 18 14:58:51 2013 +++ /sys/src/nix/k10/acpi.c Wed Sep 18 14:58:51 2013 @@ -347,6 +347,24 @@ } } +/* + * if we find a gsi for an i/o apic that does not exist, and the gsi + * belongs to a bus that does not exist, assume that both belong to + * a processor that does not exist, and do not complain. + */ +static int +havebus(int bustype, int busno) +{ + Pcidev *p; + + if(bustype != BusPCI) + return 1; + for(p = nil; p = pcimatch(p, 0, 0); ) + if(BUSBNO(p->tbdf) == busno) + return 1; + return 0; +} + static void addirq(int gsi, int bustype, int busno, int irq, int flags) { @@ -354,7 +372,8 @@ u32int i; if((apicno = gsitoapicid(gsi, &intin)) == -1){ - print("acpi: addirq: no apic for gsi %d bus %d.%d\n", gsi, bustype, busno); + if(havebus(bustype, busno)) + print("acpi: addirq: no apic for gsi %d bus %d.%d\n", gsi, bustype, busno); return; } DBG("addirq: gsi %d %s busno %d irq %d flags %.8ux\n", --- /sys/src/nix/k10/ioapic.c Wed Sep 18 14:58:51 2013 +++ /sys/src/nix/k10/ioapic.c Wed Sep 18 14:58:51 2013 @@ -94,7 +94,7 @@ return a - xioapic; } } - print("gsitoapicid: no ioapic found for gsi %d\n", gsi); +// print("gsitoapicid: no ioapic found for gsi %d\n", gsi); return -1; }