[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 07/25] xen (ARM, x86): add errno-returning functions for copy
Applied to both x86 and ARM headers. Signed-off-by: Christopher Clark <christopher.clark6@xxxxxxxxxxxxxx> --- xen/include/asm-arm/guest_access.h | 25 +++++++++++++++++++++++++ xen/include/asm-x86/guest_access.h | 29 +++++++++++++++++++++++++++++ xen/include/xen/guest_access.h | 3 +++ 3 files changed, 57 insertions(+) diff --git a/xen/include/asm-arm/guest_access.h b/xen/include/asm-arm/guest_access.h index 224d2a0..7b6f89c 100644 --- a/xen/include/asm-arm/guest_access.h +++ b/xen/include/asm-arm/guest_access.h @@ -24,6 +24,11 @@ int access_guest_memory_by_ipa(struct domain *d, paddr_t ipa, void *buf, #define __raw_copy_from_guest raw_copy_from_guest #define __raw_clear_guest raw_clear_guest +#define raw_copy_from_guest_errno(dst, src, len) \ + (raw_copy_from_guest((dst), (src), (len)) ? -EFAULT : 0) +#define raw_copy_to_guest_errno(dst, src, len) \ + (raw_copy_to_guest((dst), (src), (len)) ? -EFAULT : 0) + /* Remainder copied from x86 -- could be common? */ /* Is the guest handle a NULL reference? */ @@ -113,6 +118,26 @@ int access_guest_memory_by_ipa(struct domain *d, paddr_t ipa, void *buf, raw_copy_from_guest(_d, _s, sizeof(*_d)); \ }) +/* errno returning copy functions */ +#define copy_from_guest_offset_errno(ptr, hnd, off, nr) ({ \ + const typeof(*(ptr)) *_s = (hnd).p; \ + typeof(*(ptr)) *_d = (ptr); \ + raw_copy_from_guest_errno(_d, _s + (off), sizeof(*_d) * (nr)); \ + }) + +#define copy_field_to_guest_errno(hnd, ptr, field) ({ \ + const typeof(&(ptr)->field) _s = &(ptr)->field; \ + void *_d = &(hnd).p->field; \ + ((void)(&(hnd).p->field == &(ptr)->field)); \ + raw_copy_to_guest_errno(_d, _s, sizeof(*_s)); \ + }) + +#define copy_field_from_guest_errno(ptr, hnd, field) ({ \ + const typeof(&(ptr)->field) _s = &(hnd).p->field; \ + typeof(&(ptr)->field) _d = &(ptr)->field; \ + raw_copy_from_guest_errno(_d, _s, sizeof(*_d)); \ + }) + /* * Pre-validate a guest handle. * Allows use of faster __copy_* functions. diff --git a/xen/include/asm-x86/guest_access.h b/xen/include/asm-x86/guest_access.h index ca700c9..9391cd3 100644 --- a/xen/include/asm-x86/guest_access.h +++ b/xen/include/asm-x86/guest_access.h @@ -38,6 +38,15 @@ clear_user_hvm((dst), (len)) : \ clear_user((dst), (len))) +#define raw_copy_from_guest_errno(dst, src, len) \ + (is_hvm_vcpu(current) ? \ + copy_from_user_hvm((dst), (src), (len)) : \ + (copy_from_user((dst), (src), (len)) ? -EFAULT : 0)) +#define raw_copy_to_guest_errno(dst, src, len) \ + (is_hvm_vcpu(current) ? \ + copy_to_user_hvm((dst), (src), (len)) : \ + (copy_to_user((dst), (src), (len)) ? -EFAULT : 0)) + /* Is the guest handle a NULL reference? */ #define guest_handle_is_null(hnd) ((hnd).p == NULL) @@ -121,6 +130,26 @@ raw_copy_from_guest(_d, _s, sizeof(*_d)); \ }) +/* errno returning copy functions */ +#define copy_from_guest_offset_errno(ptr, hnd, off, nr) ({ \ + const typeof(*(ptr)) *_s = (hnd).p; \ + typeof(*(ptr)) *_d = (ptr); \ + raw_copy_from_guest_errno(_d, _s + (off), sizeof(*_d) * (nr)); \ + }) + +#define copy_field_to_guest_errno(hnd, ptr, field) ({ \ + const typeof(&(ptr)->field) _s = &(ptr)->field; \ + void *_d = &(hnd).p->field; \ + ((void)(&(hnd).p->field == &(ptr)->field)); \ + raw_copy_to_guest_errno(_d, _s, sizeof(*_s)); \ + }) + +#define copy_field_from_guest_errno(ptr, hnd, field) ({ \ + const typeof(&(ptr)->field) _s = &(hnd).p->field; \ + typeof(&(ptr)->field) _d = &(ptr)->field; \ + raw_copy_from_guest_errno(_d, _s, sizeof(*_d)); \ + }) + /* * Pre-validate a guest handle. * Allows use of faster __copy_* functions. diff --git a/xen/include/xen/guest_access.h b/xen/include/xen/guest_access.h index 09989df..3494c5f 100644 --- a/xen/include/xen/guest_access.h +++ b/xen/include/xen/guest_access.h @@ -26,6 +26,9 @@ #define __copy_from_guest(ptr, hnd, nr) \ __copy_from_guest_offset(ptr, hnd, 0, nr) +#define copy_from_guest_errno(ptr, hnd, nr) \ + copy_from_guest_offset_errno(ptr, hnd, 0, nr) + #define __clear_guest(hnd, nr) \ __clear_guest_offset(hnd, 0, nr) -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |