]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
core: Do not program MSI-X vectors that are masked
authorJan Kiszka <jan.kiszka@siemens.com>
Thu, 7 May 2015 17:10:20 +0000 (19:10 +0200)
committerJan Kiszka <jan.kiszka@siemens.com>
Thu, 7 May 2015 17:30:33 +0000 (19:30 +0200)
Test for both function-level and vector-level masking before updating a
MSI-X interrupt mapping. Otherwise, we risk to let cells stumble over
stall but masked vector entries.

All accesses to a vector table entry now cause a mapping update. The
vector control dword is always cached to simplify testing it.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
hypervisor/arch/x86/pci.c
hypervisor/pci.c

index a6d0ba1576ae12c3e559f6f0fb7b57f87772d7a2..043110d2ca3af987a0b4645d446984a2b9c21394 100644 (file)
@@ -372,7 +372,9 @@ int arch_pci_update_msix_vector(struct pci_device *device, unsigned int index)
        struct apic_irq_message irq_msg;
        int result;
 
-       if (!device->msix_registers.field.enable)
+       if (!device->msix_registers.field.enable ||
+           device->msix_registers.field.fmask ||
+           device->msix_vectors[index].field.masked)
                return 0;
 
        irq_msg = pci_translate_msi_vector(device, index, 0, msi);
index f1dc1c472f3f586a7cc9e1a09efdf3aed15ddb51..41e5b3551c76b72955f42ec2e177b8dfe67fcd7c 100644 (file)
@@ -361,14 +361,14 @@ found:
                 */
                if (index >= device->info->num_msix_vectors)
                        goto invalid_access;
-               if (dword == MSIX_VECTOR_CTRL_DWORD) {
+
+               device->msix_vectors[index].raw[dword] = *value;
+               if (arch_pci_update_msix_vector(device, index) < 0)
+                       goto invalid_access;
+
+               if (dword == MSIX_VECTOR_CTRL_DWORD)
                        mmio_write32(&device->msix_table[index].raw[dword],
                                     *value);
-               } else {
-                       device->msix_vectors[index].raw[dword] = *value;
-                       if (arch_pci_update_msix_vector(device, index) < 0)
-                               goto invalid_access;
-               }
        } else {
                if (index >= device->info->num_msix_vectors ||
                    dword == MSIX_VECTOR_CTRL_DWORD)
@@ -492,7 +492,7 @@ static void pci_save_msix(struct pci_device *device,
                pci_read_config(device->info->bdf, cap->start, 4);
 
        for (n = 0; n < device->info->num_msix_vectors; n++)
-               for (r = 0; r < 3; r++)
+               for (r = 0; r < 4; r++)
                        device->msix_vectors[n].raw[r] =
                                mmio_read32(&device->msix_table[n].raw[r]);
 }
@@ -503,6 +503,7 @@ static void pci_restore_msix(struct pci_device *device,
        unsigned int n, r;
 
        for (n = 0; n < device->info->num_msix_vectors; n++)
+               /* only restore address/data, control is write-through */
                for (r = 0; r < 3; r++)
                        mmio_write32(&device->msix_table[n].raw[r],
                                     device->msix_vectors[n].raw[r]);