Lost interrupts on SMP systems
John Baldwin
jhb at FreeBSD.org
Thu Jan 6 10:02:07 PST 2005
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 at FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve" = http://www.FreeBSD.org
More information about the freebsd-smp
mailing list