aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2015-11-23 18:49:03 -0500
committerDan Williams <dan.j.williams@intel.com>2016-01-09 09:30:49 -0500
commit90a545e981267e917b9d698ce07affd69787db87 (patch)
treef895cd7ac2a05af3754424814db48fffb7164127 /lib
parent21266be9ed542f13436bd9c75316d43e1e84f6ae (diff)
restrict /dev/mem to idle io memory ranges
This effectively promotes IORESOURCE_BUSY to IORESOURCE_EXCLUSIVE semantics by default. If userspace really believes it is safe to access the memory region it can also perform the extra step of disabling an active driver. This protects device address ranges with read side effects and otherwise directs userspace to use the driver. Persistent memory presents a large "mistake surface" to /dev/mem as now accidental writes can corrupt a filesystem. In general if a device driver is busily using a memory region it already informs other parts of the kernel to not touch it via request_mem_region(). /dev/mem should honor the same safety restriction by default. Debugging a device driver from userspace becomes more difficult with this enabled. Any application using /dev/mem or mmap of sysfs pci resources will now need to perform the extra step of either: 1/ Disabling the driver, for example: echo <device id> > /dev/bus/<parent bus>/drivers/<driver name>/unbind 2/ Rebooting with "iomem=relaxed" on the command line 3/ Recompiling with CONFIG_IO_STRICT_DEVMEM=n Traditional users of /dev/mem like dosemu are unaffected because the first 1MB of memory is not subject to the IO_STRICT_DEVMEM restriction. Legacy X configurations use /dev/mem to talk to graphics hardware, but that functionality has since moved to kernel graphics drivers. Cc: Arnd Bergmann <arnd@arndb.de> Cc: Russell King <linux@arm.linux.org.uk> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Acked-by: Kees Cook <keescook@chromium.org> Acked-by: Ingo Molnar <mingo@redhat.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/Kconfig.debug23
1 files changed, 20 insertions, 3 deletions
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 289dfcbc14eb..073496dea848 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -1869,9 +1869,26 @@ config STRICT_DEVMEM
1869 enabled, even in this case there are restrictions on /dev/mem 1869 enabled, even in this case there are restrictions on /dev/mem
1870 use due to the cache aliasing requirements. 1870 use due to the cache aliasing requirements.
1871 1871
1872 If this option is switched on, and IO_STRICT_DEVMEM=n, the /dev/mem
1873 file only allows userspace access to PCI space and the BIOS code and
1874 data regions. This is sufficient for dosemu and X and all common
1875 users of /dev/mem.
1876
1877 If in doubt, say Y.
1878
1879config IO_STRICT_DEVMEM
1880 bool "Filter I/O access to /dev/mem"
1881 depends on STRICT_DEVMEM
1882 default STRICT_DEVMEM
1883 ---help---
1884 If this option is disabled, you allow userspace (root) access to all
1885 io-memory regardless of whether a driver is actively using that
1886 range. Accidental access to this is obviously disastrous, but
1887 specific access can be used by people debugging kernel drivers.
1888
1872 If this option is switched on, the /dev/mem file only allows 1889 If this option is switched on, the /dev/mem file only allows
1873 userspace access to PCI space and the BIOS code and data regions. 1890 userspace access to *idle* io-memory ranges (see /proc/iomem) This
1874 This is sufficient for dosemu and X and all common users of 1891 may break traditional users of /dev/mem (dosemu, legacy X, etc...)
1875 /dev/mem. 1892 if the driver using a given range cannot be disabled.
1876 1893
1877 If in doubt, say Y. 1894 If in doubt, say Y.