uaccess: add infrastructure for kernel builds with set_fs()
authorChristoph Hellwig <hch@lst.de>
Thu, 3 Sep 2020 14:22:35 +0000 (16:22 +0200)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 9 Sep 2020 02:21:32 +0000 (22:21 -0400)
Add a CONFIG_SET_FS option that is selected by architecturess that
implement set_fs, which is all of them initially.  If the option is not
set stubs for routines related to overriding the address space are
provided so that architectures can start to opt out of providing set_fs.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
26 files changed:
arch/Kconfig
arch/alpha/Kconfig
arch/arc/Kconfig
arch/arm/Kconfig
arch/arm64/Kconfig
arch/c6x/Kconfig
arch/csky/Kconfig
arch/h8300/Kconfig
arch/hexagon/Kconfig
arch/ia64/Kconfig
arch/m68k/Kconfig
arch/microblaze/Kconfig
arch/mips/Kconfig
arch/nds32/Kconfig
arch/nios2/Kconfig
arch/openrisc/Kconfig
arch/parisc/Kconfig
arch/powerpc/Kconfig
arch/riscv/Kconfig
arch/s390/Kconfig
arch/sh/Kconfig
arch/sparc/Kconfig
arch/um/Kconfig
arch/x86/Kconfig
arch/xtensa/Kconfig
include/linux/uaccess.h

index af14a567b493fc915fc9229bab07c1a331463b82..3fab619a6aa51ac7d31fa415acc389f5bc4dca15 100644 (file)
@@ -24,6 +24,9 @@ config KEXEC_ELF
 config HAVE_IMA_KEXEC
        bool
 
+config SET_FS
+       bool
+
 config HOTPLUG_SMT
        bool
 
index 9c5f06e8eb9bc026dd32691660eafd731a2a0048..d6e9fc7a7b19e2283cedc1122705834f455032a7 100644 (file)
@@ -39,6 +39,7 @@ config ALPHA
        select OLD_SIGSUSPEND
        select CPU_NO_EFFICIENT_FFS if !ALPHA_EV67
        select MMU_GATHER_NO_RANGE
+       select SET_FS
        help
          The Alpha is a 64-bit general-purpose processor designed and
          marketed by the Digital Equipment Corporation of blessed memory,
index ba00c4e1e1c2719719c9bc4fe8e1cecf2312ccdf..c49f5754a11e406bcfc9bc98b59a4db6c245e186 100644 (file)
@@ -48,6 +48,7 @@ config ARC
        select PCI_SYSCALL if PCI
        select PERF_USE_VMALLOC if ARC_CACHE_VIPT_ALIASING
        select HAVE_ARCH_JUMP_LABEL if ISA_ARCV2 && !CPU_ENDIAN_BE32
+       select SET_FS
 
 config ARCH_HAS_CACHE_LINE_SIZE
        def_bool y
index e00d94b1665876594ca693593aa7231f83cf84e5..87e1478a42dc4f2f421e7f20c4fd1b0b6e17ccdb 100644 (file)
@@ -118,6 +118,7 @@ config ARM
        select PCI_SYSCALL if PCI
        select PERF_USE_VMALLOC
        select RTC_LIB
+       select SET_FS
        select SYS_SUPPORTS_APM_EMULATION
        # Above selects are sorted alphabetically; please add new ones
        # according to that.  Thanks.
index 6d232837cbeee8abb0c5a9c37b05c8566260156f..fbd9e35bef096f1ec2f8020d9977e08139c6efbd 100644 (file)
@@ -192,6 +192,7 @@ config ARM64
        select PCI_SYSCALL if PCI
        select POWER_RESET
        select POWER_SUPPLY
+       select SET_FS
        select SPARSE_IRQ
        select SWIOTLB
        select SYSCTL_EXCEPTION_TRACE
index 6444ebfd06a6656563db32286f87c00eaf11e68c..48d66bf0465d680b7dd39603d67e8a3caaec8527 100644 (file)
@@ -22,6 +22,7 @@ config C6X
        select GENERIC_CLOCKEVENTS
        select MODULES_USE_ELF_RELA
        select MMU_GATHER_NO_RANGE if MMU
+       select SET_FS
 
 config MMU
        def_bool n
index 3d5afb5f568543d20fe0d714615c407508cd8e1b..2836f6e76fdb2d03bc3647592b037f8522ca48fa 100644 (file)
@@ -78,6 +78,7 @@ config CSKY
        select PCI_DOMAINS_GENERIC if PCI
        select PCI_SYSCALL if PCI
        select PCI_MSI if PCI
+       select SET_FS
 
 config LOCKDEP_SUPPORT
        def_bool y
