>>> "Andriy Gapon wrote" >>> Looking at the code in ioapic_program_intpin() this seems to be possible >>> indeed: >>> >>> /* Write the values to the APIC. */ >>> intpin->io_lowreg = low; >>> ioapic_write(io->io_addr, IOAPIC_REDTBL_LO(intpin->io_intpin), low); >>> >>> The line above reprograms vector number AND _unmasks_ the pin (which was >>> specifically masked before reprogramming in ioapic_assign_cpu). >>> The lines below reprogram the destination LAPIC/CPU: >>> >>> 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); >>> >>> So a pending interrupt would be happily delivered to a wrong destination >>> (new >>> vector + old lapic). >>> I am not sure if just swapping these two blocks of lines would fix the >>> issue, but >>> I hope that it would. Could you please try that? >> Yes I did and the first bootverbose run with your block switching patch >> was ok. I will do some more expansive tests next week. > > Thank you very much. > I've committed this change to head.
After several tests I can state: the patch is ok for me. Thanks for your quick help! -- Andreas Longwitz _______________________________________________ freebsd-stable@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-stable To unsubscribe, send any mail to "freebsd-stable-unsubscr...@freebsd.org"