aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Anderson <dianders@chromium.org>2019-03-01 14:20:17 -0500
committerWill Deacon <will.deacon@arm.com>2019-04-05 05:00:41 -0400
commit954a03be033c7cef80ddc232e7cbdb17df735663 (patch)
treefcdc78e4235a94483f07dfc1dbb200af79281ad1
parent79a3aaa7b82e3106be97842dedfd8429248896e6 (diff)
iommu/arm-smmu: Break insecure users by disabling bypass by default
If you're bisecting why your peripherals stopped working, it's probably this CL. Specifically if you see this in your dmesg: Unexpected global fault, this could be serious ...then it's almost certainly this CL. Running your IOMMU-enabled peripherals with the IOMMU in bypass mode is insecure and effectively disables the protection they provide. There are few reasons to allow unmatched stream bypass, and even fewer good ones. This patch starts the transition over to make it much harder to run your system insecurely. Expected steps: 1. By default disable bypass (so anyone insecure will notice) but make it easy for someone to re-enable bypass with just a KConfig change. That's this patch. 2. After people have had a little time to come to grips with the fact that they need to set their IOMMUs properly and have had time to dig into how to do this, the KConfig will be eliminated and bypass will simply be disabled. Folks who are truly upset and still haven't fixed their system can either figure out how to add 'arm-smmu.disable_bypass=n' to their command line or revert the patch in their own private kernel. Of course these folks will be less secure. Suggested-by: Robin Murphy <robin.murphy@arm.com> Reviewed-by: Marc Gonzalez <marc.w.gonzalez@free.fr> Tested-by: Marc Gonzalez <marc.w.gonzalez@free.fr> Signed-off-by: Douglas Anderson <dianders@chromium.org> Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r--drivers/iommu/Kconfig25
-rw-r--r--drivers/iommu/arm-smmu.c3
2 files changed, 27 insertions, 1 deletions
diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig
index 6f07f3b21816..15b831113ded 100644
--- a/drivers/iommu/Kconfig
+++ b/drivers/iommu/Kconfig
@@ -359,6 +359,31 @@ config ARM_SMMU
359 Say Y here if your SoC includes an IOMMU device implementing 359 Say Y here if your SoC includes an IOMMU device implementing
360 the ARM SMMU architecture. 360 the ARM SMMU architecture.
361 361
362config ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT
363 bool "Default to disabling bypass on ARM SMMU v1 and v2"
364 depends on ARM_SMMU
365 default y
366 help
367 Say Y here to (by default) disable bypass streams such that
368 incoming transactions from devices that are not attached to
369 an iommu domain will report an abort back to the device and
370 will not be allowed to pass through the SMMU.
371
372 Any old kernels that existed before this KConfig was
373 introduced would default to _allowing_ bypass (AKA the
374 equivalent of NO for this config). However the default for
375 this option is YES because the old behavior is insecure.
376
377 There are few reasons to allow unmatched stream bypass, and
378 even fewer good ones. If saying YES here breaks your board
379 you should work on fixing your board. This KConfig option
380 is expected to be removed in the future and we'll simply
381 hardcode the bypass disable in the code.
382
383 NOTE: the kernel command line parameter
384 'arm-smmu.disable_bypass' will continue to override this
385 config.
386
362config ARM_SMMU_V3 387config ARM_SMMU_V3
363 bool "ARM Ltd. System MMU Version 3 (SMMUv3) Support" 388 bool "ARM Ltd. System MMU Version 3 (SMMUv3) Support"
364 depends on ARM64 389 depends on ARM64
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 045d93884164..930c07635956 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -110,7 +110,8 @@ static int force_stage;
110module_param(force_stage, int, S_IRUGO); 110module_param(force_stage, int, S_IRUGO);
111MODULE_PARM_DESC(force_stage, 111MODULE_PARM_DESC(force_stage,
112 "Force SMMU mappings to be installed at a particular stage of translation. A value of '1' or '2' forces the corresponding stage. All other values are ignored (i.e. no stage is forced). Note that selecting a specific stage will disable support for nested translation."); 112 "Force SMMU mappings to be installed at a particular stage of translation. A value of '1' or '2' forces the corresponding stage. All other values are ignored (i.e. no stage is forced). Note that selecting a specific stage will disable support for nested translation.");
113static bool disable_bypass; 113static bool disable_bypass =
114 IS_ENABLED(CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT);
114module_param(disable_bypass, bool, S_IRUGO); 115module_param(disable_bypass, bool, S_IRUGO);
115MODULE_PARM_DESC(disable_bypass, 116MODULE_PARM_DESC(disable_bypass,
116 "Disable bypass streams such that incoming transactions from devices that are not attached to an iommu domain will report an abort back to the device and will not be allowed to pass through the SMMU."); 117 "Disable bypass streams such that incoming transactions from devices that are not attached to an iommu domain will report an abort back to the device and will not be allowed to pass through the SMMU.");