index d11666d538fea8816df6aa61978e6aa6d07acc33..7945de067e9fccc6ef347033bb8fcdd2e674dded 100644 (file)
@@ -25,6 +25,7 @@ config H8300
        select HAVE_ARCH_KGDB
        select HAVE_ARCH_HASH
        select CPU_NO_EFFICIENT_FFS
+       select SET_FS
        select UACCESS_MEMCPY
 
 config CPU_BIG_ENDIAN
index 667cfc511cf99972b6e0e9d75bee22b7d534d823..f2afabbadd430eb967fbc95f2942b2b1e687340a 100644 (file)
@@ -31,6 +31,7 @@ config HEXAGON
        select GENERIC_CLOCKEVENTS_BROADCAST
        select MODULES_USE_ELF_RELA
        select GENERIC_CPU_DEVICES
+       select SET_FS
        help
          Qualcomm Hexagon is a processor architecture designed for high
          performance and low power across a wide variety of applications.
index 5b4ec80bf5863ad09a1be531f98ecad6cc453193..22a6853840e2351fb8da474b45d4117d485cee22 100644 (file)
@@ -56,6 +56,7 @@ config IA64
        select NEED_DMA_MAP_STATE
        select NEED_SG_DMA_LENGTH
        select NUMA if !FLATMEM
+       select SET_FS
        default y
        help
          The Itanium Processor Family is Intel's 64-bit successor to
index 6f2f38d05772ab552e94b9ffae294f138217bb55..dcf4ae8c9b215f265647b295a54439c8dac61164 100644 (file)
@@ -32,6 +32,7 @@ config M68K
        select OLD_SIGSUSPEND3
        select OLD_SIGACTION
        select MMU_GATHER_NO_RANGE if MMU
+       select SET_FS
 
 config CPU_BIG_ENDIAN
        def_bool y
index d262ac0c8714bd804b8a43e61d05e939092592d6..7e3d4583abf3e6a749da8a227c3f9124204c36cc 100644 (file)
@@ -46,6 +46,7 @@ config MICROBLAZE
        select CPU_NO_EFFICIENT_FFS
        select MMU_GATHER_NO_RANGE if MMU
        select SPARSE_IRQ
+       select SET_FS
 
 # Endianness selection
 choice
index c95fa3a2484cf056c9dc4238980acd896ef13ca6..fbc26391b588f8ce62e26340bf99612b10e663de 100644 (file)
@@ -87,6 +87,7 @@ config MIPS
        select MODULES_USE_ELF_RELA if MODULES && 64BIT
        select PERF_USE_VMALLOC
        select RTC_LIB
+       select SET_FS
        select SYSCTL_EXCEPTION_TRACE
        select VIRT_TO_BUS
 
index e30298e99e1bdf00a1673eb124c5717523039c3e..e8e541fd2267d06caf1f0e39541932b90e081e93 100644 (file)
@@ -48,6 +48,7 @@ config NDS32
        select HAVE_FUNCTION_GRAPH_TRACER
        select HAVE_FTRACE_MCOUNT_RECORD
        select HAVE_DYNAMIC_FTRACE
+       select SET_FS
        help
          Andes(nds32) Linux support.
 
index c6645141bb2a8885ba9ef0f5dd887570a4974968..c7c6ba6bec9dfce4972f77a20ba2eb42e47955da 100644 (file)
@@ -27,6 +27,7 @@ config NIOS2
        select USB_ARCH_HAS_HCD if USB_SUPPORT
        select CPU_NO_EFFICIENT_FFS
        select MMU_GATHER_NO_RANGE if MMU
+       select SET_FS
 
 config GENERIC_CSUM
        def_bool y
index 7e94fe37cb2fdf341cee2461cd51ce3cf3e14905..6233c62931803f451d6ba2762ac729ecbc55a46f 100644 (file)
@@ -39,6 +39,7 @@ config OPENRISC
        select ARCH_WANT_FRAME_POINTERS
        select GENERIC_IRQ_MULTI_HANDLER
        select MMU_GATHER_NO_RANGE if MMU
+       select SET_FS
 
 config CPU_BIG_ENDIAN
        def_bool y
index 3b0f53dd70bc9b80c5cbb487557a9623ba8ad483..be70af482b5a9aaa0005b02a7d060b9e11847dd7 100644 (file)
@@ -63,6 +63,7 @@ config PARISC
        select HAVE_FTRACE_MCOUNT_RECORD if HAVE_DYNAMIC_FTRACE
        select HAVE_KPROBES_ON_FTRACE
        select HAVE_DYNAMIC_FTRACE_WITH_REGS
+       select SET_FS
 
        help
          The PA-RISC microprocessor is designed by Hewlett-Packard and used
