... and drop zeroing in sparc32.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
        select HAVE_ARCH_HARDENED_USERCOPY
        select PROVE_LOCKING_SMALL if PROVE_LOCKING
        select ARCH_WANT_RELAX_ORDER
+       select ARCH_HAS_RAW_COPY_USER
 
 config SPARC32
        def_bool !64BIT
 
 
 unsigned long __copy_user(void __user *to, const void __user *from, unsigned long size);
 
-static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
+static inline unsigned long raw_copy_to_user(void __user *to, const void *from, unsigned long n)
 {
-       if (n && __access_ok((unsigned long) to, n)) {
-               check_object_size(from, n, true);
-               return __copy_user(to, (__force void __user *) from, n);
-       } else
-               return n;
-}
-
-static inline unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n)
-{
-       check_object_size(from, n, true);
        return __copy_user(to, (__force void __user *) from, n);
 }
 
-static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)
-{
-       if (n && __access_ok((unsigned long) from, n)) {
-               check_object_size(to, n, false);
-               return __copy_user((__force void __user *) to, from, n);
-       } else {
-               memset(to, 0, n);
-               return n;
-       }
-}
-
-static inline unsigned long __copy_from_user(void *to, const void __user *from, unsigned long n)
+static inline unsigned long raw_copy_from_user(void *to, const void __user *from, unsigned long n)
 {
        return __copy_user((__force void __user *) to, from, n);
 }
 
