metag/usercopy: Switch to RAW_COPY_USER
Switch to using raw user copy instead of providing metag specific [__]copy_{to,from}_user[_inatomic](). This simplifies the metag uaccess.h and allows us to take advantage of extra checking in the generic versions. Signed-off-by: James Hogan <james.hogan@imgtec.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: linux-metag@vger.kernel.org Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
a98bba563d
Коммит
840db3f938
|
@ -1,5 +1,6 @@
|
|||
config METAG
|
||||
def_bool y
|
||||
select ARCH_HAS_RAW_COPY_USER
|
||||
select EMBEDDED
|
||||
select GENERIC_ATOMIC64
|
||||
select GENERIC_CLOCKEVENTS
|
||||
|
|
|
@ -174,35 +174,8 @@ extern long __must_check strnlen_user(const char __user *src, long count);
|
|||
|
||||
extern unsigned long raw_copy_from_user(void *to, const void __user *from,
|
||||
unsigned long n);
|
||||
|
||||
static inline unsigned long
|
||||
copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||
{
|
||||
unsigned long res = n;
|
||||
if (likely(access_ok(VERIFY_READ, from, n)))
|
||||
res = raw_copy_from_user(to, from, n);
|
||||
if (unlikely(res))
|
||||
memset(to + (n - res), 0, res);
|
||||
return res;
|
||||
}
|
||||
|
||||
#define __copy_from_user(to, from, n) raw_copy_from_user(to, from, n)
|
||||
#define __copy_from_user_inatomic __copy_from_user
|
||||
|
||||
extern unsigned long __must_check __copy_user(void __user *to,
|
||||
const void *from,
|
||||
unsigned long n);
|
||||
|
||||
static inline unsigned long copy_to_user(void __user *to, const void *from,
|
||||
unsigned long n)
|
||||
{
|
||||
if (access_ok(VERIFY_WRITE, to, n))
|
||||
return __copy_user(to, from, n);
|
||||
return n;
|
||||
}
|
||||
|
||||
#define __copy_to_user(to, from, n) __copy_user(to, from, n)
|
||||
#define __copy_to_user_inatomic __copy_to_user
|
||||
extern unsigned long raw_copy_to_user(void __user *to, const void *from,
|
||||
unsigned long n);
|
||||
|
||||
/*
|
||||
* Zero Userspace
|
||||
|
|
|
@ -548,8 +548,8 @@
|
|||
"SUB %1, %1, D0Ar2\n" \
|
||||
"SUB %3, %3, D1Ar1\n")
|
||||
|
||||
unsigned long __copy_user(void __user *pdst, const void *psrc,
|
||||
unsigned long n)
|
||||
unsigned long raw_copy_to_user(void __user *pdst, const void *psrc,
|
||||
unsigned long n)
|
||||
{
|
||||
register char __user *dst asm ("A0.2") = pdst;
|
||||
register const char *src asm ("A1.2") = psrc;
|
||||
|
@ -654,7 +654,7 @@ unsigned long __copy_user(void __user *pdst, const void *psrc,
|
|||
*/
|
||||
return retn;
|
||||
}
|
||||
EXPORT_SYMBOL(__copy_user);
|
||||
EXPORT_SYMBOL(raw_copy_to_user);
|
||||
|
||||
#define __asm_copy_from_user_1(to, from, ret) \
|
||||
__asm_copy_user_cont(to, from, ret, \
|
||||
|
|
Загрузка…
Ссылка в новой задаче