X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=include%2Fasm-sparc%2Fuaccess.h;fp=include%2Fasm-sparc%2Fuaccess.h;h=f8f1ec1f06e6ce840dc9cc5a7edc76ad03c63ebf;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=3cf132e1aa2548c19c62cc885d063129b7ed05d2;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/include/asm-sparc/uaccess.h b/include/asm-sparc/uaccess.h index 3cf132e1a..f8f1ec1f0 100644 --- a/include/asm-sparc/uaccess.h +++ b/include/asm-sparc/uaccess.h @@ -120,6 +120,17 @@ 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_check_ret(x,addr,size,retval) ({ \ +register int __foo __asm__ ("l1"); \ +if (__access_ok(addr,size)) { \ +switch (size) { \ +case 1: __put_user_asm_ret(x,b,addr,retval,__foo); break; \ +case 2: __put_user_asm_ret(x,h,addr,retval,__foo); break; \ +case 4: __put_user_asm_ret(x,,addr,retval,__foo); break; \ +case 8: __put_user_asm_ret(x,d,addr,retval,__foo); break; \ +default: if (__put_user_bad()) return retval; break; \ +} } else return retval; }) + #define __put_user_nocheck(x,addr,size) ({ \ register int __pu_ret; \ switch (size) { \ @@ -130,6 +141,16 @@ case 8: __put_user_asm(x,d,addr,__pu_ret); break; \ default: __pu_ret = __put_user_bad(); break; \ } __pu_ret; }) +#define __put_user_nocheck_ret(x,addr,size,retval) ({ \ +register int __foo __asm__ ("l1"); \ +switch (size) { \ +case 1: __put_user_asm_ret(x,b,addr,retval,__foo); break; \ +case 2: __put_user_asm_ret(x,h,addr,retval,__foo); break; \ +case 4: __put_user_asm_ret(x,,addr,retval,__foo); break; \ +case 8: __put_user_asm_ret(x,d,addr,retval,__foo); break; \ +default: if (__put_user_bad()) return retval; break; \ +} }) + #define __put_user_asm(x,size,addr,ret) \ __asm__ __volatile__( \ "/* Put user asm, inline. */\n" \ @@ -149,6 +170,32 @@ __asm__ __volatile__( \ : "=&r" (ret) : "r" (x), "m" (*__m(addr)), \ "i" (-EFAULT)) +#define __put_user_asm_ret(x,size,addr,ret,foo) \ +if (__builtin_constant_p(ret) && ret == -EFAULT) \ +__asm__ __volatile__( \ + "/* Put user asm ret, inline. */\n" \ +"1:\t" "st"#size " %1, %2\n\n\t" \ + ".section __ex_table,#alloc\n\t" \ + ".align 4\n\t" \ + ".word 1b, __ret_efault\n\n\t" \ + ".previous\n\n\t" \ + : "=r" (foo) : "r" (x), "m" (*__m(addr))); \ +else \ +__asm__ __volatile( \ + "/* Put user asm ret, inline. */\n" \ +"1:\t" "st"#size " %1, %2\n\n\t" \ + ".section .fixup,#alloc,#execinstr\n\t" \ + ".align 4\n" \ +"3:\n\t" \ + "ret\n\t" \ + " restore %%g0, %3, %%o0\n\t" \ + ".previous\n\n\t" \ + ".section __ex_table,#alloc\n\t" \ + ".align 4\n\t" \ + ".word 1b, 3b\n\n\t" \ + ".previous\n\n\t" \ + : "=r" (foo) : "r" (x), "m" (*__m(addr)), "i" (ret)) + extern int __put_user_bad(void); #define __get_user_check(x,addr,size,type) ({ \