mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
32-on-64: Fix compat-access macros to use correct underlying HVM accessors.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
This commit is contained in:
1 parent
665d7a5c3d
commit
7ea5efa136
2 files changed
+34
-32
No files matched your search
@@ -12,6 +12,24 @@
|
||||
#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. */
|
||||
@@ -58,18 +72,14 @@
|
||||
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)); \
|
||||
})
|
||||
|
||||
/*
|
||||
@@ -89,34 +99,26 @@
|
||||
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__ */
|
||||
@@ -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)); \
|
||||
})
|
||||
|
||||
/*
|
||||
@@ -95,13 +95,13 @@
|
||||
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) \
|
||||
@@ -115,14 +115,14 @@
|
||||
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)); \
|
||||
})
|
||||
|
||||
|
||||
|
||||