x86/hvm: don't force vCPU 0 for IRQ 0 when using fixed destination mode

When the IO APIC pin mapped to the ISA IRQ 0 has been configured to
use fixed delivery mode, do not forcefully route interrupts to vCPU 0,
as the OS might have setup those interrupts to be injected to a
different vCPU, and injecting to vCPU 0 can cause the OS to miss such
interrupts or errors to happen due to unexpected vectors being
injected on vCPU 0.

In order to fix remove such handling altogether for fixed destination
mode pins and just inject them according to the data setup in the
IO-APIC entry.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Roger Pau Monne authored and Andrew Cooper committed 2020-07-28 19:33:28 +01:00
1 parent 4489ffdec3
commit ab5bfc049e
1 file changed
+4 -19
+4 -19
View File
@@ -438,26 +438,11 @@ static void vioapic_deliver(struct hvm_vioapic *vioapic, unsigned int pin)
}
case dest_Fixed:
{
#ifdef IRQ0_SPECIAL_ROUTING
/* Do not deliver timer interrupts to VCPU != 0 */
if ( (irq == hvm_isa_irq_to_gsi(0)) && pt_active(&d->arch.vpit.pt0) )
{
if ( (v = d->vcpu ? d->vcpu[0] : NULL) != NULL )
ioapic_inj_irq(vioapic, vcpu_vlapic(v), vector,
trig_mode, delivery_mode);
}
else
#endif
{
for_each_vcpu ( d, v )
if ( vlapic_match_dest(vcpu_vlapic(v), NULL,
0, dest, dest_mode) )
ioapic_inj_irq(vioapic, vcpu_vlapic(v), vector,
trig_mode, delivery_mode);
}
for_each_vcpu ( d, v )
if ( vlapic_match_dest(vcpu_vlapic(v), NULL, 0, dest, dest_mode) )
ioapic_inj_irq(vioapic, vcpu_vlapic(v), vector, trig_mode,
delivery_mode);
break;
}
case dest_NMI:
{
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.