-#define __copy_to_user_inatomic __copy_to_user
-#define __copy_from_user_inatomic __copy_from_user
+#define INLINE_COPY_FROM_USER
+#define INLINE_COPY_TO_USER
 
 static inline unsigned long __clear_user(void __user *addr, unsigned long size)
 {
 
 
 int __get_user_bad(void);
 
-unsigned long __must_check ___copy_from_user(void *to,
+unsigned long __must_check raw_copy_from_user(void *to,
                                             const void __user *from,
                                             unsigned long size);
-static inline unsigned long __must_check
-copy_from_user(void *to, const void __user *from, unsigned long size)
-{
-       check_object_size(to, size, false);
-
-       return ___copy_from_user(to, from, size);
-}
-#define __copy_from_user copy_from_user
 
-unsigned long __must_check ___copy_to_user(void __user *to,
+unsigned long __must_check raw_copy_to_user(void __user *to,
                                           const void *from,
                                           unsigned long size);
-static inline unsigned long __must_check
-copy_to_user(void __user *to, const void *from, unsigned long size)
-{
-       check_object_size(from, size, true);
+#define INLINE_COPY_FROM_USER
+#define INLINE_COPY_TO_USER
 
-       return ___copy_to_user(to, from, size);
-}
-#define __copy_to_user copy_to_user
-
-unsigned long __must_check ___copy_in_user(void __user *to,
+unsigned long __must_check raw_copy_in_user(void __user *to,
                                           const void __user *from,
                                           unsigned long size);
-static inline unsigned long __must_check
-copy_in_user(void __user *to, void __user *from, unsigned long size)
-{
-       return ___copy_in_user(to, from, size);
-}
-#define __copy_in_user copy_in_user
 
 unsigned long __must_check __clear_user(void __user *, unsigned long);
 
 __must_check long strlen_user(const char __user *str);
 __must_check long strnlen_user(const char __user *str, long n);
 
-#define __copy_to_user_inatomic __copy_to_user
-#define __copy_from_user_inatomic __copy_from_user
-
 struct pt_regs;
 unsigned long compute_effective_address(struct pt_regs *,
                                        unsigned int insn,
 
 #define PREAMBLE                                       \
        rd              %asi, %g1;                      \
        cmp             %g1, ASI_AIUS;                  \
-       bne,pn          %icc, ___copy_in_user;          \
+       bne,pn          %icc, raw_copy_in_user;         \
         nop
 #endif
 
 
 #define PREAMBLE                                       \
        rd              %asi, %g1;                      \
        cmp             %g1, ASI_AIUS;                  \
-       bne,pn          %icc, ___copy_in_user;          \
+       bne,pn          %icc, raw_copy_in_user;         \
         nop
 #endif
 
 
        .type   generic_patch_copyops,#function
 generic_patch_copyops:
        GEN_DO_PATCH(memcpy, GENmemcpy)
-       GEN_DO_PATCH(___copy_from_user, GENcopy_from_user)
-       GEN_DO_PATCH(___copy_to_user, GENcopy_to_user)
+       GEN_DO_PATCH(raw_copy_from_user, GENcopy_from_user)
+       GEN_DO_PATCH(raw_copy_to_user, GENcopy_to_user)
        retl
         nop
        .size   generic_patch_copyops,.-generic_patch_copyops
 
 #define PREAMBLE                                       \
        rd              %asi, %g1;                      \
        cmp             %g1, ASI_AIUS;                  \
-       bne,pn          %icc, ___copy_in_user;          \
+       bne,pn          %icc, raw_copy_in_user;         \
         nop
 #endif
 
 
 #define PREAMBLE                                       \
        rd              %asi, %g1;                      \
        cmp             %g1, ASI_AIUS;                  \
-       bne,pn          %icc, ___copy_in_user;          \
+       bne,pn          %icc, raw_copy_in_user;         \
         nop
 #endif
 
 
        .type   niagara2_patch_copyops,#function
 niagara2_patch_copyops:
        NG_DO_PATCH(memcpy, NG2memcpy)
-       NG_DO_PATCH(___copy_from_user, NG2copy_from_user)
-       NG_DO_PATCH(___copy_to_user, NG2copy_to_user)
+       NG_DO_PATCH(raw_copy_from_user, NG2copy_from_user)
+       NG_DO_PATCH(raw_copy_to_user, NG2copy_to_user)
        retl
         nop
        .size   niagara2_patch_copyops,.-niagara2_patch_copyops
 
 #define PREAMBLE                                       \
        rd              %asi, %g1;                      \
        cmp             %g1, ASI_AIUS;                  \
-       bne,pn          %icc, ___copy_in_user;          \
+       bne,pn          %icc, raw_copy_in_user;         \
         nop
 #endif
 
 
 #define PREAMBLE                                       \
        rd              %asi, %g1;                      \
        cmp             %g1, ASI_AIUS;                  \
-       bne,pn          %icc, ___copy_in_user;          \
+       bne,pn          %icc, raw_copy_in_user;         \
         nop
 #endif
 
 
        .type   niagara4_patch_copyops,#function
 niagara4_patch_copyops:
        NG_DO_PATCH(memcpy, NG4memcpy)
-       NG_DO_PATCH(___copy_from_user, NG4copy_from_user)
-       NG_DO_PATCH(___copy_to_user, NG4copy_to_user)
+       NG_DO_PATCH(raw_copy_from_user, NG4copy_from_user)
+       NG_DO_PATCH(raw_copy_to_user, NG4copy_to_user)
        retl
         nop
        .size   niagara4_patch_copyops,.-niagara4_patch_copyops
 
 #define PREAMBLE                                       \
        rd              %asi, %g1;                      \
        cmp             %g1, ASI_AIUS;                  \
-       bne,pn          %icc, ___copy_in_user;          \
+       bne,pn          %icc, raw_copy_in_user;         \
         nop
 #endif
 
 
 #define PREAMBLE                                       \
        rd              %asi, %g1;                      \
        cmp             %g1, ASI_AIUS;                  \
-       bne,pn          %icc, ___copy_in_user;          \
+       bne,pn          %icc, raw_copy_in_user;         \
         nop
 #endif
 
 
        .type   niagara_patch_copyops,#function
 niagara_patch_copyops:
        NG_DO_PATCH(memcpy, NGmemcpy)
-       NG_DO_PATCH(___copy_from_user, NGcopy_from_user)
-       NG_DO_PATCH(___copy_to_user, NGcopy_to_user)
+       NG_DO_PATCH(raw_copy_from_user, NGcopy_from_user)
+       NG_DO_PATCH(raw_copy_to_user, NGcopy_to_user)
        retl
         nop
        .size   niagara_patch_copyops,.-niagara_patch_copyops
 
        .text;                  \
        .align 4;
 
-#define FUNC_NAME              ___copy_from_user
+#define FUNC_NAME              raw_copy_from_user
 #define LOAD(type,addr,dest)   type##a [addr] %asi, dest
 #define LOAD_BLK(addr,dest)    ldda [addr] ASI_BLK_AIUS, dest
 #define EX_RETVAL(x)           0
 #define PREAMBLE                                       \
        rd              %asi, %g1;                      \
        cmp             %g1, ASI_AIUS;                  \
-       bne,pn          %icc, ___copy_in_user;          \
+       bne,pn          %icc, raw_copy_in_user;         \
         nop;                                           \
 
 #include "U1memcpy.S"
 
        .text;                  \
        .align 4;
 
-#define FUNC_NAME              ___copy_to_user
+#define FUNC_NAME              raw_copy_to_user
 #define STORE(type,src,addr)   type##a src, [addr] ASI_AIUS
 #define STORE_BLK(src,addr)    stda src, [addr] ASI_BLK_AIUS
 #define EX_RETVAL(x)           0
 #define PREAMBLE                                       \
        rd              %asi, %g1;                      \
        cmp             %g1, ASI_AIUS;                  \
-       bne,pn          %icc, ___copy_in_user;          \
+       bne,pn          %icc, raw_copy_in_user;         \
         nop;                                           \
 
 #include "U1memcpy.S"
 
 #define PREAMBLE                                       \
        rd              %asi, %g1;                      \
        cmp             %g1, ASI_AIUS;                  \
-       bne,pn          %icc, ___copy_in_user;          \
+       bne,pn          %icc, raw_copy_in_user;         \
         nop;                                           \
 
 #include "U3memcpy.S"
 
        .type   cheetah_patch_copyops,#function
 cheetah_patch_copyops:
        ULTRA3_DO_PATCH(memcpy, U3memcpy)
-       ULTRA3_DO_PATCH(___copy_from_user, U3copy_from_user)
-       ULTRA3_DO_PATCH(___copy_to_user, U3copy_to_user)
+       ULTRA3_DO_PATCH(raw_copy_from_user, U3copy_from_user)
+       ULTRA3_DO_PATCH(raw_copy_to_user, U3copy_to_user)
        retl
         nop
        .size   cheetah_patch_copyops,.-cheetah_patch_copyops
 
         * to copy register windows around during thread cloning.
         */
 
-ENTRY(___copy_in_user) /* %o0=dst, %o1=src, %o2=len */
+ENTRY(raw_copy_in_user)        /* %o0=dst, %o1=src, %o2=len */
        cmp             %o2, 0
        be,pn           %XCC, 85f
         or             %o0, %o1, %o3
         add            %o0, 1, %o0
        retl
         clr            %o0
-ENDPROC(___copy_in_user)
-EXPORT_SYMBOL(___copy_in_user)
+ENDPROC(raw_copy_in_user)
+EXPORT_SYMBOL(raw_copy_in_user)
 
 97:
        mov     %o2, %g3
 fixupretl:
-       sethi   %hi(PAGE_OFFSET), %g1
-       cmp     %o0, %g1
-       blu     1f
-        cmp    %o1, %g1
-       bgeu    1f
-        ld     [%g6 + TI_PREEMPT], %g1
-       cmp     %g1, 0
-       bne     1f
-        nop
-       save    %sp, -64, %sp
-       mov     %i0, %o0
-       call    __bzero
-        mov    %g3, %o1
-       restore
-1:     retl
+       retl
         mov    %g3, %o0
 
 /* exception routine sets %g2 to (broken_insn - first_insn)>>2 */