]> xenbits.xensource.com Git - xen.git/commitdiff
VT-d: don't permit SVT_NO_VERIFY entries for known device types
authorJan Beulich <jbeulich@suse.com>
Thu, 2 May 2013 15:27:13 +0000 (17:27 +0200)
committerJan Beulich <jbeulich@suse.com>
Thu, 2 May 2013 15:27:13 +0000 (17:27 +0200)
Only in cases where we don't know what to do we should leave the IRTE
blank (suppressing all validation), but we should always log a warning
in those cases (as being insecure).

This is CVE-2013-1952 / XSA-49.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: "Zhang, Xiantao" <xiantao.zhang@intel.com>
master commit: 63cec00679cc65ab5d5a9447a62d5202f155b78c
master date: 2013-05-02 17:08:58 +0200

xen/drivers/passthrough/vtd/intremap.c

index 7fc58fed1246d24a7919f315f75445c6b1f9b98b..6dc058445e9f8c1dd4f27937a9577499aaaa183c 100644 (file)
@@ -477,16 +477,15 @@ static void set_msi_source_id(struct pci_dev *pdev, struct iremap_entry *ire)
     type = pdev_type(bus, devfn);
     switch ( type )
     {
+    case DEV_TYPE_PCIe_ENDPOINT:
     case DEV_TYPE_PCIe_BRIDGE:
     case DEV_TYPE_PCIe2PCI_BRIDGE:
-    case DEV_TYPE_LEGACY_PCI_BRIDGE:
-        break;
-
-    case DEV_TYPE_PCIe_ENDPOINT:
         set_ire_sid(ire, SVT_VERIFY_SID_SQ, SQ_ALL_16, PCI_BDF2(bus, devfn));
         break;
 
     case DEV_TYPE_PCI:
+    case DEV_TYPE_LEGACY_PCI_BRIDGE:
+    /* case DEV_TYPE_PCI2PCIe_BRIDGE: */
         ret = find_upstream_bridge(&bus, &devfn, &secbus);
         if ( ret == 0 ) /* integrated PCI device */
         {
@@ -498,10 +497,15 @@ static void set_msi_source_id(struct pci_dev *pdev, struct iremap_entry *ire)
             if ( pdev_type(bus, devfn) == DEV_TYPE_PCIe2PCI_BRIDGE )
                 set_ire_sid(ire, SVT_VERIFY_BUS, SQ_ALL_16,
                             (bus << 8) | pdev->bus);
-            else if ( pdev_type(bus, devfn) == DEV_TYPE_LEGACY_PCI_BRIDGE )
+            else
                 set_ire_sid(ire, SVT_VERIFY_SID_SQ, SQ_ALL_16,
                             PCI_BDF2(bus, devfn));
         }
+        else
+            dprintk(XENLOG_WARNING VTDPREFIX,
+                    "d%d: no upstream bridge for %02x:%02x.%u\n",
+                    pdev->domain->domain_id,
+                    bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
         break;
 
     default: