[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.