openrisc: use generic strnlen_user() function
authorJonas Bonn <jonas@southpole.se>
Sun, 27 May 2012 08:25:47 +0000 (10:25 +0200)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 28 May 2012 04:00:32 +0000 (21:00 -0700)
The generic version is both easier to support and more correct.

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 065623215c583cb8ee760622c3f90fce44ffd877..49765b53f6374709943a1c1a5d17b46cad1846fb 100644 (file)
@@ -20,6 +20,7 @@ config OPENRISC
        select GENERIC_ATOMIC64
        select GENERIC_CLOCKEVENTS
        select GENERIC_STRNCPY_FROM_USER
+       select GENERIC_STRNLEN_USER
 
 config MMU
        def_bool y
index 04b93de926363f7e484e4860a64898417cf577dd..ab2e7a198a4cfedfc0bb99249ec597d26333db5b 100644 (file)
@@ -318,33 +318,7 @@ clear_user(void *addr, unsigned long size)
 
 extern long strncpy_from_user(char *dest, const char __user *src, long count);
 
-/*
- * Return the size of a string (including the ending 0)
- *
- * Return 0 for error
- */
-
-extern int __strnlen_user(const char *str, long len, unsigned long top);
-
-/*
- * Returns the length of the string at str (including the null byte),
- * or 0 if we hit a page we can't access,
- * or something > len if we didn't find a null byte.
- *
- * The `top' parameter to __strnlen_user is to make sure that
- * we can never overflow from the user area into kernel space.
- */
-static inline long strnlen_user(const char __user *str, long len)
-{
-       unsigned long top = (unsigned long)get_fs();
-       unsigned long res = 0;
-
-       if (__addr_ok(str))
-               res = __strnlen_user(str, len, top);
-
-       return res;
-}
-
-#define strlen_user(str) strnlen_user(str, TASK_SIZE-1)
+extern __must_check long strlen_user(const char __user *str);
+extern __must_check long strnlen_user(const char __user *str, long n);
 
 #endif /* __ASM_OPENRISC_UACCESS_H */
index 8ceb11ebafb9d38d1a063431cfa2d5c9de69bec9..c09fee7dec1455082273c9e46b6b2665603f856a 100644 (file)
@@ -103,50 +103,3 @@ __clear_user:
        .section __ex_table, "a"
                .long 9b, 99b           // write fault
        .previous
-
-
-/*
- * extern int __strnlen_user(const char *str, long len, unsigned long top);
- *
- *
- * RTRN: - length of a string including NUL termination character
- *       - on page fault 0
- */
-
-       .global __strnlen_user
-__strnlen_user:
-       l.addi  r1,r1,-8
-       l.sw    0(r1),r6
-       l.sw    4(r1),r3
-
-       l.addi  r11,r0,0
-2:     l.sfeq  r11,r4
-       l.bf    1f
-       l.addi  r11,r11,1
-8:     l.lbz   r6,0(r3)
-       l.sfeq  r6,r0
-       l.bf    1f
-       l.sfgeu r3,r5                  // are we over the top ?
-       l.bf    99f
-       l.j     2b
-       l.addi  r3,r3,1
-
-1:
-       l.lwz   r6,0(r1)
-       l.lwz   r3,4(r1)
-       l.jr    r9
-       l.addi  r1,r1,8
-
-       .section .fixup, "ax"
-99:
-               l.addi  r11,r0,0
-
-               l.lwz   r6,0(r1)
-               l.lwz   r3,4(r1)
-               l.jr    r9
-               l.addi  r1,r1,8
-       .previous
-
-       .section __ex_table, "a"
-               .long 8b, 99b           // read fault
-       .previous