svn commit: r243764 - head/sys/x86/x86
Andriy Gapon
avg at FreeBSD.org
Sat Dec 1 18:16:14 UTC 2012
Author: avg
Date: Sat Dec 1 18:16:14 2012
New Revision: 243764
URL: http://svnweb.freebsd.org/changeset/base/243764
Log:
ioapic_program_intpin: program high bits before low bits
Programming the low bits has a side-effect if unmasking the pin if it is
not disabled. So if an interrupt was pending then it would be delivered
with the correct new vector but to the incorrect old LAPIC.
This fix could be made clearer by preserving the mask bit while
programming the low bits and then explicitly resetting the mask bit
after all the programming is done.
Probability to trip over the fixed bug could be increased by bootverbose
because printing of the interrupt information in ioapic_assign_cpu
lengthened the time window during which an interrupt could arrive while
a pin is masked.
Reported by: Andreas Longwitz <longwitz at incore.de>
Tested by: Andreas Longwitz <longwitz at incore.de>
MFC after: 12 days
Modified:
head/sys/x86/x86/io_apic.c
Modified: head/sys/x86/x86/io_apic.c
==============================================================================
--- head/sys/x86/x86/io_apic.c Sat Dec 1 18:13:53 2012 (r243763)
+++ head/sys/x86/x86/io_apic.c Sat Dec 1 18:16:14 2012 (r243764)
@@ -311,12 +311,12 @@ ioapic_program_intpin(struct ioapic_ints
}
/* Write the values to the APIC. */
- intpin->io_lowreg = low;
- ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(intpin->io_intpin), low);
value = ioapic_read(io->io_addr, IOAPIC_REDTBL_HI(intpin->io_intpin));
value &= ~IOART_DEST;
value |= high;
ioapic_write(io->io_addr, IOAPIC_REDTBL_HI(intpin->io_intpin), value);
+ intpin->io_lowreg = low;
+ ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(intpin->io_intpin), low);
}
static int
More information about the svn-src-all
mailing list