|
@@ -183,6 +183,7 @@ static int rwbf_quirk;
|
|
|
* (used when kernel is launched w/ TXT)
|
|
|
*/
|
|
|
static int force_on = 0;
|
|
|
+int intel_iommu_tboot_noforce;
|
|
|
|
|
|
/*
|
|
|
* 0: Present
|
|
@@ -607,6 +608,10 @@ static int __init intel_iommu_setup(char *str)
|
|
|
"Intel-IOMMU: enable pre-production PASID support\n");
|
|
|
intel_iommu_pasid28 = 1;
|
|
|
iommu_identity_mapping |= IDENTMAP_GFX;
|
|
|
+ } else if (!strncmp(str, "tboot_noforce", 13)) {
|
|
|
+ printk(KERN_INFO
|
|
|
+ "Intel-IOMMU: not forcing on after tboot. This could expose security risk for tboot\n");
|
|
|
+ intel_iommu_tboot_noforce = 1;
|
|
|
}
|
|
|
|
|
|
str += strcspn(str, ",");
|
|
@@ -4850,6 +4855,19 @@ int __init intel_iommu_init(void)
|
|
|
}
|
|
|
|
|
|
if (no_iommu || dmar_disabled) {
|
|
|
+ /*
|
|
|
+ * We exit the function here to ensure IOMMU's remapping and
|
|
|
+ * mempool aren't setup, which means that the IOMMU's PMRs
|
|
|
+ * won't be disabled via the call to init_dmars(). So disable
|
|
|
+ * it explicitly here. The PMRs were setup by tboot prior to
|
|
|
+ * calling SENTER, but the kernel is expected to reset/tear
|
|
|
+ * down the PMRs.
|
|
|
+ */
|
|
|
+ if (intel_iommu_tboot_noforce) {
|
|
|
+ for_each_iommu(iommu, drhd)
|
|
|
+ iommu_disable_protect_mem_regions(iommu);
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Make sure the IOMMUs are switched off, even when we
|
|
|
* boot into a kexec kernel and the previous kernel left
|