Jan Beulich
2008-Jan-29 10:46 UTC
[Xen-devel] [PATCH 2/3] linux/x86: avoid casting hypercall return value
.., being a little more type correct and producing better code on 64-bits. As usual, written and tested on 2.6.24 and made apply to the 2.6.18 tree without further testing. Signed-off-by: Jan Beulich <jbeulich@novell.com> Index: head-2008-01-28/include/asm-i386/mach-xen/asm/hypercall.h ==================================================================--- head-2008-01-28.orig/include/asm-i386/mach-xen/asm/hypercall.h 2008-01-29 09:53:01.000000000 +0100 +++ head-2008-01-28/include/asm-i386/mach-xen/asm/hypercall.h 2008-01-29 10:09:17.000000000 +0100 @@ -52,40 +52,43 @@ #define _hypercall0(type, name) \ ({ \ - long __res; \ + type __res; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res) \ : \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall1(type, name, a1) \ ({ \ - long __res, __ign1; \ + type __res; \ + long __ign1; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=b" (__ign1) \ : "1" ((long)(a1)) \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall2(type, name, a1, a2) \ ({ \ - long __res, __ign1, __ign2; \ + type __res; \ + long __ign1, __ign2; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=b" (__ign1), "=c" (__ign2) \ : "1" ((long)(a1)), "2" ((long)(a2)) \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall3(type, name, a1, a2, a3) \ ({ \ - long __res, __ign1, __ign2, __ign3; \ + type __res; \ + long __ign1, __ign2, __ign3; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ @@ -93,12 +96,13 @@ : "1" ((long)(a1)), "2" ((long)(a2)), \ "3" ((long)(a3)) \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall4(type, name, a1, a2, a3, a4) \ ({ \ - long __res, __ign1, __ign2, __ign3, __ign4; \ + type __res; \ + long __ign1, __ign2, __ign3, __ign4; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ @@ -106,12 +110,13 @@ : "1" ((long)(a1)), "2" ((long)(a2)), \ "3" ((long)(a3)), "4" ((long)(a4)) \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall5(type, name, a1, a2, a3, a4, a5) \ ({ \ - long __res, __ign1, __ign2, __ign3, __ign4, __ign5; \ + type __res; \ + long __ign1, __ign2, __ign3, __ign4, __ign5; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ @@ -120,7 +125,7 @@ "3" ((long)(a3)), "4" ((long)(a4)), \ "5" ((long)(a5)) \ : "memory" ); \ - (type)__res; \ + __res; \ }) static inline int __must_check Index: head-2008-01-28/include/asm-x86_64/mach-xen/asm/hypercall.h ==================================================================--- head-2008-01-28.orig/include/asm-x86_64/mach-xen/asm/hypercall.h 2008-01-29 10:03:28.000000000 +0100 +++ head-2008-01-28/include/asm-x86_64/mach-xen/asm/hypercall.h 2008-01-29 10:15:17.000000000 +0100 @@ -56,40 +56,43 @@ #define _hypercall0(type, name) \ ({ \ - long __res; \ + type __res; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res) \ : \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall1(type, name, a1) \ ({ \ - long __res, __ign1; \ + type __res; \ + long __ign1; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=D" (__ign1) \ : "1" ((long)(a1)) \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall2(type, name, a1, a2) \ ({ \ - long __res, __ign1, __ign2; \ + type __res; \ + long __ign1, __ign2; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=D" (__ign1), "=S" (__ign2) \ : "1" ((long)(a1)), "2" ((long)(a2)) \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall3(type, name, a1, a2, a3) \ ({ \ - long __res, __ign1, __ign2, __ign3; \ + type __res; \ + long __ign1, __ign2, __ign3; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=D" (__ign1), "=S" (__ign2), \ @@ -97,12 +100,13 @@ : "1" ((long)(a1)), "2" ((long)(a2)), \ "3" ((long)(a3)) \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall4(type, name, a1, a2, a3, a4) \ ({ \ - long __res, __ign1, __ign2, __ign3; \ + type __res; \ + long __ign1, __ign2, __ign3; \ register long __arg4 asm("r10") = (long)(a4); \ asm volatile ( \ HYPERCALL_STR(name) \ @@ -111,12 +115,13 @@ : "1" ((long)(a1)), "2" ((long)(a2)), \ "3" ((long)(a3)) \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall5(type, name, a1, a2, a3, a4, a5) \ ({ \ - long __res, __ign1, __ign2, __ign3; \ + type __res; \ + long __ign1, __ign2, __ign3; \ register long __arg4 asm("r10") = (long)(a4); \ register long __arg5 asm("r8") = (long)(a5); \ asm volatile ( \ @@ -126,7 +131,7 @@ : "1" ((long)(a1)), "2" ((long)(a2)), \ "3" ((long)(a3)) \ : "memory" ); \ - (type)__res; \ + __res; \ }) static inline int __must_check _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel