[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] uint64_aligned_t not compatible across gcc versions



>OTOH, extra checking rarely hurts and would be easy to add.

Here my take at it. This actually also replaces the patch sent under
the same subject yesterday, as I meanwhile realized there's a simpler
way to achieve the desired effect. It also converts the 64-bit store
to a 32-bit one, as only the upper 32 bits need clearing.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>

Index: 2006-08-28/xen/include/public/arch-x86_32.h
===================================================================
--- 2006-08-28.orig/xen/include/public/arch-x86_32.h    2006-08-28 
08:32:38.000000000 +0200
+++ 2006-08-28/xen/include/public/arch-x86_32.h 2006-08-29 11:15:44.000000000 
+0200
@@ -29,11 +29,11 @@
 
 /* Structural guest handles introduced in 0x00030201. */
 #if (defined(__XEN__) || defined(__XEN_TOOLS__)) && !defined(__ASSEMBLY__)
-typedef uint64_t __attribute__((aligned(8))) uint64_aligned_t;
+#define uint64_aligned_t uint64_t __attribute__((__aligned__(8)))
 #define __DEFINE_XEN_GUEST_HANDLE(name, type)                   \
     typedef struct { type *p; }                                 \
         __guest_handle_ ## name;                                \
-    typedef struct { union { type *p; uint64_aligned_t q; }; }  \
+    typedef struct { type *p __attribute__((__aligned__(8))); } \
         __guest_handle_64_ ## name
 #elif __XEN_INTERFACE_VERSION__ >= 0x00030201
 #define __DEFINE_XEN_GUEST_HANDLE(name, type) \
@@ -49,7 +49,7 @@ typedef uint64_t __attribute__((aligned(
 #ifdef __XEN_TOOLS__
 #define get_xen_guest_handle(val, hnd)  do { val = (hnd).p; } while (0)
 #define set_xen_guest_handle(hnd, val)                      \
-    do { if ( sizeof(hnd) == 8 ) *(uint64_t *)&(hnd) = 0;   \
+    do { if ( sizeof(hnd) == 8 ) (&(hnd).p)[1] = NULL;      \
          (hnd).p = val;                                     \
     } while ( 0 )
 #else
Index: 2006-08-28/xen/include/asm-x86/guest_access.h
===================================================================
--- 2006-08-28.orig/xen/include/asm-x86/guest_access.h  2006-08-07 
09:07:03.000000000 +0200
+++ 2006-08-28/xen/include/asm-x86/guest_access.h       2006-08-29 
11:52:57.000000000 +0200
@@ -17,6 +17,14 @@
 /* Offset the given guest handle into the array it refers to. */
 #define guest_handle_add_offset(hnd, nr) ((hnd).p += (nr))
 
+#if defined(__i386__)
+#define __guest_handle_okay(hnd)                \
+    (sizeof(hnd) == sizeof((hnd).p) ||          \
+     (&(hnd).p)[1] == NULL)
+#elif defined(__x86_64__)
+#define __guest_handle_okay(hnd) ((void)(hnd), 1)
+#endif
+
 /* Cast a guest handle to the specified type of handle. */
 #define guest_handle_cast(hnd, type) ({         \
     type *_x = (hnd).p;                         \
@@ -33,9 +41,11 @@
 #define copy_to_guest_offset(hnd, off, ptr, nr) ({      \
     const typeof(ptr) _x = (hnd).p;                     \
     const typeof(ptr) _y = (ptr);                       \
+    __guest_handle_okay(hnd) ?                          \
     hvm_guest(current) ?                                \
     copy_to_user_hvm(_x+(off), _y, sizeof(*_x)*(nr)) :  \
-    copy_to_user(_x+(off), _y, sizeof(*_x)*(nr));       \
+    copy_to_user(_x+(off), _y, sizeof(*_x)*(nr)) :      \
+    sizeof(*_x) * (nr);                                 \
 })
 
 /*
@@ -45,27 +55,33 @@
 #define copy_from_guest_offset(ptr, hnd, off, nr) ({    \
     const typeof(ptr) _x = (hnd).p;                     \
     const typeof(ptr) _y = (ptr);                       \
+    __guest_handle_okay(hnd) ?                          \
     hvm_guest(current) ?                                \
     copy_from_user_hvm(_y, _x+(off), sizeof(*_x)*(nr)) :\
-    copy_from_user(_y, _x+(off), sizeof(*_x)*(nr));     \
+    copy_from_user(_y, _x+(off), sizeof(*_x)*(nr)) :    \
+    sizeof(*_x) * (nr);                                 \
 })
 
 /* Copy sub-field of a structure to guest context via a guest handle. */
 #define copy_field_to_guest(hnd, ptr, field) ({         \
     const typeof(&(ptr)->field) _x = &(hnd).p->field;   \
     const typeof(&(ptr)->field) _y = &(ptr)->field;     \
+    __guest_handle_okay(hnd) ?                          \
     hvm_guest(current) ?                                \
     copy_to_user_hvm(_x, _y, sizeof(*_x)) :             \
-    copy_to_user(_x, _y, sizeof(*_x));                  \
+    copy_to_user(_x, _y, sizeof(*_x)) :                 \
+    sizeof(*_x);                                        \
 })
 
 /* Copy sub-field of a structure from guest context via a guest handle. */
 #define copy_field_from_guest(ptr, hnd, field) ({       \
     const typeof(&(ptr)->field) _x = &(hnd).p->field;   \
     const typeof(&(ptr)->field) _y = &(ptr)->field;     \
+    __guest_handle_okay(hnd) ?                          \
     hvm_guest(current) ?                                \
     copy_from_user_hvm(_y, _x, sizeof(*_x)) :           \
-    copy_from_user(_y, _x, sizeof(*_x));                \
+    copy_from_user(_y, _x, sizeof(*_x)) :               \
+    sizeof(*_x);                                        \
 })
 
 /*
@@ -73,7 +89,9 @@
  * Allows use of faster __copy_* functions.
  */
 #define guest_handle_okay(hnd, nr)                      \
-    (hvm_guest(current) || array_access_ok((hnd).p, (nr), sizeof(*(hnd).p)))
+    (__guest_handle_okay(hnd) &&                        \
+     (hvm_guest(current) ||                             \
+      array_access_ok((hnd).p, (nr), sizeof(*(hnd).p))))
 
 #define __copy_to_guest_offset(hnd, off, ptr, nr) ({    \
     const typeof(ptr) _x = (hnd).p;                     \



_______________________________________________
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®.