32-on-64: Fix compat-access macros to use correct underlying HVM accessors.
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 13 Jun 2008 15:10:50 +0000 (16:10 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 13 Jun 2008 15:10:50 +0000 (16:10 +0100)
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/include/asm-x86/guest_access.h
xen/include/xen/compat.h

index a8f111ae9b8c8c90af316f083a3454d113e727ee..8b6722b60c8a58ae8eaaec8bb5d0008494c7fdff 100644 (file)
 #include <asm/hvm/support.h>
 #include <asm/hvm/guest_access.h>
 
+/* Raw access functions: no type checking. */
+#define raw_copy_to_guest(dst, src, len)        \
+    (is_hvm_vcpu(current) ?                     \
+     copy_to_user_hvm((dst), (src), (len)) :    \
+     copy_to_user((dst), (src), (len)))
+#define raw_copy_from_guest(dst, src, len)      \
+    (is_hvm_vcpu(current) ?                     \
+     copy_from_user_hvm((dst), (src), (len)) :  \
+     copy_from_user((dst), (src), (len)))
+#define __raw_copy_to_guest(dst, src, len)      \
+    (is_hvm_vcpu(current) ?                     \
+     copy_to_user_hvm((dst), (src), (len)) :    \
+     __copy_to_user((dst), (src), (len)))
+#define __raw_copy_from_guest(dst, src, len)    \
+    (is_hvm_vcpu(current) ?                     \
+     copy_from_user_hvm((dst), (src), (len)) :  \
+     __copy_from_user((dst), (src), (len)))
+
 /* Is the guest handle a NULL reference? */
 #define guest_handle_is_null(hnd)        ((hnd).p == NULL)
 
@@ -36,9 +54,7 @@
     const typeof(*(ptr)) *_s = (ptr);                   \
     char (*_d)[sizeof(*_s)] = (void *)(hnd).p;          \
     ((void)((hnd).p == (ptr)));                         \
-    is_hvm_vcpu(current) ?                              \
-    copy_to_user_hvm(_d+(off), _s, sizeof(*_s)*(nr)) :  \
-    copy_to_user(_d+(off), _s, sizeof(*_s)*(nr));       \
+    raw_copy_to_guest(_d+(off), _s, sizeof(*_s)*(nr));  \
 })
 
 /*
@@ -48,9 +64,7 @@
 #define copy_from_guest_offset(ptr, hnd, off, nr) ({    \
     const typeof(*(ptr)) *_s = (hnd).p;                 \
     typeof(*(ptr)) *_d = (ptr);                         \
-    is_hvm_vcpu(current) ?                              \
-    copy_from_user_hvm(_d, _s+(off), sizeof(*_d)*(nr)) :\
-    copy_from_user(_d, _s+(off), sizeof(*_d)*(nr));     \
+    raw_copy_from_guest(_d, _s+(off), sizeof(*_d)*(nr));\
 })
 
 /* Copy sub-field of a structure to guest context via a guest handle. */
     const typeof(&(ptr)->field) _s = &(ptr)->field;     \
     void *_d = &(hnd).p->field;                         \
     ((void)(&(hnd).p->field == &(ptr)->field));         \
-    is_hvm_vcpu(current) ?                              \
-    copy_to_user_hvm(_d, _s, sizeof(*_s)) :             \
-    copy_to_user(_d, _s, sizeof(*_s));                  \
+    raw_copy_to_guest(_d, _s, sizeof(*_s));             \
 })
 
 /* 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) _s = &(hnd).p->field;   \
     typeof(&(ptr)->field) _d = &(ptr)->field;           \
-    is_hvm_vcpu(current) ?                              \
-    copy_from_user_hvm(_d, _s, sizeof(*_d)) :           \
-    copy_from_user(_d, _s, sizeof(*_d));                \
+    raw_copy_from_guest(_d, _s, sizeof(*_d));           \
 })
 
 /*
     const typeof(*(ptr)) *_s = (ptr);                   \
     char (*_d)[sizeof(*_s)] = (void *)(hnd).p;          \
     ((void)((hnd).p == (ptr)));                         \
-    is_hvm_vcpu(current) ?                              \
-    copy_to_user_hvm(_d+(off), _s, sizeof(*_s)*(nr)) :  \
-    __copy_to_user(_d+(off), _s, sizeof(*_s)*(nr));     \
+    __raw_copy_to_guest(_d+(off), _s, sizeof(*_s)*(nr));\
 })
 
 #define __copy_from_guest_offset(ptr, hnd, off, nr) ({  \
     const typeof(*(ptr)) *_s = (hnd).p;                 \
     typeof(*(ptr)) *_d = (ptr);                         \
-    is_hvm_vcpu(current) ?                              \
-    copy_from_user_hvm(_d, _s+(off), sizeof(*_d)*(nr)) :\
-    __copy_from_user(_d, _s+(off), sizeof(*_d)*(nr));   \
+    __raw_copy_from_guest(_d, _s+(off), sizeof(*_d)*(nr));\
 })
 
 #define __copy_field_to_guest(hnd, ptr, field) ({       \
     const typeof(&(ptr)->field) _s = &(ptr)->field;     \
     void *_d = &(hnd).p->field;                         \
     ((void)(&(hnd).p->field == &(ptr)->field));         \
-    is_hvm_vcpu(current) ?                              \
-    copy_to_user_hvm(_d, _s, sizeof(*_s)) :             \
-    __copy_to_user(_d, _s, sizeof(*_s));                \
+    __raw_copy_to_guest(_d, _s, sizeof(*_s));           \
 })
 
 #define __copy_field_from_guest(ptr, hnd, field) ({     \
     const typeof(&(ptr)->field) _s = &(hnd).p->field;   \
     typeof(&(ptr)->field) _d = &(ptr)->field;           \
-    is_hvm_vcpu(current) ?                              \
-    copy_from_user_hvm(_d, _s, sizeof(*_d)) :           \
-    __copy_from_user(_d, _s, sizeof(*_d));              \
+    __raw_copy_from_guest(_d, _s, sizeof(*_d));         \
 })
 
 #endif /* __ASM_X86_GUEST_ACCESS_H__ */
