hexagon: switch to RAW_COPY_USER

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2017-03-28 01:28:09 -04:00
parent d597580d37
commit ac4691fac8
5 changed files with 15 additions and 17 deletions

View File

@ -26,6 +26,7 @@ config HEXAGON
select GENERIC_CLOCKEVENTS_BROADCAST select GENERIC_CLOCKEVENTS_BROADCAST
select MODULES_USE_ELF_RELA select MODULES_USE_ELF_RELA
select GENERIC_CPU_DEVICES select GENERIC_CPU_DEVICES
select ARCH_HAS_RAW_COPY_USER
---help--- ---help---
Qualcomm Hexagon is a processor architecture designed for high Qualcomm Hexagon is a processor architecture designed for high
performance and low power across a wide variety of applications. performance and low power across a wide variety of applications.

View File

@ -65,19 +65,12 @@
*/ */
/* Assembly somewhat optimized copy routines */ /* Assembly somewhat optimized copy routines */
unsigned long __copy_from_user_hexagon(void *to, const void __user *from, unsigned long raw_copy_from_user(void *to, const void __user *from,
unsigned long n); unsigned long n);
unsigned long __copy_to_user_hexagon(void __user *to, const void *from, unsigned long raw_copy_to_user(void __user *to, const void *from,
unsigned long n); unsigned long n);
#define INLINE_COPY_FROM_USER
#define __copy_from_user(to, from, n) __copy_from_user_hexagon(to, from, n) #define INLINE_COPY_TO_USER
#define __copy_to_user(to, from, n) __copy_to_user_hexagon(to, from, n)
/*
* XXX todo: some additonal performance gain is possible by
* implementing __copy_to/from_user_inatomic, which is much
* like __copy_to/from_user, but performs slightly less checking.
*/
__kernel_size_t __clear_user_hexagon(void __user *dest, unsigned long count); __kernel_size_t __clear_user_hexagon(void __user *dest, unsigned long count);
#define __clear_user(a, s) __clear_user_hexagon((a), (s)) #define __clear_user(a, s) __clear_user_hexagon((a), (s))
@ -104,10 +97,14 @@ static inline long hexagon_strncpy_from_user(char *dst, const char __user *src,
return -EFAULT; return -EFAULT;
if (res > n) { if (res > n) {
copy_from_user(dst, src, n); long left = raw_copy_from_user(dst, src, n);
if (unlikely(left))
memset(dst + (n - left), 0, left);
return n; return n;
} else { } else {
copy_from_user(dst, src, res); long left = raw_copy_from_user(dst, src, res);
if (unlikely(left))
memset(dst + (res - left), 0, left);
return res-1; return res-1;
} }
} }

View File

@ -25,8 +25,8 @@
/* Additional functions */ /* Additional functions */
EXPORT_SYMBOL(__clear_user_hexagon); EXPORT_SYMBOL(__clear_user_hexagon);
EXPORT_SYMBOL(__copy_from_user_hexagon); EXPORT_SYMBOL(raw_copy_from_user);
EXPORT_SYMBOL(__copy_to_user_hexagon); EXPORT_SYMBOL(raw_copy_to_user);
EXPORT_SYMBOL(__iounmap); EXPORT_SYMBOL(__iounmap);
EXPORT_SYMBOL(__strnlen_user); EXPORT_SYMBOL(__strnlen_user);
EXPORT_SYMBOL(__vmgetie); EXPORT_SYMBOL(__vmgetie);

View File

@ -44,7 +44,7 @@
#define bytes r2 #define bytes r2
#define loopcount r5 #define loopcount r5
#define FUNCNAME __copy_from_user_hexagon #define FUNCNAME raw_copy_from_user
#include "copy_user_template.S" #include "copy_user_template.S"
/* LOAD FAULTS from COPY_FROM_USER */ /* LOAD FAULTS from COPY_FROM_USER */

View File

@ -43,7 +43,7 @@
#define bytes r2 #define bytes r2
#define loopcount r5 #define loopcount r5
#define FUNCNAME __copy_to_user_hexagon #define FUNCNAME raw_copy_to_user
#include "copy_user_template.S" #include "copy_user_template.S"
/* STORE FAULTS from COPY_TO_USER */ /* STORE FAULTS from COPY_TO_USER */