Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b48b2c3e authored by Jonas Bonn's avatar Jonas Bonn Committed by Linus Torvalds
Browse files

openrisc: use generic strnlen_user() function



The generic version is both easier to support and more correct.

Signed-off-by: default avatarJonas Bonn <jonas@southpole.se>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 1629372c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+2 −28
Original line number Diff line number Diff line
@@ -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 */
+0 −47
Original line number Diff line number Diff line
@@ -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