mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-09-22 04:31:58 +08:00
asm-generic: uaccess.h cleanup
Like in 3.19, I once more have a multi-stage cleanup for one asm-generic header file, this time the work was done by Michael Tsirkin and cleans up the uaccess.h file in asm-generic, as well as all architectures for which the respective maintainers did not pick up his patches directly. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIVAwUAVONFpmCrR//JCVInAQIoYRAA1T3ID1bQLqdi8TU1X+vzutXzGFRhRFii u18GYeN6sGTcfqQD0GsNSaH7G8XehF3cgJ9eo4h9YkRPIG/0T0FO+dqdB0uRh8iy GKcUqVhgvCFpOBDUJC6FgMvgWWyVrgSUBqG6qSXck/PDcMSsUa/m/GcLhR/sHWGn EGEAzYNvJgdOaJ1z0vfPFK6mPwFwmYzIss5XFuoBAKKN856fBlxofkQqdpKjGDFH n0UziaJ5tbCdlZ9M9Y5JN9RU8yBCcOmGHnHUAQHz3BXOt9sD7o5jDuzsUbj+vUGJ gzNc8kee9Pyy8ZA1F959gspaxe5Oumq7NLgs3HDjK6ZDRKpJvZb6iXi56f15chlZ dItTbFSxCHOFs0d8XJKNbmPt44pJ/qKO+03lMIGttMkIm7hXfvyMWSPZV9G0Pu1y zbWEDgW2Mdrdt0saNSD46IEp+c7E5P3D9JSctQRdQjReoCbOHwqrSHi1Zeg97XL4 I1E0KwDqFUw3P1dXr5ahXmR50ZigBGjN5Fz3N7GmJt2x4PRSS2Sw92hyCrL0YM8J 56FdRA7UJ0V/SzmAko3F5wWmhabc6L+qrVA42R6U3SNSjU8hwppOkYKDINNhPZfL SGy1oQS6Jj10WxLOVp66NC7XxXzBybDcQnatz4XtNN8P5sfekUGSGBeMyMsHl7IJ 9MT3xym+DWU= =LROx -----END PGP SIGNATURE----- Merge tag 'asm-generic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic Pull asm-generic uaccess.h cleanup from Arnd Bergmann: "Like in 3.19, I once more have a multi-stage cleanup for one asm-generic header file, this time the work was done by Michael Tsirkin and cleans up the uaccess.h file in asm-generic, as well as all architectures for which the respective maintainers did not pick up his patches directly" * tag 'asm-generic-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic: (37 commits) sparc32: nocheck uaccess coding style tweaks sparc64: nocheck uaccess coding style tweaks xtensa: macro whitespace fixes sh: macro whitespace fixes parisc: macro whitespace fixes m68k: macro whitespace fixes m32r: macro whitespace fixes frv: macro whitespace fixes cris: macro whitespace fixes avr32: macro whitespace fixes arm64: macro whitespace fixes arm: macro whitespace fixes alpha: macro whitespace fixes blackfin: macro whitespace fixes sparc64: uaccess_64 macro whitespace fixes sparc32: uaccess_32 macro whitespace fixes avr32: whitespace fix sh: fix put_user sparse errors metag: fix put_user sparse errors ia64: fix put_user sparse errors ...
This commit is contained in:
commit
eaa0eda562
@ -96,7 +96,7 @@ extern void __get_user_unknown(void);
|
||||
case 8: __get_user_64(ptr); break; \
|
||||
default: __get_user_unknown(); break; \
|
||||
} \
|
||||
(x) = (__typeof__(*(ptr))) __gu_val; \
|
||||
(x) = (__force __typeof__(*(ptr))) __gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
@ -115,7 +115,7 @@ extern void __get_user_unknown(void);
|
||||
default: __get_user_unknown(); break; \
|
||||
} \
|
||||
} \
|
||||
(x) = (__typeof__(*(ptr))) __gu_val; \
|
||||
(x) = (__force __typeof__(*(ptr))) __gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
|
@ -413,14 +413,14 @@ do { \
|
||||
#ifndef __ARMEB__
|
||||
#define __put_user_asm_half(x, __pu_addr, err) \
|
||||
({ \
|
||||
unsigned long __temp = (unsigned long)(x); \
|
||||
unsigned long __temp = (__force unsigned long)(x); \
|
||||
__put_user_asm_byte(__temp, __pu_addr, err); \
|
||||
__put_user_asm_byte(__temp >> 8, __pu_addr + 1, err); \
|
||||
})
|
||||
#else
|
||||
#define __put_user_asm_half(x, __pu_addr, err) \
|
||||
({ \
|
||||
unsigned long __temp = (unsigned long)(x); \
|
||||
unsigned long __temp = (__force unsigned long)(x); \
|
||||
__put_user_asm_byte(__temp >> 8, __pu_addr, err); \
|
||||
__put_user_asm_byte(__temp, __pu_addr + 1, err); \
|
||||
})
|
||||
|
@ -147,7 +147,7 @@ do { \
|
||||
default: \
|
||||
BUILD_BUG(); \
|
||||
} \
|
||||
(x) = (__typeof__(*(ptr)))__gu_val; \
|
||||
(x) = (__force __typeof__(*(ptr)))__gu_val; \
|
||||
} while (0)
|
||||
|
||||
#define __get_user(x, ptr) \
|
||||
|
@ -191,7 +191,7 @@ extern int __put_user_bad(void);
|
||||
default: __gu_err = __get_user_bad(); break; \
|
||||
} \
|
||||
\
|
||||
x = (typeof(*(ptr)))__gu_val; \
|
||||
x = (__force typeof(*(ptr)))__gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
@ -222,7 +222,7 @@ extern int __put_user_bad(void);
|
||||
} else { \
|
||||
__gu_err = -EFAULT; \
|
||||
} \
|
||||
x = (typeof(*(ptr)))__gu_val; \
|
||||
x = (__force typeof(*(ptr)))__gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
|
@ -89,10 +89,10 @@ struct exception_table_entry {
|
||||
break; \
|
||||
case 8: { \
|
||||
long _xl, _xh; \
|
||||
_xl = ((long *)&_x)[0]; \
|
||||
_xh = ((long *)&_x)[1]; \
|
||||
__put_user_asm(_xl, ((long __user *)_p)+0, ); \
|
||||
__put_user_asm(_xh, ((long __user *)_p)+1, ); \
|
||||
_xl = ((__force long *)&_x)[0]; \
|
||||
_xh = ((__force long *)&_x)[1]; \
|
||||
__put_user_asm(_xl, ((__force long __user *)_p)+0, );\
|
||||
__put_user_asm(_xh, ((__force long __user *)_p)+1, );\
|
||||
} break; \
|
||||
default: \
|
||||
_err = __put_user_bad(); \
|
||||
@ -147,7 +147,7 @@ static inline int bad_user_access_length(void)
|
||||
} \
|
||||
} else \
|
||||
_err = -EFAULT; \
|
||||
x = (typeof(*(ptr)))_val; \
|
||||
x = (__force typeof(*(ptr)))_val; \
|
||||
_err; \
|
||||
})
|
||||
|
||||
|
@ -171,7 +171,8 @@ do { \
|
||||
} while (0)
|
||||
# define __put_user_size(val, addr, n, err) \
|
||||
do { \
|
||||
__st_user("__ex_table", (unsigned long) addr, n, RELOC_TYPE, (unsigned long) (val)); \
|
||||
__st_user("__ex_table", (unsigned long) addr, n, RELOC_TYPE, \
|
||||
(__force unsigned long) (val)); \
|
||||
(err) = ia64_getreg(_IA64_REG_R8); \
|
||||
} while (0)
|
||||
#endif /* !ASM_SUPPORTED */
|
||||
@ -197,7 +198,7 @@ extern void __get_user_unknown (void);
|
||||
case 8: __get_user_size(__gu_val, __gu_ptr, 8, __gu_err); break; \
|
||||
default: __get_user_unknown(); break; \
|
||||
} \
|
||||
(x) = (__typeof__(*(__gu_ptr))) __gu_val; \
|
||||
(x) = (__force __typeof__(*(__gu_ptr))) __gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
|
@ -218,7 +218,7 @@ extern int fixup_exception(struct pt_regs *regs);
|
||||
unsigned long __gu_val; \
|
||||
might_fault(); \
|
||||
__get_user_size(__gu_val, (ptr), (size), __gu_err); \
|
||||
(x) = (__typeof__(*(ptr)))__gu_val; \
|
||||
(x) = (__force __typeof__(*(ptr)))__gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
@ -230,7 +230,7 @@ extern int fixup_exception(struct pt_regs *regs);
|
||||
might_fault(); \
|
||||
if (access_ok(VERIFY_READ, __gu_addr, size)) \
|
||||
__get_user_size(__gu_val, __gu_addr, (size), __gu_err); \
|
||||
(x) = (__typeof__(*(ptr)))__gu_val; \
|
||||
(x) = (__force __typeof__(*(ptr)))__gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
|
@ -146,7 +146,7 @@ asm volatile ("\n" \
|
||||
" .previous" \
|
||||
: "+d" (res), "=&" #reg (__gu_val) \
|
||||
: "m" (*(ptr)), "i" (err)); \
|
||||
(x) = (typeof(*(ptr)))(unsigned long)__gu_val; \
|
||||
(x) = (__force typeof(*(ptr)))(__force unsigned long)__gu_val; \
|
||||
})
|
||||
|
||||
#define __get_user(x, ptr) \
|
||||
@ -188,7 +188,7 @@ asm volatile ("\n" \
|
||||
"+a" (__gu_ptr) \
|
||||
: "i" (-EFAULT) \
|
||||
: "memory"); \
|
||||
(x) = (typeof(*(ptr)))__gu_val; \
|
||||
(x) = (__force typeof(*(ptr)))__gu_val; \
|
||||
break; \
|
||||
} */ \
|
||||
default: \
|
||||
|
@ -112,13 +112,18 @@ do { \
|
||||
retval = 0; \
|
||||
switch (size) { \
|
||||
case 1: \
|
||||
retval = __put_user_asm_b((unsigned int)x, ptr); break; \
|
||||
retval = __put_user_asm_b((__force unsigned int)x, ptr);\
|
||||
break; \
|
||||
case 2: \
|
||||
retval = __put_user_asm_w((unsigned int)x, ptr); break; \
|
||||
retval = __put_user_asm_w((__force unsigned int)x, ptr);\
|
||||
break; \
|
||||
case 4: \
|
||||
retval = __put_user_asm_d((unsigned int)x, ptr); break; \
|
||||
retval = __put_user_asm_d((__force unsigned int)x, ptr);\
|
||||
break; \
|
||||
case 8: \
|
||||
retval = __put_user_asm_l((unsigned long long)x, ptr); break; \
|
||||
retval = __put_user_asm_l((__force unsigned long long)x,\
|
||||
ptr); \
|
||||
break; \
|
||||
default: \
|
||||
__put_user_bad(); \
|
||||
} \
|
||||
@ -135,7 +140,7 @@ extern long __get_user_bad(void);
|
||||
({ \
|
||||
long __gu_err, __gu_val; \
|
||||
__get_user_size(__gu_val, (ptr), (size), __gu_err); \
|
||||
(x) = (__typeof__(*(ptr)))__gu_val; \
|
||||
(x) = (__force __typeof__(*(ptr)))__gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
@ -145,7 +150,7 @@ extern long __get_user_bad(void);
|
||||
const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
|
||||
if (access_ok(VERIFY_READ, __gu_addr, size)) \
|
||||
__get_user_size(__gu_val, __gu_addr, (size), __gu_err); \
|
||||
(x) = (__typeof__(*(ptr)))__gu_val; \
|
||||
(x) = (__force __typeof__(*(ptr)))__gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
|
@ -192,7 +192,7 @@ struct __large_struct {
|
||||
({ \
|
||||
long __gu_err, __gu_val; \
|
||||
__get_user_size(__gu_val, (ptr), (size), __gu_err); \
|
||||
(x) = (__typeof__(*(ptr)))__gu_val; \
|
||||
(x) = (__force __typeof__(*(ptr)))__gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
@ -202,7 +202,7 @@ struct __large_struct {
|
||||
const __typeof__(*(ptr)) * __gu_addr = (ptr); \
|
||||
if (access_ok(VERIFY_READ, __gu_addr, size)) \
|
||||
__get_user_size(__gu_val, __gu_addr, (size), __gu_err); \
|
||||
(x) = (__typeof__(*(ptr)))__gu_val; \
|
||||
(x) = (__force __typeof__(*(ptr)))__gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
|
@ -60,7 +60,7 @@ struct __large_struct { unsigned long buf[100]; };
|
||||
const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
|
||||
__chk_user_ptr(ptr); \
|
||||
__get_user_size(__gu_val, __gu_addr, (size), __gu_err); \
|
||||
(x) = (__typeof__(*(ptr)))__gu_val; \
|
||||
(x) = (__force __typeof__(*(ptr)))__gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
@ -71,7 +71,7 @@ struct __large_struct { unsigned long buf[100]; };
|
||||
const __typeof__(*(ptr)) *__gu_addr = (ptr); \
|
||||
if (likely(access_ok(VERIFY_READ, __gu_addr, (size)))) \
|
||||
__get_user_size(__gu_val, __gu_addr, (size), __gu_err); \
|
||||
(x) = (__typeof__(*(ptr)))__gu_val; \
|
||||
(x) = (__force __typeof__(*(ptr)))__gu_val; \
|
||||
__gu_err; \
|
||||
})
|
||||
|
||||
|
@ -59,19 +59,19 @@ do { \
|
||||
switch (size) { \
|
||||
case 1: \
|
||||
retval = __put_user_asm_b((void *)&x, \
|
||||
(long)ptr); \
|
||||
(__force long)ptr); \
|
||||
break; \
|
||||
case 2: \
|
||||
retval = __put_user_asm_w((void *)&x, \
|
||||
(long)ptr); \
|
||||
(__force long)ptr); \
|
||||
break; \
|
||||
case 4: \
|
||||
retval = __put_user_asm_l((void *)&x, \
|
||||
(long)ptr); \
|
||||
(__force long)ptr); \
|
||||
break; \
|
||||
case 8: \
|
||||
retval = __put_user_asm_q((void *)&x, \
|
||||
(long)ptr); \
|
||||
(__force long)ptr); \
|
||||
break; \
|
||||
default: \
|
||||
__put_user_unknown(); \
|
||||
|
@ -94,20 +94,24 @@ void __ret_efault(void);
|
||||
#define put_user(x, ptr) ({ \
|
||||
unsigned long __pu_addr = (unsigned long)(ptr); \
|
||||
__chk_user_ptr(ptr); \
|
||||
__put_user_check((__typeof__(*(ptr)))(x),__pu_addr,sizeof(*(ptr))); })
|
||||
__put_user_check((__typeof__(*(ptr)))(x), __pu_addr, sizeof(*(ptr))); \
|
||||
})
|
||||
|
||||
#define get_user(x, ptr) ({ \
|
||||
unsigned long __gu_addr = (unsigned long)(ptr); \
|
||||
__chk_user_ptr(ptr); \
|
||||
__get_user_check((x),__gu_addr,sizeof(*(ptr)),__typeof__(*(ptr))); })
|
||||
__get_user_check((x), __gu_addr, sizeof(*(ptr)), __typeof__(*(ptr))); \
|
||||
})
|
||||
|
||||
/*
|
||||
* The "__xxx" versions do not do address space checking, useful when
|
||||
* doing multiple accesses to the same area (the user has to do the
|
||||
* checks by hand with "access_ok()")
|
||||
*/
|
||||
#define __put_user(x,ptr) __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
|
||||
#define __get_user(x,ptr) __get_user_nocheck((x),(ptr),sizeof(*(ptr)),__typeof__(*(ptr)))
|
||||
#define __put_user(x, ptr) \
|
||||
__put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
|
||||
#define __get_user(x, ptr) \
|
||||
__get_user_nocheck((x), (ptr), sizeof(*(ptr)), __typeof__(*(ptr)))
|
||||
|
||||
struct __large_struct { unsigned long buf[100]; };
|
||||
#define __m(x) ((struct __large_struct __user *)(x))
|
||||
@ -116,12 +120,27 @@ struct __large_struct { unsigned long buf[100]; };
|
||||
register int __pu_ret; \
|
||||
if (__access_ok(addr, size)) { \
|
||||
switch (size) { \
|
||||
case 1: __put_user_asm(x,b,addr,__pu_ret); break; \
|
||||
case 2: __put_user_asm(x,h,addr,__pu_ret); break; \
|
||||
case 4: __put_user_asm(x,,addr,__pu_ret); break; \
|
||||
case 8: __put_user_asm(x,d,addr,__pu_ret); break; \
|
||||
default: __pu_ret = __put_user_bad(); break; \
|
||||
} } else { __pu_ret = -EFAULT; } __pu_ret; })
|
||||
case 1: \
|
||||
__put_user_asm(x, b, addr, __pu_ret); \
|
||||
break; \
|
||||
case 2: \
|
||||
__put_user_asm(x, h, addr, __pu_ret); \
|
||||
break; \
|
||||
case 4: \
|
||||
__put_user_asm(x, , addr, __pu_ret); \
|
||||
break; \
|
||||
case 8: \
|
||||
__put_user_asm(x, d, addr, __pu_ret); \
|
||||
break; \
|
||||
default: \
|
||||
__pu_ret = __put_user_bad(); \
|
||||
break; \
|
||||
} \
|
||||
} else { \
|
||||
__pu_ret = -EFAULT; \
|
||||
} \
|
||||
__pu_ret; \
|
||||
})
|
||||
|
||||
#define __put_user_nocheck(x, addr, size) ({ \
|
||||
register int __pu_ret; \
|
||||
@ -131,7 +150,9 @@ case 2: __put_user_asm(x,h,addr,__pu_ret); break; \
|
||||
case 4: __put_user_asm(x, , addr, __pu_ret); break; \
|
||||
case 8: __put_user_asm(x, d, addr, __pu_ret); break; \
|
||||
default: __pu_ret = __put_user_bad(); break; \
|
||||
} __pu_ret; })
|
||||
} \
|
||||
__pu_ret; \
|
||||
})
|
||||
|
||||
#define __put_user_asm(x, size, addr, ret) \
|
||||
__asm__ __volatile__( \
|
||||
@ -159,23 +180,55 @@ register int __gu_ret; \
|
||||
register unsigned long __gu_val; \
|
||||
if (__access_ok(addr, size)) { \
|
||||
switch (size) { \
|
||||
case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; \
|
||||
case 2: __get_user_asm(__gu_val,uh,addr,__gu_ret); break; \
|
||||
case 4: __get_user_asm(__gu_val,,addr,__gu_ret); break; \
|
||||
case 8: __get_user_asm(__gu_val,d,addr,__gu_ret); break; \
|
||||
default: __gu_val = 0; __gu_ret = __get_user_bad(); break; \
|
||||
} } else { __gu_val = 0; __gu_ret = -EFAULT; } x = (type) __gu_val; __gu_ret; })
|
||||
case 1: \
|
||||
__get_user_asm(__gu_val, ub, addr, __gu_ret); \
|
||||
break; \
|
||||
case 2: \
|
||||
__get_user_asm(__gu_val, uh, addr, __gu_ret); \
|
||||
break; \
|
||||
case 4: \
|
||||
__get_user_asm(__gu_val, , addr, __gu_ret); \
|
||||
break; \
|
||||
case 8: \
|
||||
__get_user_asm(__gu_val, d, addr, __gu_ret); \
|
||||
break; \
|
||||
default: \
|
||||
__gu_val = 0; \
|
||||
__gu_ret = __get_user_bad(); \
|
||||
break; \
|
||||
} \
|
||||
} else { \
|
||||
__gu_val = 0; \
|
||||
__gu_ret = -EFAULT; \
|
||||
} \
|
||||
x = (__force type) __gu_val; \
|
||||
__gu_ret; \
|
||||
})
|
||||
|
||||
#define __get_user_check_ret(x, addr, size, type, retval) ({ \
|
||||
register unsigned long __gu_val __asm__ ("l1"); \
|
||||
if (__access_ok(addr, size)) { \
|
||||
switch (size) { \
|
||||
case 1: __get_user_asm_ret(__gu_val,ub,addr,retval); break; \
|
||||
case 2: __get_user_asm_ret(__gu_val,uh,addr,retval); break; \
|
||||
case 4: __get_user_asm_ret(__gu_val,,addr,retval); break; \
|
||||
case 8: __get_user_asm_ret(__gu_val,d,addr,retval); break; \
|
||||
default: if (__get_user_bad()) return retval; \
|
||||
} x = (type) __gu_val; } else return retval; })
|
||||
case 1: \
|
||||
__get_user_asm_ret(__gu_val, ub, addr, retval); \
|
||||
break; \
|
||||
case 2: \
|
||||
__get_user_asm_ret(__gu_val, uh, addr, retval); \
|
||||
break; \
|
||||
case 4: \
|
||||
__get_user_asm_ret(__gu_val, , addr, retval); \
|
||||
break; \
|
||||
case 8: \
|
||||
__get_user_asm_ret(__gu_val, d, addr, retval); \
|
||||
break; \
|
||||
default: \
|
||||
if (__get_user_bad()) \
|
||||
return retval; \
|
||||
} \
|
||||
x = (__force type) __gu_val; \
|
||||
} else \
|
||||
return retval; \
|
||||
})
|
||||
|
||||
#define __get_user_nocheck(x, addr, size, type) ({ \
|
||||
register int __gu_ret; \
|
||||
@ -185,8 +238,14 @@ case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; \
|
||||
case 2: __get_user_asm(__gu_val, uh, addr, __gu_ret); break; \
|
||||
case 4: __get_user_asm(__gu_val, , addr, __gu_ret); break; \
|
||||
case 8: __get_user_asm(__gu_val, d, addr, __gu_ret); break; \
|
||||
default: __gu_val = 0; __gu_ret = __get_user_bad(); break; \
|
||||
} x = (type) __gu_val; __gu_ret; })
|
||||
default: \
|
||||
__gu_val = 0; \
|
||||
__gu_ret = __get_user_bad(); \
|
||||
break; \
|
||||
} \
|
||||
x = (__force type) __gu_val; \
|
||||
__gu_ret; \
|
||||
})
|
||||
|
||||
#define __get_user_nocheck_ret(x, addr, size, type, retval) ({ \
|
||||
register unsigned long __gu_val __asm__ ("l1"); \
|
||||
@ -195,8 +254,12 @@ case 1: __get_user_asm_ret(__gu_val,ub,addr,retval); break; \
|
||||
case 2: __get_user_asm_ret(__gu_val, uh, addr, retval); break; \
|
||||
case 4: __get_user_asm_ret(__gu_val, , addr, retval); break; \
|
||||
case 8: __get_user_asm_ret(__gu_val, d, addr, retval); break; \
|
||||
default: if (__get_user_bad()) return retval; \
|
||||
} x = (type) __gu_val; })
|
||||
default: \
|
||||
if (__get_user_bad()) \
|
||||
return retval; \
|
||||
} \
|
||||
x = (__force type) __gu_val; \
|
||||
})
|
||||
|
||||
#define __get_user_asm(x, size, addr, ret) \
|
||||
__asm__ __volatile__( \
|
||||
|
@ -91,12 +91,14 @@ void __retl_efault(void);
|
||||
#define put_user(x, ptr) ({ \
|
||||
unsigned long __pu_addr = (unsigned long)(ptr); \
|
||||
__chk_user_ptr(ptr); \
|
||||
__put_user_nocheck((__typeof__(*(ptr)))(x),__pu_addr,sizeof(*(ptr))); })
|
||||
__put_user_nocheck((__typeof__(*(ptr)))(x), __pu_addr, sizeof(*(ptr)));\
|
||||
})
|
||||
|
||||
#define get_user(x, ptr) ({ \
|
||||
unsigned long __gu_addr = (unsigned long)(ptr); \
|
||||
__chk_user_ptr(ptr); \
|
||||
__get_user_nocheck((x),__gu_addr,sizeof(*(ptr)),__typeof__(*(ptr))); })
|
||||
__get_user_nocheck((x), __gu_addr, sizeof(*(ptr)), __typeof__(*(ptr)));\
|
||||
})
|
||||
|
||||
#define __put_user(x, ptr) put_user(x, ptr)
|
||||
#define __get_user(x, ptr) get_user(x, ptr)
|
||||
@ -112,7 +114,9 @@ case 2: __put_user_asm(data,h,addr,__pu_ret); break; \
|
||||
case 4: __put_user_asm(data, w, addr, __pu_ret); break; \
|
||||
case 8: __put_user_asm(data, x, addr, __pu_ret); break; \
|
||||
default: __pu_ret = __put_user_bad(); break; \
|
||||
} __pu_ret; })
|
||||
} \
|
||||
__pu_ret; \
|
||||
})
|
||||
|
||||
#define __put_user_asm(x, size, addr, ret) \
|
||||
__asm__ __volatile__( \
|
||||
@ -144,8 +148,14 @@ case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; \
|
||||
case 2: __get_user_asm(__gu_val, uh, addr, __gu_ret); break; \
|
||||
case 4: __get_user_asm(__gu_val, uw, addr, __gu_ret); break; \
|
||||
case 8: __get_user_asm(__gu_val, x, addr, __gu_ret); break; \
|
||||
default: __gu_val = 0; __gu_ret = __get_user_bad(); break; \
|
||||
} data = (type) __gu_val; __gu_ret; })
|
||||
default: \
|
||||
__gu_val = 0; \
|
||||
__gu_ret = __get_user_bad(); \
|
||||
break; \
|
||||
} \
|
||||
data = (__force type) __gu_val; \
|
||||
__gu_ret; \
|
||||
})
|
||||
|
||||
#define __get_user_nocheck_ret(data, addr, size, type, retval) ({ \
|
||||
register unsigned long __gu_val __asm__ ("l1"); \
|
||||
@ -154,8 +164,12 @@ case 1: __get_user_asm_ret(__gu_val,ub,addr,retval); break; \
|
||||
case 2: __get_user_asm_ret(__gu_val, uh, addr, retval); break; \
|
||||
case 4: __get_user_asm_ret(__gu_val, uw, addr, retval); break; \
|
||||
case 8: __get_user_asm_ret(__gu_val, x, addr, retval); break; \
|
||||
default: if (__get_user_bad()) return retval; \
|
||||
} data = (type) __gu_val; })
|
||||
default: \
|
||||
if (__get_user_bad()) \
|
||||
return retval; \
|
||||
} \
|
||||
data = (__force type) __gu_val; \
|
||||
})
|
||||
|
||||
#define __get_user_asm(x, size, addr, ret) \
|
||||
__asm__ __volatile__( \
|
||||
|
@ -179,7 +179,7 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
|
||||
asm volatile("call __get_user_%P3" \
|
||||
: "=a" (__ret_gu), "=r" (__val_gu) \
|
||||
: "0" (ptr), "i" (sizeof(*(ptr)))); \
|
||||
(x) = (__typeof__(*(ptr))) __val_gu; \
|
||||
(x) = (__force __typeof__(*(ptr))) __val_gu; \
|
||||
__ret_gu; \
|
||||
})
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user