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