Date: Thu, 6 Jan 2005 13:00:31 -0500 From: John Baldwin <jhb@FreeBSD.org> To: freebsd-smp@FreeBSD.org Cc: kris@obsecurity.org Subject: Re: Lost interrupts on SMP systems Message-ID: <200501061300.31415.jhb@FreeBSD.org> In-Reply-To: <200501061403.15004.pvtrifonov@mail.ru> References: <E1Cki2q-0007aN-00@emaile.wplus.net> <200501051621.32757.jhb@FreeBSD.org> <200501061403.15004.pvtrifonov@mail.ru>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday 06 January 2005 06:03 am, Peter Trifonov wrote: > Hello John, > > On Thursday 06 January 2005 00:21, John Baldwin wrote: > > > > > ioapic0: Assuming intbase of 0 > > > > > MPTable: Ignoring global interrupt entry for pin 1 > > > > > MPTable: Ignoring global interrupt entry for pin 15 > > > > > > > > Ok, well, this is a bit of a problem here. Basically, this > > > > means you don't have any working interrupts as far as I can > > > > The error message is from the MP Table using an APIC ID of 255 instead of > > 16. Umm, an APIC ID of 16 isn't valid either. Is there an option in the > > BIOS to select MP 1.4 rather than 1.1? If so, can you please try that > > first? > > No. This is quite an old HP box. Its BIOS setup does not have any > multiprocessor-related options. > > > Also, can you try this patch. It changes the way we handle an errata on > > your CPU that I think may not work when we try to turn APIC mode back on > > after turning it off: > > I have recompiled the kernel with this patch, but it does not seem to > affect anything. mptable(8) still shows the same stuff, dmesg still > complains about ignored global interrupt entries. Ok, try this patch instead then, it should make the 'ignoring global interrupt entry' messages go away: --- //depot/vendor/freebsd/src/sys/i386/i386/mptable.c 2004/09/24 18:45:28 +++ //depot/user/jhb/acpipci/i386/i386/mptable.c 2005/01/06 17:56:36 @@ -624,23 +635,35 @@ mptable_parse_io_int(int_entry_ptr intr) { void *ioapic; - u_int pin; + u_int pin, apic_id; + apic_id = intr->dst_apic_id; if (intr->dst_apic_id == 0xff) { - printf("MPTable: Ignoring global interrupt entry for pin %d\n", - intr->dst_apic_int); - return; + /* + * Workaround some busted BIOSes that use a global APIC + * ID in systems with only one I/O APIC. + */ + if (mptable_nioapics == 1) { + apic_id = 0; + while (ioapics[apic_id] == NULL) + apic_id++; + } else { + printf( + "MPTable: Ignoring global interrupt entry for pin %d\n", + intr->dst_apic_int); + return; + } } if (intr->dst_apic_id >= NAPICID) { printf("MPTable: Ignoring interrupt entry for ioapic%d\n", intr->dst_apic_id); return; } - ioapic = ioapics[intr->dst_apic_id]; + ioapic = ioapics[apic_id]; if (ioapic == NULL) { printf( "MPTable: Ignoring interrupt entry for missing ioapic%d\n", - intr->dst_apic_id); + apic_id); return; } pin = intr->dst_apic_int; -- John Baldwin <jhb@FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve" = http://www.FreeBSD.org
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200501061300.31415.jhb>