]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
x86 apic: make sure to only send valid irqs
authorHenning Schild <henning.schild@siemens.com>
Mon, 24 Nov 2014 17:54:04 +0000 (18:54 +0100)
committerJan Kiszka <jan.kiszka@siemens.com>
Tue, 25 Nov 2014 12:22:35 +0000 (13:22 +0100)
struct apic_irq_message has a valid field, make sure to call
apic_send_irq only in cases where this bit is set. This protects us
against sending invalid interrupts during handover when the Linux setup
should ever be broken.

Signed-off-by: Henning Schild <henning.schild@siemens.com>
[Jan: extended commit description]
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
hypervisor/arch/x86/ioapic.c
hypervisor/arch/x86/pci.c

index ef72427332859b77c6c01bab6282f477cb3241fb..eb675be9e24470e47c3857750e0e3c40b277cfaf 100644 (file)
@@ -142,6 +142,7 @@ static int ioapic_virt_redir_write(struct cell *cell, unsigned int reg,
 static void ioapic_mask_pins(struct cell *cell, u64 pin_bitmap,
                             enum ioapic_handover handover)
 {
+       struct apic_irq_message irq_msg;
        union ioapic_redir_entry entry;
        unsigned int pin, reg;
 
@@ -166,8 +167,10 @@ static void ioapic_mask_pins(struct cell *cell, u64 pin_bitmap,
                         * interrupts.
                         */
                        entry = shadow_redir_table[pin];
-                       apic_send_irq(ioapic_translate_redir_entry(cell, pin,
-                                                                  entry));
+                       irq_msg = ioapic_translate_redir_entry(cell, pin,
+                                                              entry);
+                       if (irq_msg.valid)
+                               apic_send_irq(irq_msg);
                }
        }
 }
index a856d2ff44c8876c024ebb546dd7bf7ff9ff9b76..e130d737970167f01905878e045da5ade1ca5e9b 100644 (file)
@@ -305,7 +305,8 @@ void arch_pci_suppress_msi(struct pci_device *device,
        msi = pci_get_x86_msi_vector(device);
        for (n = 0; n < vectors; n++) {
                irq_msg = pci_translate_msi_vector(device, n, vectors, msi);
-               apic_send_irq(irq_msg);
+               if (irq_msg.valid)
+                       apic_send_irq(irq_msg);
        }
 }