From: Keir Fraser Date: Fri, 13 Jun 2008 15:10:50 +0000 (+0100) Subject: 32-on-64: Fix compat-access macros to use correct underlying HVM accessors. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14192^2~65 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=7ea5efa1368151f096094ea18df6b710216e3afa;p=xen.git 32-on-64: Fix compat-access macros to use correct underlying HVM accessors. Signed-off-by: Keir Fraser --- diff --git a/xen/include/asm-x86/guest_access.h b/xen/include/asm-x86/guest_access.h index a8f111ae9b..8b6722b60c 100644 --- a/xen/include/asm-x86/guest_access.h +++ b/xen/include/asm-x86/guest_access.h @@ -12,6 +12,24 @@ #include #include +/* 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__ */ diff --git a/xen/include/xen/compat.h b/xen/include/xen/compat.h index 205f843667..a2a4d6c2dd 100644 --- a/xen/include/xen/compat.h +++ b/xen/include/xen/compat.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)); \ })