Message ID | 1420558883-10131-27-git-send-email-mst@redhat.com |
---|---|
State | Not Applicable |
Delegated to: | David Miller |
Headers | show |
On Tue, Jan 06, 2015 at 05:44:56PM +0200, Michael S. Tsirkin wrote: > Macros within arch/sparc/include/asm/uaccess_64.h are made harder to > read because they violate a bunch of coding style rules. > > Fix it up. As per Davem's earlier mail please prefix using sparc32/sparc64. > -#define __put_user_nocheck(data,addr,size) ({ \ > -register int __pu_ret; \ > -switch (size) { \ > -case 1: __put_user_asm(data,b,addr,__pu_ret); break; \ > -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; }) > - > -#define __put_user_asm(x,size,addr,ret) \ > +#define __put_user_nocheck(data, addr, size) ({ \ > + register int __pu_ret; \ > + switch (size) { \ > + case 1: \ > + __put_user_asm(data, b, addr, __pu_ret); \ > + break; \ > + 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; \ > +}) No matter what coding style says - the above is much less readable than the original version. > -#define __get_user_nocheck(data,addr,size,type) ({ \ > -register int __gu_ret; \ > -register unsigned long __gu_val; \ > -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,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 = (__force type) __gu_val; __gu_ret; }) > - > -#define __get_user_nocheck_ret(data,addr,size,type,retval) ({ \ > -register unsigned long __gu_val __asm__ ("l1"); \ > -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,uw,addr,retval); break; \ > -case 8: __get_user_asm_ret(__gu_val,x,addr,retval); break; \ > -default: if (__get_user_bad()) return retval; \ > -} data = (__force type) __gu_val; }) > - > -#define __get_user_asm(x,size,addr,ret) \ > +#define __get_user_nocheck(data, addr, size, type) ({ \ > + register int __gu_ret; \ > + register unsigned long __gu_val; \ > + 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, 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 = (__force type) __gu_val; __gu_ret; \ > +}) > + > +#define __get_user_nocheck_ret(data, addr, size, type, retval) ({ \ > + register unsigned long __gu_val __asm__ ("l1"); \ > + 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, uw, addr, retval); \ > + break; \ > + case 8: \ > + __get_user_asm_ret(__gu_val, x, addr, retval); \ > + break; \ > + default: \ > + if (__get_user_bad()) \ > + return retval; \ > + } \ > + data = (__force type) __gu_val; \ > +}) > + Same comment for this code chunk. Sam -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Jan 06, 2015 at 05:53:39PM +0100, Sam Ravnborg wrote: > On Tue, Jan 06, 2015 at 05:44:56PM +0200, Michael S. Tsirkin wrote: > > Macros within arch/sparc/include/asm/uaccess_64.h are made harder to > > read because they violate a bunch of coding style rules. > > > > Fix it up. > As per Davem's earlier mail please prefix using sparc32/sparc64. I did put in uaccess_64 - insufficient? > > -#define __put_user_nocheck(data,addr,size) ({ \ > > -register int __pu_ret; \ > > -switch (size) { \ > > -case 1: __put_user_asm(data,b,addr,__pu_ret); break; \ > > -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; }) > > - > > -#define __put_user_asm(x,size,addr,ret) \ > > +#define __put_user_nocheck(data, addr, size) ({ \ > > + register int __pu_ret; \ > > + switch (size) { \ > > + case 1: \ > > + __put_user_asm(data, b, addr, __pu_ret); \ > > + break; \ > > + 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; \ > > +}) > > No matter what coding style says - the above is much less readable than the > original version. > > I guess you approve the rest of the changes then? I get it you like it that case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; has the whole case on the same line? Is that the issue? > > > -#define __get_user_nocheck(data,addr,size,type) ({ \ > > -register int __gu_ret; \ > > -register unsigned long __gu_val; \ > > -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,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 = (__force type) __gu_val; __gu_ret; }) > > - > > -#define __get_user_nocheck_ret(data,addr,size,type,retval) ({ \ > > -register unsigned long __gu_val __asm__ ("l1"); \ > > -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,uw,addr,retval); break; \ > > -case 8: __get_user_asm_ret(__gu_val,x,addr,retval); break; \ > > -default: if (__get_user_bad()) return retval; \ > > -} data = (__force type) __gu_val; }) > > - > > -#define __get_user_asm(x,size,addr,ret) \ > > +#define __get_user_nocheck(data, addr, size, type) ({ \ > > + register int __gu_ret; \ > > + register unsigned long __gu_val; \ > > + 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, 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 = (__force type) __gu_val; __gu_ret; \ > > +}) > > + > > +#define __get_user_nocheck_ret(data, addr, size, type, retval) ({ \ > > + register unsigned long __gu_val __asm__ ("l1"); \ > > + 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, uw, addr, retval); \ > > + break; \ > > + case 8: \ > > + __get_user_asm_ret(__gu_val, x, addr, retval); \ > > + break; \ > > + default: \ > > + if (__get_user_bad()) \ > > + return retval; \ > > + } \ > > + data = (__force type) __gu_val; \ > > +}) > > + > > Same comment for this code chunk. > > Sam Well I donnu. When I had to fix bugs there, it was pretty confusing to me, conding style is no a holy book but it's there for a reason. Lack of spaces after comma makes it so much harder to count parameters. Also: > > -default: if (__get_user_bad()) return retval; \ > > -} data = (__force type) __gu_val; }) return on same line with if and code after the closing {} makes it look confusingly like the more conventional: if (__get_user_bad()) data = (__force type) __gu_val;
From: "Michael S. Tsirkin" <mst@redhat.com> Date: Tue, 6 Jan 2015 17:44:56 +0200 > Macros within arch/sparc/include/asm/uaccess_64.h are made harder to > read because they violate a bunch of coding style rules. > > Fix it up. > > Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Acked-by: David S. Miller <davem@davemloft.net> -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Jan 06, 2015 at 07:19:02PM +0200, Michael S. Tsirkin wrote: > On Tue, Jan 06, 2015 at 05:53:39PM +0100, Sam Ravnborg wrote: > > On Tue, Jan 06, 2015 at 05:44:56PM +0200, Michael S. Tsirkin wrote: > > > Macros within arch/sparc/include/asm/uaccess_64.h are made harder to > > > read because they violate a bunch of coding style rules. > > > > > > Fix it up. > > As per Davem's earlier mail please prefix using sparc32/sparc64. > > I did put in uaccess_64 - insufficient? sparc32: bla bla For sparc32 specific changes. sparc64: bla bla For sparc64 specific changes sparc: bla bla For general sparce changes In this case you could have used: sparc64: fix coding style in uaccess_64.h > > > > -#define __put_user_nocheck(data,addr,size) ({ \ > > > -register int __pu_ret; \ > > > -switch (size) { \ > > > -case 1: __put_user_asm(data,b,addr,__pu_ret); break; \ > > > -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; }) > > > - > > > -#define __put_user_asm(x,size,addr,ret) \ > > > +#define __put_user_nocheck(data, addr, size) ({ \ > > > + register int __pu_ret; \ > > > + switch (size) { \ > > > + case 1: \ > > > + __put_user_asm(data, b, addr, __pu_ret); \ > > > + break; \ > > > + 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; \ > > > +}) > > > > No matter what coding style says - the above is much less readable than the > > original version. > > > > > I guess you approve the rest of the changes then? I did not look to carefully - but what I saw looked good. > > > I get it you like it that > case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; > has the whole case on the same line? > Is that the issue? Exactly - much easier to read this way. That the "\" was not aligned in these parts of the code did not help either. Sam -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Jan 06, 2015 at 07:27:49PM +0100, Sam Ravnborg wrote: > On Tue, Jan 06, 2015 at 07:19:02PM +0200, Michael S. Tsirkin wrote: > > On Tue, Jan 06, 2015 at 05:53:39PM +0100, Sam Ravnborg wrote: > > > On Tue, Jan 06, 2015 at 05:44:56PM +0200, Michael S. Tsirkin wrote: > > > > Macros within arch/sparc/include/asm/uaccess_64.h are made harder to > > > > read because they violate a bunch of coding style rules. > > > > > > > > Fix it up. > > > As per Davem's earlier mail please prefix using sparc32/sparc64. > > > > I did put in uaccess_64 - insufficient? > sparc32: bla bla > For sparc32 specific changes. > > sparc64: bla bla > For sparc64 specific changes > > sparc: bla bla > For general sparce changes > > > In this case you could have used: > sparc64: fix coding style in uaccess_64.h OK. I see David reviewed and sent acks, so I won't bother reposting, but I'll tweak this in my tree. > > > > > > -#define __put_user_nocheck(data,addr,size) ({ \ > > > > -register int __pu_ret; \ > > > > -switch (size) { \ > > > > -case 1: __put_user_asm(data,b,addr,__pu_ret); break; \ > > > > -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; }) > > > > - > > > > -#define __put_user_asm(x,size,addr,ret) \ > > > > +#define __put_user_nocheck(data, addr, size) ({ \ > > > > + register int __pu_ret; \ > > > > + switch (size) { \ > > > > + case 1: \ > > > > + __put_user_asm(data, b, addr, __pu_ret); \ > > > > + break; \ > > > > + 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; \ > > > > +}) > > > > > > No matter what coding style says - the above is much less readable than the > > > original version. > > > > > > > > I guess you approve the rest of the changes then? > I did not look to carefully - but what I saw looked good. > > > > > > > I get it you like it that > > case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; > > has the whole case on the same line? > > Is that the issue? > Exactly - much easier to read this way. > That the "\" was not aligned in these parts of the code did not help either. > > Sam I see David acked this already - I'll do a patch on top to tweak just these two places to your liking? No sense making everyone re-read the whole pile of changes.
> > sparc64: fix coding style in uaccess_64.h > > OK. > I see David reviewed and sent acks, so I won't bother > reposting, but I'll tweak this in my tree. OK. > > > I get it you like it that > > > case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; > > > has the whole case on the same line? > > > Is that the issue? > > Exactly - much easier to read this way. > > That the "\" was not aligned in these parts of the code did not help either. > > > > Sam > > I see David acked this already - I'll do a patch on top to tweak just > these two places to your liking? Thanks. When you have done so please wait for David's ack before you sent then upstream. That I like it does not make it universally accepted. Sam -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Jan 06, 2015 at 09:46:07PM +0100, Sam Ravnborg wrote: > > > sparc64: fix coding style in uaccess_64.h > > > > OK. > > I see David reviewed and sent acks, so I won't bother > > reposting, but I'll tweak this in my tree. > OK. > > > > > I get it you like it that > > > > case 1: __get_user_asm(__gu_val,ub,addr,__gu_ret); break; > > > > has the whole case on the same line? > > > > Is that the issue? > > > Exactly - much easier to read this way. > > > That the "\" was not aligned in these parts of the code did not help either. > > > > > > Sam > > > > I see David acked this already - I'll do a patch on top to tweak just > > these two places to your liking? > > Thanks. OK, sent. Mind sending acks for these and the original patches? You can add that your ack is conditional on applying the tweak on top. > When you have done so please wait for David's ack before you > sent then upstream. That I like it does not make it universally accepted. > > Sam Sure. Thanks. -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h index b80866d..45d84b1 100644 --- a/arch/sparc/include/asm/uaccess_64.h +++ b/arch/sparc/include/asm/uaccess_64.h @@ -41,11 +41,11 @@ #define get_fs() ((mm_segment_t){(current_thread_info()->current_ds)}) #define get_ds() (KERNEL_DS) -#define segment_eq(a,b) ((a).seg == (b).seg) +#define segment_eq(a, b) ((a).seg == (b).seg) #define set_fs(val) \ do { \ - current_thread_info()->current_ds =(val).seg; \ + current_thread_info()->current_ds = (val).seg; \ __asm__ __volatile__ ("wr %%g0, %0, %%asi" : : "r" ((val).seg)); \ } while(0) @@ -88,121 +88,159 @@ void __retl_efault(void); * of a performance impact. Thus we have a few rather ugly macros here, * and hide all the ugliness from the user. */ -#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 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 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) -#define __get_user(x,ptr) get_user(x,ptr) +#define __put_user(x, ptr) put_user(x, ptr) +#define __get_user(x, ptr) get_user(x, ptr) struct __large_struct { unsigned long buf[100]; }; #define __m(x) ((struct __large_struct *)(x)) -#define __put_user_nocheck(data,addr,size) ({ \ -register int __pu_ret; \ -switch (size) { \ -case 1: __put_user_asm(data,b,addr,__pu_ret); break; \ -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; }) - -#define __put_user_asm(x,size,addr,ret) \ +#define __put_user_nocheck(data, addr, size) ({ \ + register int __pu_ret; \ + switch (size) { \ + case 1: \ + __put_user_asm(data, b, addr, __pu_ret); \ + break; \ + 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; \ +}) + +#define __put_user_asm(x, size, addr, ret) \ __asm__ __volatile__( \ - "/* Put user asm, inline. */\n" \ -"1:\t" "st"#size "a %1, [%2] %%asi\n\t" \ - "clr %0\n" \ -"2:\n\n\t" \ - ".section .fixup,#alloc,#execinstr\n\t" \ - ".align 4\n" \ -"3:\n\t" \ - "sethi %%hi(2b), %0\n\t" \ - "jmpl %0 + %%lo(2b), %%g0\n\t" \ - " mov %3, %0\n\n\t" \ - ".previous\n\t" \ - ".section __ex_table,\"a\"\n\t" \ - ".align 4\n\t" \ - ".word 1b, 3b\n\t" \ - ".previous\n\n\t" \ - : "=r" (ret) : "r" (x), "r" (__m(addr)), \ - "i" (-EFAULT)) + "/* Put user asm, inline. */\n" \ + "1:\t" "st"#size "a %1, [%2] %%asi\n\t" \ + "clr %0\n" \ + "2:\n\n\t" \ + ".section .fixup,#alloc,#execinstr\n\t" \ + ".align 4\n" \ + "3:\n\t" \ + "sethi %%hi(2b), %0\n\t" \ + "jmpl %0 + %%lo(2b), %%g0\n\t" \ + " mov %3, %0\n\n\t" \ + ".previous\n\t" \ + ".section __ex_table,\"a\"\n\t" \ + ".align 4\n\t" \ + ".word 1b, 3b\n\t" \ + ".previous\n\n\t" \ + : "=r" (ret) : "r" (x), "r" (__m(addr)), \ + "i" (-EFAULT)) int __put_user_bad(void); -#define __get_user_nocheck(data,addr,size,type) ({ \ -register int __gu_ret; \ -register unsigned long __gu_val; \ -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,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 = (__force type) __gu_val; __gu_ret; }) - -#define __get_user_nocheck_ret(data,addr,size,type,retval) ({ \ -register unsigned long __gu_val __asm__ ("l1"); \ -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,uw,addr,retval); break; \ -case 8: __get_user_asm_ret(__gu_val,x,addr,retval); break; \ -default: if (__get_user_bad()) return retval; \ -} data = (__force type) __gu_val; }) - -#define __get_user_asm(x,size,addr,ret) \ +#define __get_user_nocheck(data, addr, size, type) ({ \ + register int __gu_ret; \ + register unsigned long __gu_val; \ + 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, 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 = (__force type) __gu_val; __gu_ret; \ +}) + +#define __get_user_nocheck_ret(data, addr, size, type, retval) ({ \ + register unsigned long __gu_val __asm__ ("l1"); \ + 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, uw, addr, retval); \ + break; \ + case 8: \ + __get_user_asm_ret(__gu_val, x, addr, retval); \ + break; \ + default: \ + if (__get_user_bad()) \ + return retval; \ + } \ + data = (__force type) __gu_val; \ +}) + +#define __get_user_asm(x, size, addr, ret) \ __asm__ __volatile__( \ - "/* Get user asm, inline. */\n" \ -"1:\t" "ld"#size "a [%2] %%asi, %1\n\t" \ - "clr %0\n" \ -"2:\n\n\t" \ - ".section .fixup,#alloc,#execinstr\n\t" \ - ".align 4\n" \ -"3:\n\t" \ - "sethi %%hi(2b), %0\n\t" \ - "clr %1\n\t" \ - "jmpl %0 + %%lo(2b), %%g0\n\t" \ - " mov %3, %0\n\n\t" \ - ".previous\n\t" \ - ".section __ex_table,\"a\"\n\t" \ - ".align 4\n\t" \ - ".word 1b, 3b\n\n\t" \ - ".previous\n\t" \ - : "=r" (ret), "=r" (x) : "r" (__m(addr)), \ - "i" (-EFAULT)) - -#define __get_user_asm_ret(x,size,addr,retval) \ + "/* Get user asm, inline. */\n" \ + "1:\t" "ld"#size "a [%2] %%asi, %1\n\t" \ + "clr %0\n" \ + "2:\n\n\t" \ + ".section .fixup,#alloc,#execinstr\n\t" \ + ".align 4\n" \ + "3:\n\t" \ + "sethi %%hi(2b), %0\n\t" \ + "clr %1\n\t" \ + "jmpl %0 + %%lo(2b), %%g0\n\t" \ + " mov %3, %0\n\n\t" \ + ".previous\n\t" \ + ".section __ex_table,\"a\"\n\t" \ + ".align 4\n\t" \ + ".word 1b, 3b\n\n\t" \ + ".previous\n\t" \ + : "=r" (ret), "=r" (x) : "r" (__m(addr)), \ + "i" (-EFAULT)) + +#define __get_user_asm_ret(x, size, addr, retval) \ if (__builtin_constant_p(retval) && retval == -EFAULT) \ -__asm__ __volatile__( \ - "/* Get user asm ret, inline. */\n" \ -"1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \ - ".section __ex_table,\"a\"\n\t" \ - ".align 4\n\t" \ - ".word 1b,__ret_efault\n\n\t" \ - ".previous\n\t" \ - : "=r" (x) : "r" (__m(addr))); \ + __asm__ __volatile__( \ + "/* Get user asm ret, inline. */\n" \ + "1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \ + ".section __ex_table,\"a\"\n\t" \ + ".align 4\n\t" \ + ".word 1b,__ret_efault\n\n\t" \ + ".previous\n\t" \ + : "=r" (x) : "r" (__m(addr))); \ else \ -__asm__ __volatile__( \ - "/* Get user asm ret, inline. */\n" \ -"1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \ - ".section .fixup,#alloc,#execinstr\n\t" \ - ".align 4\n" \ -"3:\n\t" \ - "ret\n\t" \ - " restore %%g0, %2, %%o0\n\n\t" \ - ".previous\n\t" \ - ".section __ex_table,\"a\"\n\t" \ - ".align 4\n\t" \ - ".word 1b, 3b\n\n\t" \ - ".previous\n\t" \ - : "=r" (x) : "r" (__m(addr)), "i" (retval)) + __asm__ __volatile__( \ + "/* Get user asm ret, inline. */\n" \ + "1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \ + ".section .fixup,#alloc,#execinstr\n\t" \ + ".align 4\n" \ + "3:\n\t" \ + "ret\n\t" \ + " restore %%g0, %2, %%o0\n\n\t" \ + ".previous\n\t" \ + ".section __ex_table,\"a\"\n\t" \ + ".align 4\n\t" \ + ".word 1b, 3b\n\n\t" \ + ".previous\n\t" \ + : "=r" (x) : "r" (__m(addr)), "i" (retval)) int __get_user_bad(void);
Macros within arch/sparc/include/asm/uaccess_64.h are made harder to read because they violate a bunch of coding style rules. Fix it up. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> --- arch/sparc/include/asm/uaccess_64.h | 246 +++++++++++++++++++++--------------- 1 file changed, 142 insertions(+), 104 deletions(-)