[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] linux/x86: avoid casting hypercall arguments to long
.., providing a little more type correctness checking and producing better code on 64-bits. This includes replacing the directly encoded moves to %r10 and %r8 on x86-64 by (extended) C-language constructs, allowing the compiler's scheduler more flexibility. As usual, written and tested on 2.6.24-rc8 and made apply to the 2.6.18 tree without further testing. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx> Index: head-2008-01-21/include/asm-i386/mach-xen/asm/hypercall.h =================================================================== --- head-2008-01-21.orig/include/asm-i386/mach-xen/asm/hypercall.h 2008-01-21 13:31:43.000000000 +0100 +++ head-2008-01-21/include/asm-i386/mach-xen/asm/hypercall.h 2008-01-21 13:31:50.000000000 +0100 @@ -67,7 +67,7 @@ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=b" (__ign1) \ - : "1" ((long)(a1)) \ + : "1" ((a1)?:0) \ : "memory" ); \ (type)__res; \ }) @@ -78,7 +78,7 @@ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=b" (__ign1), "=c" (__ign2) \ - : "1" ((long)(a1)), "2" ((long)(a2)) \ + : "1" ((a1)?:0), "2" ((a2)?:0) \ : "memory" ); \ (type)__res; \ }) @@ -89,9 +89,8 @@ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ - "=d" (__ign3) \ - : "1" ((long)(a1)), "2" ((long)(a2)), \ - "3" ((long)(a3)) \ + "=d" (__ign3) \ + : "1" ((a1)?:0), "2" ((a2)?:0), "3" ((a3)?:0) \ : "memory" ); \ (type)__res; \ }) @@ -102,9 +101,9 @@ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ - "=d" (__ign3), "=S" (__ign4) \ - : "1" ((long)(a1)), "2" ((long)(a2)), \ - "3" ((long)(a3)), "4" ((long)(a4)) \ + "=d" (__ign3), "=S" (__ign4) \ + : "1" ((a1)?:0), "2" ((a2)?:0), \ + "3" ((a3)?:0), "4" ((a4)?:0) \ : "memory" ); \ (type)__res; \ }) @@ -115,10 +114,9 @@ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=b" (__ign1), "=c" (__ign2), \ - "=d" (__ign3), "=S" (__ign4), "=D" (__ign5) \ - : "1" ((long)(a1)), "2" ((long)(a2)), \ - "3" ((long)(a3)), "4" ((long)(a4)), \ - "5" ((long)(a5)) \ + "=d" (__ign3), "=S" (__ign4), "=D" (__ign5) \ + : "1" ((a1)?:0), "2" ((a2)?:0), \ + "3" ((a3)?:0), "4" ((a4)?:0), "5" ((a5)?:0) \ : "memory" ); \ (type)__res; \ }) @@ -226,7 +224,11 @@ static inline int __must_check HYPERVISOR_update_descriptor( u64 ma, u64 desc) { - return _hypercall4(int, update_descriptor, ma, ma>>32, desc, desc>>32); + unsigned long ma_hi = (unsigned long)(ma>>32); + unsigned long ma_lo = (unsigned long)ma; + unsigned long desc_hi = (unsigned long)(desc>>32); + unsigned long desc_lo = (unsigned long)desc; + return _hypercall4(int, update_descriptor, ma_lo, ma_hi, desc_lo, desc_hi); } static inline int __must_check Index: head-2008-01-21/include/asm-x86_64/mach-xen/asm/hypercall.h =================================================================== --- head-2008-01-21.orig/include/asm-x86_64/mach-xen/asm/hypercall.h 2008-01-21 13:31:43.000000000 +0100 +++ head-2008-01-21/include/asm-x86_64/mach-xen/asm/hypercall.h 2008-01-21 13:31:50.000000000 +0100 @@ -56,77 +56,74 @@ #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, __ign1; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=D" (__ign1) \ - : "1" ((long)(a1)) \ + : "1" ((a1)?:0) \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall2(type, name, a1, a2) \ ({ \ - long __res, __ign1, __ign2; \ + type __res, __ign1, __ign2; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=D" (__ign1), "=S" (__ign2) \ - : "1" ((long)(a1)), "2" ((long)(a2)) \ + : "1" ((a1)?:0), "2" ((a2)?:0) \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall3(type, name, a1, a2, a3) \ ({ \ - long __res, __ign1, __ign2, __ign3; \ + type __res, __ign1, __ign2, __ign3; \ asm volatile ( \ HYPERCALL_STR(name) \ : "=a" (__res), "=D" (__ign1), "=S" (__ign2), \ - "=d" (__ign3) \ - : "1" ((long)(a1)), "2" ((long)(a2)), \ - "3" ((long)(a3)) \ + "=d" (__ign3) \ + : "1" ((a1)?:0), "2" ((a2)?:0), "3" ((a3)?:0) \ : "memory" ); \ - (type)__res; \ + __res; \ }) #define _hypercall4(type, name, a1, a2, a3, a4) \ ({ \ - long __res, __ign1, __ign2, __ign3; \ + type __res, __ign1, __ign2, __ign3; \ + register typeof((a4)?:0) __arg4 asm("r10") = (a4); \ asm volatile ( \ - "movq %7,%%r10; " \ HYPERCALL_STR(name) \ : "=a" (__res), "=D" (__ign1), "=S" (__ign2), \ - "=d" (__ign3) \ - : "1" ((long)(a1)), "2" ((long)(a2)), \ - "3" ((long)(a3)), "g" ((long)(a4)) \ - : "memory", "r10" ); \ - (type)__res; \ + "=d" (__ign3), "+r" (__arg4) \ + : "1" ((a1)?:0), "2" ((a2)?:0), "3" ((a3)?:0) \ + : "memory" ); \ + __res; \ }) #define _hypercall5(type, name, a1, a2, a3, a4, a5) \ ({ \ - long __res, __ign1, __ign2, __ign3; \ + type __res, __ign1, __ign2, __ign3; \ + register typeof((a4)?:0) __arg4 asm("r10") = (a4); \ + register typeof((a5)?:0) __arg5 asm("r8") = (a5); \ asm volatile ( \ - "movq %7,%%r10; movq %8,%%r8; " \ HYPERCALL_STR(name) \ : "=a" (__res), "=D" (__ign1), "=S" (__ign2), \ - "=d" (__ign3) \ - : "1" ((long)(a1)), "2" ((long)(a2)), \ - "3" ((long)(a3)), "g" ((long)(a4)), \ - "g" ((long)(a5)) \ - : "memory", "r10", "r8" ); \ - (type)__res; \ + "=d" (__ign3), "+r" (__arg4), "+r" (__arg5) \ + : "1" ((a1)?:0), "2" ((a2)?:0), "3" ((a3)?:0) \ + : "memory" ); \ + __res; \ }) static inline int __must_check _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |