metag/usercopy: Switch to RAW_COPY_USER
authorJames Hogan <james.hogan@imgtec.com>
Tue, 4 Apr 2017 14:46:52 +0000 (15:46 +0100)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 5 Apr 2017 15:43:57 +0000 (11:43 -0400)
Switch to using raw user copy instead of providing metag specific
[__]copy_{to,from}_user[_inatomic](). This simplifies the metag
uaccess.h and allows us to take advantage of extra checking in the
generic versions.

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: linux-metag@vger.kernel.org
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/metag/Kconfig
arch/metag/include/asm/uaccess.h
arch/metag/lib/usercopy.c

index 5b7a45d99cfbfd5397554b399a6ec2bd8e4b5582..ecce0c5ec8e8d4ff42ac7e7702336940f37ad53d 100644 (file)
@@ -1,5 +1,6 @@
 config METAG
        def_bool y
+       select ARCH_HAS_RAW_COPY_USER
        select EMBEDDED
        select GENERIC_ATOMIC64
        select GENERIC_CLOCKEVENTS
index 61805d9f937583cd966975b17f9202fdf18ec3bd..5ebc2850690eb4efb9d29266df9cc9a261517338 100644 (file)
@@ -174,35 +174,8 @@ extern long __must_check strnlen_user(const char __user *src, long count);
 
 extern unsigned long raw_copy_from_user(void *to, const void __user *from,
                                        unsigned long n);
-
-static inline unsigned long
-copy_from_user(void *to, const void __user *from, unsigned long n)
-{
-       unsigned long res = n;
-       if (likely(access_ok(VERIFY_READ, from, n)))
-               res = raw_copy_from_user(to, from, n);
-       if (unlikely(res))
-               memset(to + (n - res), 0, res);
-       return res;
-}
-
-#define __copy_from_user(to, from, n) raw_copy_from_user(to, from, n)
-#define __copy_from_user_inatomic __copy_from_user
-
-extern unsigned long __must_check __copy_user(void __user *to,
-                                             const void *from,
-                                             unsigned long n);
-
-static inline unsigned long copy_to_user(void __user *to, const void *from,
-                                        unsigned long n)
-{
-       if (access_ok(VERIFY_WRITE, to, n))
-               return __copy_user(to, from, n);
-       return n;
-}
-
-#define __copy_to_user(to, from, n) __copy_user(to, from, n)
-#define __copy_to_user_inatomic __copy_to_user
+extern unsigned long raw_copy_to_user(void __user *to, const void *from,
+                                     unsigned long n);
 
 /*
  * Zero Userspace
index 2792fc621088bcd1c3d7bfe58b8560ec32e6f880..e8a4ea83cabbccea76c2fd056ffbdccd8d6a8012 100644 (file)
                "SUB    %1,     %1,     D0Ar2\n"                        \
                "SUB    %3, %3, D1Ar1\n")
 
-unsigned long __copy_user(void __user *pdst, const void *psrc,
-                         unsigned long n)
+unsigned long raw_copy_to_user(void __user *pdst, const void *psrc,
+                              unsigned long n)
 {
        register char __user *dst asm ("A0.2") = pdst;
        register const char *src asm ("A1.2") = psrc;
@@ -654,7 +654,7 @@ unsigned long __copy_user(void __user *pdst, const void *psrc,
         */
        return retn;
 }
-EXPORT_SYMBOL(__copy_user);
+EXPORT_SYMBOL(raw_copy_to_user);
 
 #define __asm_copy_from_user_1(to, from, ret) \
        __asm_copy_user_cont(to, from, ret,     \