powerpc: get rid of zeroing, switch to RAW_COPY_USER
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 21 Mar 2017 20:35:08 +0000 (16:35 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 6 Apr 2017 19:08:42 +0000 (15:08 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/powerpc/Kconfig
arch/powerpc/include/asm/uaccess.h
arch/powerpc/lib/Makefile
arch/powerpc/lib/copy_32.S
arch/powerpc/lib/copyuser_64.S
arch/powerpc/lib/usercopy_64.c [deleted file]

index 97a8bc8a095ce4199ad2e4e0c88c2933fc3b6987..839f088872697ac8917116bea49b4e9346b3b9fc 100644 (file)
@@ -87,6 +87,7 @@ config PPC
        select ARCH_HAS_DMA_SET_COHERENT_MASK
        select ARCH_HAS_ELF_RANDOMIZE
        select ARCH_HAS_GCOV_PROFILE_ALL
+       select ARCH_HAS_RAW_COPY_USER
        select ARCH_HAS_SCALED_CPUTIME          if VIRT_CPU_ACCOUNTING_NATIVE
        select ARCH_HAS_SG_CHAIN
        select ARCH_HAS_TICK_BROADCAST          if GENERIC_CLOCKEVENTS_BROADCAST
index b19883f6273ce72dc087843b78f9c225bf4755b5..5c0d8a8cdae5b588ac1254882c90787f81c40052 100644 (file)
@@ -269,42 +269,19 @@ extern unsigned long __copy_tofrom_user(void __user *to,
 
 #ifndef __powerpc64__
 
-static inline unsigned long copy_from_user(void *to,
-               const void __user *from, unsigned long n)
-{
-       if (likely(access_ok(VERIFY_READ, from, n))) {
-               check_object_size(to, n, false);
-               return __copy_tofrom_user((__force void __user *)to, from, n);
-       }
-       memset(to, 0, n);
-       return n;
-}
-
-static inline unsigned long copy_to_user(void __user *to,
-               const void *from, unsigned long n)
-{
-       if (access_ok(VERIFY_WRITE, to, n)) {
-               check_object_size(from, n, true);
-               return __copy_tofrom_user(to, (__force void __user *)from, n);
-       }
-       return n;
-}
+#define INLINE_COPY_FROM_USER
+#define INLINE_COPY_TO_USER
 
 #else /* __powerpc64__ */
 
-#define __copy_in_user(to, from, size) \
-       __copy_tofrom_user((to), (from), (size))
-
-extern unsigned long copy_from_user(void *to, const void __user *from,
-                                   unsigned long n);
-extern unsigned long copy_to_user(void __user *to, const void *from,
-                                 unsigned long n);
-extern unsigned long copy_in_user(void __user *to, const void __user *from,
-                                 unsigned long n);
-
+static inline unsigned long
+raw_copy_in_user(void __user *to, const void __user *from, unsigned long n)
+{
+       return __copy_tofrom_user(to, from, n);
+}
 #endif /* __powerpc64__ */
 
-static inline unsigned long __copy_from_user_inatomic(void *to,
+static inline unsigned long raw_copy_from_user(void *to,
                const void __user *from, unsigned long n)
 {
        if (__builtin_constant_p(n) && (n <= 8)) {
@@ -328,12 +305,10 @@ static inline unsigned long __copy_from_user_inatomic(void *to,
                        return 0;
        }
 
-       check_object_size(to, n, false);
-
        return __copy_tofrom_user((__force void __user *)to, from, n);
 }
 
-static inline unsigned long __copy_to_user_inatomic(void __user *to,
+static inline unsigned long raw_copy_to_user(void __user *to,
                const void *from, unsigned long n)
 {
        if (__builtin_constant_p(n) && (n <= 8)) {
@@ -357,25 +332,9 @@ static inline unsigned long __copy_to_user_inatomic(void __user *to,
                        return 0;
        }
 
-       check_object_size(from, n, true);
-
        return __copy_tofrom_user(to, (__force const void __user *)from, n);
 }
 
-static inline unsigned long __copy_from_user(void *to,
-               const void __user *from, unsigned long size)
-{
-       might_fault();
-       return __copy_from_user_inatomic(to, from, size);
-}
-
-static inline unsigned long __copy_to_user(void __user *to,
-               const void *from, unsigned long size)
-{
-       might_fault();
-       return __copy_to_user_inatomic(to, from, size);
-}
-
 extern unsigned long __clear_user(void __user *addr, unsigned long size);
 
 static inline unsigned long clear_user(void __user *addr, unsigned long size)
index 2b5e09020cfe379abfb3c56dd497215b07eb8931..ed7dfce331e0227c3bfd3e33e36a87cf7f8737bd 100644 (file)
@@ -14,7 +14,7 @@ obj-y += string.o alloc.o crtsavres.o code-patching.o \
 
 obj-$(CONFIG_PPC32)    += div64.o copy_32.o
 
-obj64-y        += copypage_64.o copyuser_64.o usercopy_64.o mem_64.o hweight_64.o \
+obj64-y        += copypage_64.o copyuser_64.o mem_64.o hweight_64.o \
           copyuser_power7.o string_64.o copypage_power7.o memcpy_power7.o \
           memcpy_64.o memcmp_64.o
 
index ff0d894d7ff9f25c6ecb9d7a711467af68aa978b..8aedbb5f4b86ec327383fa0d0b08023bc8ba89e5 100644 (file)
@@ -477,18 +477,6 @@ _GLOBAL(__copy_tofrom_user)
        bdnz    130b
 /* then clear out the destination: r3 bytes starting at 4(r6) */
 132:   mfctr   r3
-       srwi.   r0,r3,2
-       li      r9,0
-       mtctr   r0
-       beq     113f
-112:   stwu    r9,4(r6)
-       bdnz    112b
-113:   andi.   r0,r3,3
-       mtctr   r0
-       beq     120f
-114:   stb     r9,4(r6)
-       addi    r6,r6,1
-       bdnz    114b
 120:   blr
 
        EX_TABLE(30b,108b)
@@ -497,7 +485,5 @@ _GLOBAL(__copy_tofrom_user)
        EX_TABLE(41b,111b)
        EX_TABLE(130b,132b)
        EX_TABLE(131b,120b)
-       EX_TABLE(112b,120b)
-       EX_TABLE(114b,120b)
 
 EXPORT_SYMBOL(__copy_tofrom_user)
index aee6e24e81abea9bead1da627d55e96b916d5446..08da06e1bd729c3374493cf570ce053fb5137e79 100644 (file)
@@ -319,32 +319,9 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD)
        blr
 
 /*
- * here we have trapped again, need to clear ctr bytes starting at r3
+ * here we have trapped again, amount remaining is in ctr.
  */
-143:   mfctr   r5
-       li      r0,0
-       mr      r4,r3
-       mr      r3,r5           /* return the number of bytes not copied */
-1:     andi.   r9,r4,7
-       beq     3f
-90:    stb     r0,0(r4)
-       addic.  r5,r5,-1
-       addi    r4,r4,1
-       bne     1b
-       blr
-3:     cmpldi  cr1,r5,8
-       srdi    r9,r5,3
-       andi.   r5,r5,7
-       blt     cr1,93f
-       mtctr   r9
-91:    std     r0,0(r4)
-       addi    r4,r4,8
-       bdnz    91b
-93:    beqlr
-       mtctr   r5      
-92:    stb     r0,0(r4)
-       addi    r4,r4,1
-       bdnz    92b
+143:   mfctr   r3
        blr
 
 /*
@@ -389,10 +366,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD)
        ld      r5,-8(r1)
        add     r6,r6,r5
        subf    r3,r3,r6        /* #bytes not copied */
-190:
-191:
-192:
-       blr                     /* #bytes not copied in r3 */
+       blr
 
        EX_TABLE(20b,120b)
        EX_TABLE(220b,320b)
@@ -451,9 +425,6 @@ END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD)
        EX_TABLE(88b,188b)
        EX_TABLE(43b,143b)
        EX_TABLE(89b,189b)
-       EX_TABLE(90b,190b)
-       EX_TABLE(91b,191b)
-       EX_TABLE(92b,192b)
 
 /*
  * Routine to copy a whole page of data, optimized for POWER4.
diff --git a/arch/powerpc/lib/usercopy_64.c b/arch/powerpc/lib/usercopy_64.c
deleted file mode 100644 (file)
index 9bd3a3d..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Functions which are too large to be inlined.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-#include <linux/module.h>
-#include <linux/uaccess.h>
-
-unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)
-{
-       if (likely(access_ok(VERIFY_READ, from, n)))
-               n = __copy_from_user(to, from, n);
-       else
-               memset(to, 0, n);
-       return n;
-}
-
-unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
-{
-       if (likely(access_ok(VERIFY_WRITE, to, n)))
-               n = __copy_to_user(to, from, n);
-       return n;
-}
-
-unsigned long copy_in_user(void __user *to, const void __user *from,
-                          unsigned long n)
-{
-       might_sleep();
-       if (likely(access_ok(VERIFY_READ, from, n) &&
-           access_ok(VERIFY_WRITE, to, n)))
-               n =__copy_tofrom_user(to, from, n);
-       return n;
-}
-
-EXPORT_SYMBOL(copy_from_user);
-EXPORT_SYMBOL(copy_to_user);
-EXPORT_SYMBOL(copy_in_user);
-