int iommu_pv_enabled = 0;
boolean_param("iommu_pv", iommu_pv_enabled);
+int force_iommu = 0;
+boolean_param("force_iommu", force_iommu);
+
int iommu_domain_init(struct domain *domain)
{
struct hvm_iommu *hd = domain_hvm_iommu(domain);
iommu_enabled = (rc == 0);
out:
+ if ( force_iommu && !iommu_enabled )
+ panic("IOMMU setup failed, crash Xen for security purpose!\n");
+
if ( !iommu_enabled )
iommu_pv_enabled = 0;
printk("I/O virtualisation %sabled\n", iommu_enabled ? "en" : "dis");
if ( !dmar->width )
{
dprintk(XENLOG_WARNING VTDPREFIX, "Zero: Invalid DMAR width\n");
+ if ( force_iommu )
+ panic("acpi_parse_dmar: Invalid DMAR width,"
+ " crash Xen for security purpose!\n");
return -EINVAL;
}
if ( ret )
{
- printk(XENLOG_WARNING "Failed to parse ACPI DMAR. Disabling VT-d.\n");
- disable_all_dmar_units();
+ if ( force_iommu )
+ panic("acpi_parse_dmar: Failed to parse ACPI DMAR,"
+ " crash Xen for security purpose!\n");
+ else
+ {
+ printk(XENLOG_WARNING
+ "Failed to parse ACPI DMAR. Disabling VT-d.\n");
+ disable_all_dmar_units();
+ }
}
return ret;
int rc;
rc = -ENODEV;
+ if ( force_iommu )
+ iommu_enabled = 1;
+
if ( !iommu_enabled )
goto fail;
- acpi_table_parse(ACPI_SIG_DMAR, acpi_parse_dmar);
+ rc = acpi_table_parse(ACPI_SIG_DMAR, acpi_parse_dmar);
+ if ( rc )
+ goto fail;
rc = -ENODEV;
if ( list_empty(&acpi_drhd_units) )
return 0;
fail:
+ if ( force_iommu )
+ panic("acpi_dmar_init: acpi_dmar_init failed,"
+ " crash Xen for security purpose!\n");
+
vtd_enabled = 0;
return -ENODEV;
}
extern int vtd_enabled;
extern int iommu_enabled;
extern int iommu_pv_enabled;
+extern int force_iommu;
#define domain_hvm_iommu(d) (&d->arch.hvm_domain.hvm_iommu)
#define domain_vmx_iommu(d) (&d->arch.hvm_domain.hvm_iommu.vmx_iommu)