openrisc: use generic strncpy_from_user
authorJonas Bonn <jonas@southpole.se>
Fri, 25 May 2012 06:24:49 +0000 (08:24 +0200)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 25 May 2012 15:17:43 +0000 (08:17 -0700)
As per commits 2922585b9329 ("lib: Sparc's strncpy_from_user is generic
enough, move under lib/") and 92ae03f2ef99 ("x86: merge 32/64-bit
versions of 'strncpy_from_user()' and speed it up"), and corresponding
discussion on linux-arch.

Signed-off-by: Jonas Bonn <jonas@southpole.se>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/openrisc/Kconfig
arch/openrisc/include/asm/uaccess.h
arch/openrisc/lib/string.S

index 4932247d078ac3cfde1da41bfa8e759a9b6b8a8e..065623215c583cb8ee760622c3f90fce44ffd877 100644 (file)
@@ -19,6 +19,7 @@ config OPENRISC
        select GENERIC_CPU_DEVICES
        select GENERIC_ATOMIC64
        select GENERIC_CLOCKEVENTS
+       select GENERIC_STRNCPY_FROM_USER
 
 config MMU
        def_bool y
index f5abaa0ffc38c407799b17e97595204277ff4fa4..04b93de926363f7e484e4860a64898417cf577dd 100644 (file)
@@ -313,14 +313,10 @@ clear_user(void *addr, unsigned long size)
        return size;
 }
 
-extern int __strncpy_from_user(char *dst, const char *src, long count);
+#define user_addr_max() \
+       (segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL)
 
-static inline long strncpy_from_user(char *dst, const char *src, long count)
-{
-       if (access_ok(VERIFY_READ, src, 1))
-               return __strncpy_from_user(dst, src, count);
-       return -EFAULT;
-}
+extern long strncpy_from_user(char *dest, const char __user *src, long count);
 
 /*
  * Return the size of a string (including the ending 0)
index 465f04bc7deb1cc7a3413a6e0001a41f16f28641..8ceb11ebafb9d38d1a063431cfa2d5c9de69bec9 100644 (file)
@@ -104,58 +104,6 @@ __clear_user:
                .long 9b, 99b           // write fault
        .previous
 
-/*
- * long strncpy_from_user(char *dst, const char *src, long count)
- *
- *
- */
-       .global __strncpy_from_user
-__strncpy_from_user:
-       l.addi  r1,r1,-16
-       l.sw    0(r1),r6
-       l.sw    4(r1),r5
-       l.sw    8(r1),r4
-       l.sw    12(r1),r3
-
-       l.addi  r11,r5,0
-2:     l.sfeq  r5,r0
-       l.bf    1f
-       l.addi  r5,r5,-1
-8:     l.lbz   r6,0(r4)
-       l.sfeq  r6,r0
-       l.bf    1f
-9:     l.sb    0(r3),r6
-       l.addi  r3,r3,1
-       l.j     2b
-       l.addi  r4,r4,1
-1:
-       l.lwz   r6,0(r1)
-       l.addi  r5,r5,1
-       l.sub   r11,r11,r5              // r11 holds the return value
-
-       l.lwz   r6,0(r1)
-       l.lwz   r5,4(r1)
-       l.lwz   r4,8(r1)
-       l.lwz   r3,12(r1)
-       l.jr    r9
-       l.addi  r1,r1,16
-
-       .section .fixup, "ax"
-99:
-               l.movhi r11,hi(-EFAULT)
-               l.ori   r11,r11,lo(-EFAULT)
-
-               l.lwz   r6,0(r1)
-               l.lwz   r5,4(r1)
-               l.lwz   r4,8(r1)
-               l.lwz   r3,12(r1)
-               l.jr    r9
-               l.addi  r1,r1,16
-       .previous
-
-       .section __ex_table, "a"
-               .long 8b, 99b           // read fault
-       .previous
 
 /*
  * extern int __strnlen_user(const char *str, long len, unsigned long top);