X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Fasm-sparc64%2Fuaccess.h;h=1aff19cd0ecf777cca4d32af611fd93c79c36ce9;hb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;hp=0626d20c2d10eb0a03f1eb2fe4380b4195e2d514;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/include/asm-sparc64/uaccess.h b/include/asm-sparc64/uaccess.h index 0626d20c2..1aff19cd0 100644 --- a/include/asm-sparc64/uaccess.h +++ b/include/asm-sparc64/uaccess.h @@ -14,6 +14,7 @@ #include #include #include +#include #endif #ifndef __ASSEMBLY__ @@ -101,10 +102,12 @@ extern void __ret_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))); }) #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))); }) #define __put_user(x,ptr) put_user(x,ptr) @@ -163,7 +166,7 @@ __asm__ __volatile__( \ ".previous\n\n\t" \ : "=r" (foo) : "r" (x), "r" (__m(addr))); \ else \ -__asm__ __volatile( \ +__asm__ __volatile__( \ "/* Put user asm ret, inline. */\n" \ "1:\t" "st"#size "a %1, [%2] %%asi\n\n\t" \ ".section .fixup,#alloc,#execinstr\n\t" \ @@ -250,25 +253,57 @@ __asm__ __volatile__( \ extern int __get_user_bad(void); -extern unsigned long __copy_from_user(void *to, const void __user *from, - unsigned long size); +extern unsigned long ___copy_from_user(void *to, const void __user *from, + unsigned long size); +extern unsigned long copy_from_user_fixup(void *to, const void __user *from, + unsigned long size); +static inline unsigned long copy_from_user(void *to, const void __user *from, + unsigned long size) +{ + unsigned long ret = ___copy_from_user(to, from, size); -extern unsigned long __copy_to_user(void __user *to, const void *from, - unsigned long size); + if (ret) + ret = copy_from_user_fixup(to, from, size); + return ret; +} +#define __copy_from_user copy_from_user + +extern unsigned long ___copy_to_user(void __user *to, const void *from, + unsigned long size); +extern unsigned long copy_to_user_fixup(void __user *to, const void *from, + unsigned long size); +static inline unsigned long copy_to_user(void __user *to, const void *from, + unsigned long size) +{ + unsigned long ret = ___copy_to_user(to, from, size); -extern unsigned long __copy_in_user(void __user *to, const void __user *from, - unsigned long size); + if (ret) + ret = copy_to_user_fixup(to, from, size); + return ret; +} +#define __copy_to_user copy_to_user + +extern unsigned long ___copy_in_user(void __user *to, const void __user *from, + unsigned long size); +extern unsigned long copy_in_user_fixup(void __user *to, void __user *from, + unsigned long size); +static inline unsigned long copy_in_user(void __user *to, void __user *from, + unsigned long size) +{ + unsigned long ret = ___copy_in_user(to, from, size); -#define copy_from_user __copy_from_user -#define copy_to_user __copy_to_user -#define copy_in_user __copy_in_user + if (ret) + ret = copy_in_user_fixup(to, from, size); + return ret; +} +#define __copy_in_user copy_in_user -extern unsigned long __bzero_noasi(void *, unsigned long); +extern unsigned long __bzero_noasi(void __user *, unsigned long); static inline unsigned long __clear_user(void __user *addr, unsigned long size) { - return __bzero_noasi((void *) addr, size); + return __bzero_noasi(addr, size); } #define clear_user __clear_user @@ -282,6 +317,8 @@ extern long __strnlen_user(const char __user *, long len); #define strlen_user __strlen_user #define strnlen_user __strnlen_user +#define __copy_to_user_inatomic __copy_to_user +#define __copy_from_user_inatomic __copy_from_user #endif /* __ASSEMBLY__ */