78 lines
2.3 KiB
Diff
78 lines
2.3 KiB
Diff
|
References: CVE-2013-0153 XSA-36 bnc#800275
|
||
|
|
||
|
# HG changeset patch
|
||
|
# User Boris Ostrovsky <boris.ostrovsky@amd.com>
|
||
|
# Date 1360074085 -3600
|
||
|
# Node ID e379a23b04655e9e43dc50944a5c9d1e59d8bee9
|
||
|
# Parent 601139e2b0db7dc8a5bb69b9b7373fb87742741c
|
||
|
AMD,IOMMU: Disable IOMMU if SATA Combined mode is on
|
||
|
|
||
|
AMD's SP5100 chipset can be placed into SATA Combined mode
|
||
|
that may cause prevent dom0 from booting when IOMMU is
|
||
|
enabled and per-device interrupt remapping table is used.
|
||
|
While SP5100 erratum 28 requires BIOSes to disable this mode,
|
||
|
some may still use it.
|
||
|
|
||
|
This patch checks whether this mode is on and, if per-device
|
||
|
table is in use, disables IOMMU.
|
||
|
|
||
|
This is XSA-36 / CVE-2013-0153.
|
||
|
|
||
|
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@amd.com>
|
||
|
|
||
|
Flipped operands of && in amd_iommu_init() to make the message issued
|
||
|
by amd_sp5100_erratum28() match reality (when amd_iommu_perdev_intremap
|
||
|
is zero, there's really no point in calling the function).
|
||
|
|
||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||
|
Committed-by: Jan Beulich <jbeulich@suse.com>
|
||
|
|
||
|
--- a/xen/drivers/passthrough/amd/iommu_init.c
|
||
|
+++ b/xen/drivers/passthrough/amd/iommu_init.c
|
||
|
@@ -1118,12 +1118,45 @@ static int __init amd_iommu_setup_device
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+/* Check whether SP5100 SATA Combined mode is on */
|
||
|
+static bool_t __init amd_sp5100_erratum28(void)
|
||
|
+{
|
||
|
+ u32 bus, id;
|
||
|
+ u16 vendor_id, dev_id;
|
||
|
+ u8 byte;
|
||
|
+
|
||
|
+ for (bus = 0; bus < 256; bus++)
|
||
|
+ {
|
||
|
+ id = pci_conf_read32(0, bus, 0x14, 0, PCI_VENDOR_ID);
|
||
|
+
|
||
|
+ vendor_id = id & 0xffff;
|
||
|
+ dev_id = (id >> 16) & 0xffff;
|
||
|
+
|
||
|
+ /* SP5100 SMBus module sets Combined mode on */
|
||
|
+ if (vendor_id != 0x1002 || dev_id != 0x4385)
|
||
|
+ continue;
|
||
|
+
|
||
|
+ byte = pci_conf_read8(0, bus, 0x14, 0, 0xad);
|
||
|
+ if ( (byte >> 3) & 1 )
|
||
|
+ {
|
||
|
+ printk(XENLOG_WARNING "AMD-Vi: SP5100 erratum 28 detected, disabling IOMMU.\n"
|
||
|
+ "If possible, disable SATA Combined mode in BIOS or contact your vendor for BIOS update.\n");
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return 0;
|
||
|
+}
|
||
|
+
|
||
|
int __init amd_iommu_init(void)
|
||
|
{
|
||
|
struct amd_iommu *iommu;
|
||
|
|
||
|
BUG_ON( !iommu_found() );
|
||
|
|
||
|
+ if ( amd_iommu_perdev_intremap && amd_sp5100_erratum28() )
|
||
|
+ goto error_out;
|
||
|
+
|
||
|
ivrs_bdf_entries = amd_iommu_get_ivrs_dev_entries();
|
||
|
|
||
|
if ( !ivrs_bdf_entries )
|