Skip to content

Commit

Permalink
openrisc: use generic strnlen_user() function
Browse files Browse the repository at this point in the history
The generic version is both easier to support and more correct.

Signed-off-by: Jonas Bonn <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Jonas Bonn authored and torvalds committed May 28, 2012
1 parent 1629372 commit b48b2c3
Show file tree
Hide file tree
Showing 3 changed files with 3 additions and 75 deletions.
1 change: 1 addition & 0 deletions arch/openrisc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
30 changes: 2 additions & 28 deletions arch/openrisc/include/asm/uaccess.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
47 changes: 0 additions & 47 deletions arch/openrisc/lib/string.S
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit b48b2c3

Please sign in to comment.