svn commit: r338725 - head/sys/x86/isa

John Baldwin jhb at FreeBSD.org
Mon Sep 17 17:18:55 UTC 2018


Author: jhb
Date: Mon Sep 17 17:18:54 2018
New Revision: 338725
URL: https://svnweb.freebsd.org/changeset/base/338725

Log:
  Fix a regression in r338360 when booting an x86 machine without APIC.
  
  The atpic_register_sources callback tries to avoid registering interrupt
  sources that would collide with an I/O APIC.  However, the previous
  implementation was failing to register IRQs 8-15 since the slave PIC
  saw valid IRQs from the master and assumed an I/O APIC was present.  To
  fix, go back to registering all 8259A interrupt sources in one loop when
  the master's register_sources method is invoked.
  
  PR:		231291
  Approved by:	re (kib)
  MFC after:	1 month

Modified:
  head/sys/x86/isa/atpic.c

Modified: head/sys/x86/isa/atpic.c
==============================================================================
--- head/sys/x86/isa/atpic.c	Mon Sep 17 16:16:57 2018	(r338724)
+++ head/sys/x86/isa/atpic.c	Mon Sep 17 17:18:54 2018	(r338725)
@@ -221,14 +221,20 @@ atpic_register_sources(struct pic *pic)
 	 * that APIC ISA routing and allowing the ATPIC source for that IRQ
 	 * to leak through.  We used to depend on this feature for routing
 	 * IRQ0 via mixed mode, but now we don't use mixed mode at all.
+	 *
+	 * To avoid the slave not register sources after the master
+	 * registers its sources, register all IRQs when this function is
+	 * called on the master.
 	 */
+	if (ap != &atpics[MASTER])
+		return;
 	for (i = 0; i < NUM_ISA_IRQS; i++)
 		if (intr_lookup_source(i) != NULL)
 			return;
 
 	/* Loop through all interrupt sources and add them. */
-	for (i = 0, ai = atintrs + ap->at_irqbase; i < 8; i++, ai++) {
-		if (ap->at_irqbase + i == ICU_SLAVEID)
+	for (i = 0, ai = atintrs; i < NUM_ISA_IRQS; i++, ai++) {
+		if (i == ICU_SLAVEID)
 			continue;
 		intr_register_source(&ai->at_intsrc);
 	}


More information about the svn-src-head mailing list