index 205f8436677a6a6ce5c52bc7e69357179ac5e437..a2a4d6c2dd95a714048775667f39bbd4d1e8da63 100644 (file)
@@ -47,7 +47,7 @@
     const typeof(*(ptr)) *_s = (ptr);                                \
     char (*_d)[sizeof(*_s)] = (void *)(full_ptr_t)(hnd).c;           \
     ((void)((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c == (ptr)));     \
-    copy_to_user(_d + (off), _s, sizeof(*_s) * (nr));                \
+    raw_copy_to_guest(_d + (off), _s, sizeof(*_s) * (nr));           \
 })
 
 /*
@@ -57,7 +57,7 @@
 #define copy_from_compat_offset(ptr, hnd, off, nr) ({                \
     const typeof(*(ptr)) *_s = (typeof(**(hnd)._) *)(full_ptr_t)(hnd).c; \
     typeof(*(ptr)) *_d = (ptr);                                      \
-    copy_from_user(_d, _s + (off), sizeof(*_d) * (nr));              \
+    raw_copy_from_guest(_d, _s + (off), sizeof(*_d) * (nr));         \
 })
 
 #define copy_to_compat(hnd, ptr, nr)                                 \
@@ -72,7 +72,7 @@
     void *_d = &((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field;   \
     ((void)(&((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field ==    \
             &(ptr)->field));                                         \
-    copy_to_user(_d, _s, sizeof(*_s));                               \
+    raw_copy_to_guest(_d, _s, sizeof(*_s));                          \
 })
 
 /* Copy sub-field of a structure from guest context via a compat handle. */
@@ -80,7 +80,7 @@
     const typeof(&(ptr)->field) _s =                                 \
         &((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field;          \
     typeof(&(ptr)->field) _d = &(ptr)->field;                        \
-    copy_from_user(_d, _s, sizeof(*_d));                             \
+    raw_copy_from_guest(_d, _s, sizeof(*_d));                        \
 })
 
 /*
     const typeof(*(ptr)) *_s = (ptr);                                \
     char (*_d)[sizeof(*_s)] = (void *)(full_ptr_t)(hnd).c;           \
     ((void)((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c == (ptr)));     \
-    __copy_to_user(_d + (off), _s, sizeof(*_s) * (nr));              \
+    __raw_copy_to_guest(_d + (off), _s, sizeof(*_s) * (nr));         \
 })
 
 #define __copy_from_compat_offset(ptr, hnd, off, nr) ({              \
     const typeof(*(ptr)) *_s = (typeof(**(hnd)._) *)(full_ptr_t)(hnd).c; \
     typeof(*(ptr)) *_d = (ptr);                                      \
-    __copy_from_user(_d, _s + (off), sizeof(*_d) * (nr));            \
+    __raw_copy_from_guest(_d, _s + (off), sizeof(*_d) * (nr));       \
 })
 
 #define __copy_to_compat(hnd, ptr, nr)                               \
     void *_d = &((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field;   \
     ((void)(&((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field ==    \
             &(ptr)->field));                                         \
-    __copy_to_user(_d, _s, sizeof(*_s));                             \
+    __raw_copy_to_guest(_d, _s, sizeof(*_s));                        \
 })
 
 #define __copy_field_from_compat(ptr, hnd, field) ({                 \
     const typeof(&(ptr)->field) _s =                                 \
         &((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field;          \
     typeof(&(ptr)->field) _d = &(ptr)->field;                        \
-    __copy_from_user(_d, _s, sizeof(*_d));                           \
+    __raw_copy_from_guest(_d, _s, sizeof(*_d));                      \
 })