index 1f48bbfb3ce99dc9eccbee3612689e88be4ae675..3f09d6fdf89405f10072e0d95fb16a1886616661 100644 (file)
@@ -249,6 +249,7 @@ config PPC
        select PCI_SYSCALL                      if PCI
        select PPC_DAWR                         if PPC64
        select RTC_LIB
+       select SET_FS
        select SPARSE_IRQ
        select SYSCTL_EXCEPTION_TRACE
        select THREAD_INFO_IN_TASK
index 7b59055291466488f3e6bd613c0196e9b77d3b92..07d53044013ede8c5bee62c05678e14cbbe03935 100644 (file)
@@ -86,6 +86,7 @@ config RISCV
        select SPARSE_IRQ
        select SYSCTL_EXCEPTION_TRACE
        select THREAD_INFO_IN_TASK
+       select SET_FS
 
 config ARCH_MMAP_RND_BITS_MIN
        default 18 if 64BIT
index 3d86e12e8e3c21ed6a23395f6d946f95411000f0..fd81385a7787cbb1ff7558c2f7bfb17e669c224c 100644 (file)
@@ -185,6 +185,7 @@ config S390
        select OLD_SIGSUSPEND3
        select PCI_DOMAINS              if PCI
        select PCI_MSI                  if PCI
+       select SET_FS
        select SPARSE_IRQ
        select SYSCTL_EXCEPTION_TRACE
        select THREAD_INFO_IN_TASK
index d20927128fce05b7e6e997733ce0336a82124e97..2bd1653f3b3fea7ff3cf5185aeb14469bf7f88bc 100644 (file)
@@ -71,6 +71,7 @@ config SUPERH
        select PERF_EVENTS
        select PERF_USE_VMALLOC
        select RTC_LIB
+       select SET_FS
        select SPARSE_IRQ
        help
          The SuperH is a RISC processor targeted for use in embedded systems
index efeff2c896a54451d29cb4254b48d76e17c0096d..3e0cf0319a278adb52896ce0d5fbcf73e3ed4299 100644 (file)
@@ -49,6 +49,7 @@ config SPARC
        select LOCKDEP_SMALL if LOCKDEP
        select NEED_DMA_MAP_STATE
        select NEED_SG_DMA_LENGTH
+       select SET_FS
 
 config SPARC32
        def_bool !64BIT
index eb51fec759484ab065d817704ac277102dde61b0..3aefcd815668090d6f6eb4bdc8fd905834bc84b1 100644 (file)
@@ -19,6 +19,7 @@ config UML
        select GENERIC_CPU_DEVICES
        select GENERIC_CLOCKEVENTS
        select HAVE_GCC_PLUGINS
+       select SET_FS
        select TTY # Needed for line.c
 
 config MMU
index 7101ac64bb209d31966ca255e07a2ddf704397e7..f85c13355732fee376e88fb17db46c1551eb7f77 100644 (file)
@@ -237,6 +237,7 @@ config X86
        select HAVE_ARCH_KCSAN                  if X86_64
        select X86_FEATURE_NAMES                if PROC_FS
        select PROC_PID_ARCH_STATUS             if PROC_FS
+       select SET_FS
        imply IMA_SECURE_AND_OR_TRUSTED_BOOT    if EFI
 
 config INSTRUCTION_DECODER
index e997e0119c02514a9f91b87f8f84fc065a9b1c10..94bad4d66b4bde4f906946f5b381ef6a30fce943 100644 (file)
@@ -41,6 +41,7 @@ config XTENSA
        select IRQ_DOMAIN
        select MODULES_USE_ELF_RELA
        select PERF_USE_VMALLOC
+       select SET_FS
        select VIRT_TO_BUS
        help
          Xtensa processors are 32-bit RISC machines designed by Tensilica
index 94b28541165929ef4b9edbc2f4302e8809ec59c1..70073c802b48ed7591511cb1eb6afb132bedea87 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <asm/uaccess.h>
 
+#ifdef CONFIG_SET_FS
 /*
  * Force the uaccess routines to be wired up for actual userspace access,
  * overriding any possible set_fs(KERNEL_DS) still lingering around.  Undone
@@ -25,6 +26,23 @@ static inline void force_uaccess_end(mm_segment_t oldfs)
 {
        set_fs(oldfs);
 }
+#else /* CONFIG_SET_FS */
+typedef struct {
+       /* empty dummy */
+} mm_segment_t;
+
+#define uaccess_kernel()               (false)
+#define user_addr_max()                        (TASK_SIZE_MAX)
+
+static inline mm_segment_t force_uaccess_begin(void)
+{
+       return (mm_segment_t) { };
+}
+
+static inline void force_uaccess_end(mm_segment_t oldfs)
+{
+}
+#endif /* CONFIG_SET_FS */
 
 /*
  * Architectures should provide two primitives (raw_copy_{to,from}_user())