• Chris Lalancette's avatar
    KVM: Search the LAPIC's for one that will accept a PIC interrupt · 529df65e
    Chris Lalancette authored
    Older versions of 32-bit linux have a "Checking 'hlt' instruction"
    test where they repeatedly call the 'hlt' instruction, and then
    expect a timer interrupt to kick the CPU out of halt.  This happens
    before any LAPIC or IOAPIC setup happens, which means that all of
    the APIC's are in virtual wire mode at this point.  Unfortunately,
    the current implementation of virtual wire mode is hardcoded to
    only kick the BSP, so if a crash+kexec occurs on a different
    vcpu, it will never get kicked.
    
    This patch makes pic_unlock() do the equivalent of
    kvm_irq_delivery_to_apic() for the IOAPIC code.  That is, it runs
    through all of the vcpus looking for one that is in virtual wire
    mode.  In the normal case where LAPICs and IOAPICs are configured,
    this won't be used at all.  In the bootstrap phase of a modern
    OS, before the LAPICs and IOAPICs are configured, this will have
    exactly the same behavior as today; VCPU0 is always looked at
    first, so it will always get out of the loop after the first
    iteration.  This will only go through the loop more than once
    during a kexec/kdump, in which case it will only do it a few times
    until the kexec'ed kernel programs the LAPIC and IOAPIC.
    Signed-off-by: default avatarChris Lalancette <clalance@redhat.com>
    Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
    529df65e
i8259.c 12.3 KB