375 lines
18 KiB
Diff
375 lines
18 KiB
Diff
|
Index: 2007-05-14/xen/arch/x86/mm.c
|
||
|
===================================================================
|
||
|
--- 2007-05-14.orig/xen/arch/x86/mm.c 2007-05-14 13:44:25.000000000 +0200
|
||
|
+++ 2007-05-14/xen/arch/x86/mm.c 2007-05-14 14:33:33.000000000 +0200
|
||
|
@@ -2896,7 +2896,7 @@ long do_set_gdt(XEN_GUEST_HANDLE(ulong)
|
||
|
if ( entries > FIRST_RESERVED_GDT_ENTRY )
|
||
|
return -EINVAL;
|
||
|
|
||
|
- if ( copy_from_guest((unsigned long *)frames, frame_list, nr_pages) )
|
||
|
+ if ( copy_from_guest(frames, frame_list, nr_pages) )
|
||
|
return -EFAULT;
|
||
|
|
||
|
LOCK_BIGLOCK(current->domain);
|
||
|
@@ -3077,7 +3077,7 @@ long arch_memory_op(int op, XEN_GUEST_HA
|
||
|
else if ( (d = rcu_lock_domain_by_id(fmap.domid)) == NULL )
|
||
|
return -ESRCH;
|
||
|
|
||
|
- rc = copy_from_guest(&d->arch.e820[0], fmap.map.buffer,
|
||
|
+ rc = copy_from_guest(d->arch.e820, fmap.map.buffer,
|
||
|
fmap.map.nr_entries) ? -EFAULT : 0;
|
||
|
d->arch.nr_e820 = fmap.map.nr_entries;
|
||
|
|
||
|
@@ -3098,7 +3098,7 @@ long arch_memory_op(int op, XEN_GUEST_HA
|
||
|
return -EFAULT;
|
||
|
|
||
|
map.nr_entries = min(map.nr_entries, d->arch.nr_e820);
|
||
|
- if ( copy_to_guest(map.buffer, &d->arch.e820[0], map.nr_entries) ||
|
||
|
+ if ( copy_to_guest(map.buffer, d->arch.e820, map.nr_entries) ||
|
||
|
copy_to_guest(arg, &map, 1) )
|
||
|
return -EFAULT;
|
||
|
|
||
|
@@ -3122,7 +3122,7 @@ long arch_memory_op(int op, XEN_GUEST_HA
|
||
|
buffer = guest_handle_cast(memmap.buffer, e820entry_t);
|
||
|
|
||
|
count = min((unsigned int)e820.nr_map, memmap.nr_entries);
|
||
|
- if ( copy_to_guest(buffer, &e820.map[0], count) < 0 )
|
||
|
+ if ( copy_to_guest(buffer, e820.map, count) < 0 )
|
||
|
return -EFAULT;
|
||
|
|
||
|
memmap.nr_entries = count;
|
||
|
@@ -3135,7 +3135,7 @@ long arch_memory_op(int op, XEN_GUEST_HA
|
||
|
|
||
|
case XENMEM_machphys_mapping:
|
||
|
{
|
||
|
- struct xen_machphys_mapping mapping = {
|
||
|
+ static const struct xen_machphys_mapping mapping = {
|
||
|
.v_start = MACH2PHYS_VIRT_START,
|
||
|
.v_end = MACH2PHYS_VIRT_END,
|
||
|
.max_mfn = MACH2PHYS_NR_ENTRIES - 1
|
||
|
Index: 2007-05-14/xen/arch/x86/traps.c
|
||
|
===================================================================
|
||
|
--- 2007-05-14.orig/xen/arch/x86/traps.c 2007-05-14 13:43:46.000000000 +0200
|
||
|
+++ 2007-05-14/xen/arch/x86/traps.c 2007-05-14 14:33:33.000000000 +0200
|
||
|
@@ -1117,7 +1117,7 @@ static inline int guest_io_okay(
|
||
|
* read as 0xff (no access allowed).
|
||
|
*/
|
||
|
TOGGLE_MODE();
|
||
|
- switch ( __copy_from_guest_offset(&x.bytes[0], v->arch.iobmp,
|
||
|
+ switch ( __copy_from_guest_offset(x.bytes, v->arch.iobmp,
|
||
|
port>>3, 2) )
|
||
|
{
|
||
|
default: x.bytes[0] = ~0;
|
||
|
Index: 2007-05-14/xen/common/domctl.c
|
||
|
===================================================================
|
||
|
--- 2007-05-14.orig/xen/common/domctl.c 2007-04-26 09:25:12.000000000 +0200
|
||
|
+++ 2007-05-14/xen/common/domctl.c 2007-05-14 14:33:33.000000000 +0200
|
||
|
@@ -43,7 +43,7 @@ void cpumask_to_xenctl_cpumap(
|
||
|
|
||
|
bitmap_long_to_byte(bytemap, cpus_addr(*cpumask), NR_CPUS);
|
||
|
|
||
|
- copy_to_guest(xenctl_cpumap->bitmap, &bytemap[0], copy_bytes);
|
||
|
+ copy_to_guest(xenctl_cpumap->bitmap, bytemap, copy_bytes);
|
||
|
|
||
|
for ( i = copy_bytes; i < guest_bytes; i++ )
|
||
|
copy_to_guest_offset(xenctl_cpumap->bitmap, i, &zero, 1);
|
||
|
@@ -63,7 +63,7 @@ void xenctl_cpumap_to_cpumask(
|
||
|
if ( guest_handle_is_null(xenctl_cpumap->bitmap) )
|
||
|
return;
|
||
|
|
||
|
- copy_from_guest(&bytemap[0], xenctl_cpumap->bitmap, copy_bytes);
|
||
|
+ copy_from_guest(bytemap, xenctl_cpumap->bitmap, copy_bytes);
|
||
|
|
||
|
bitmap_byte_to_long(cpus_addr(*cpumask), bytemap, NR_CPUS);
|
||
|
}
|
||
|
Index: 2007-05-14/xen/common/kernel.c
|
||
|
===================================================================
|
||
|
--- 2007-05-14.orig/xen/common/kernel.c 2007-05-14 13:43:09.000000000 +0200
|
||
|
+++ 2007-05-14/xen/common/kernel.c 2007-05-14 14:33:33.000000000 +0200
|
||
|
@@ -142,7 +142,7 @@ DO(xen_version)(int cmd, XEN_GUEST_HANDL
|
||
|
{
|
||
|
xen_extraversion_t extraversion;
|
||
|
safe_strcpy(extraversion, xen_extra_version());
|
||
|
- if ( copy_to_guest(arg, (char *)extraversion, sizeof(extraversion)) )
|
||
|
+ if ( copy_to_guest(arg, extraversion, ARRAY_SIZE(extraversion)) )
|
||
|
return -EFAULT;
|
||
|
return 0;
|
||
|
}
|
||
|
@@ -167,7 +167,7 @@ DO(xen_version)(int cmd, XEN_GUEST_HANDL
|
||
|
memset(info, 0, sizeof(info));
|
||
|
arch_get_xen_caps(&info);
|
||
|
|
||
|
- if ( copy_to_guest(arg, (char *)info, sizeof(info)) )
|
||
|
+ if ( copy_to_guest(arg, info, ARRAY_SIZE(info)) )
|
||
|
return -EFAULT;
|
||
|
return 0;
|
||
|
}
|
||
|
@@ -187,7 +187,7 @@ DO(xen_version)(int cmd, XEN_GUEST_HANDL
|
||
|
{
|
||
|
xen_changeset_info_t chgset;
|
||
|
safe_strcpy(chgset, xen_changeset());
|
||
|
- if ( copy_to_guest(arg, (char *)chgset, sizeof(chgset)) )
|
||
|
+ if ( copy_to_guest(arg, chgset, ARRAY_SIZE(chgset)) )
|
||
|
return -EFAULT;
|
||
|
return 0;
|
||
|
}
|
||
|
@@ -229,8 +229,8 @@ DO(xen_version)(int cmd, XEN_GUEST_HANDL
|
||
|
|
||
|
case XENVER_guest_handle:
|
||
|
{
|
||
|
- if ( copy_to_guest(arg, (char *)current->domain->handle,
|
||
|
- sizeof(current->domain->handle)) )
|
||
|
+ if ( copy_to_guest(arg, current->domain->handle,
|
||
|
+ ARRAY_SIZE(current->domain->handle)) )
|
||
|
return -EFAULT;
|
||
|
return 0;
|
||
|
}
|
||
|
Index: 2007-05-14/xen/common/perfc.c
|
||
|
===================================================================
|
||
|
--- 2007-05-14.orig/xen/common/perfc.c 2007-04-26 09:25:12.000000000 +0200
|
||
|
+++ 2007-05-14/xen/common/perfc.c 2007-05-14 14:33:33.000000000 +0200
|
||
|
@@ -227,7 +227,7 @@ static int perfc_copy_info(XEN_GUEST_HAN
|
||
|
}
|
||
|
BUG_ON(v != perfc_nbr_vals);
|
||
|
|
||
|
- if ( copy_to_guest(desc, (xen_sysctl_perfc_desc_t *)perfc_d, NR_PERFCTRS) )
|
||
|
+ if ( copy_to_guest(desc, perfc_d, NR_PERFCTRS) )
|
||
|
return -EFAULT;
|
||
|
if ( copy_to_guest(val, perfc_vals, perfc_nbr_vals) )
|
||
|
return -EFAULT;
|
||
|
Index: 2007-05-14/xen/drivers/char/console.c
|
||
|
===================================================================
|
||
|
--- 2007-05-14.orig/xen/drivers/char/console.c 2007-04-23 10:01:44.000000000 +0200
|
||
|
+++ 2007-05-14/xen/drivers/char/console.c 2007-05-14 14:33:33.000000000 +0200
|
||
|
@@ -326,7 +326,7 @@ static long guest_console_write(XEN_GUES
|
||
|
CONSOLEIO_write, count, buffer);
|
||
|
|
||
|
kcount = min_t(int, count, sizeof(kbuf)-1);
|
||
|
- if ( copy_from_guest((char *)kbuf, buffer, kcount) )
|
||
|
+ if ( copy_from_guest(kbuf, buffer, kcount) )
|
||
|
return -EFAULT;
|
||
|
kbuf[kcount] = '\0';
|
||
|
|
||
|
Index: 2007-05-14/xen/include/asm-x86/guest_access.h
|
||
|
===================================================================
|
||
|
--- 2007-05-14.orig/xen/include/asm-x86/guest_access.h 2007-04-23 10:01:46.000000000 +0200
|
||
|
+++ 2007-05-14/xen/include/asm-x86/guest_access.h 2007-05-14 14:33:33.000000000 +0200
|
||
|
@@ -32,11 +32,12 @@
|
||
|
* specifying an offset into the guest array.
|
||
|
*/
|
||
|
#define copy_to_guest_offset(hnd, off, ptr, nr) ({ \
|
||
|
- typeof(ptr) _x = (hnd).p; \
|
||
|
- const typeof(ptr) _y = (ptr); \
|
||
|
+ const typeof(*(ptr)) *_s = (ptr); \
|
||
|
+ char (*_d)[sizeof(*_s)] = (void *)(hnd).p; \
|
||
|
+ ((void)((hnd).p == (ptr))); \
|
||
|
is_hvm_vcpu(current) ? \
|
||
|
- copy_to_user_hvm(_x+(off), _y, sizeof(*_x)*(nr)) : \
|
||
|
- copy_to_user(_x+(off), _y, sizeof(*_x)*(nr)); \
|
||
|
+ copy_to_user_hvm(_d+(off), _s, sizeof(*_s)*(nr)) : \
|
||
|
+ copy_to_user(_d+(off), _s, sizeof(*_s)*(nr)); \
|
||
|
})
|
||
|
|
||
|
/*
|
||
|
@@ -44,29 +45,31 @@
|
||
|
* specifying an offset into the guest array.
|
||
|
*/
|
||
|
#define copy_from_guest_offset(ptr, hnd, off, nr) ({ \
|
||
|
- const typeof(ptr) _x = (hnd).p; \
|
||
|
- typeof(ptr) _y = (ptr); \
|
||
|
+ const typeof(*(ptr)) *_s = (hnd).p; \
|
||
|
+ typeof(*(ptr)) *_d = (ptr); \
|
||
|
is_hvm_vcpu(current) ? \
|
||
|
- copy_from_user_hvm(_y, _x+(off), sizeof(*_x)*(nr)) :\
|
||
|
- copy_from_user(_y, _x+(off), sizeof(*_x)*(nr)); \
|
||
|
+ copy_from_user_hvm(_d, _s+(off), sizeof(*_d)*(nr)) :\
|
||
|
+ copy_from_user(_d, _s+(off), sizeof(*_d)*(nr)); \
|
||
|
})
|
||
|
|
||
|
/* Copy sub-field of a structure to guest context via a guest handle. */
|
||
|
#define copy_field_to_guest(hnd, ptr, field) ({ \
|
||
|
- typeof(&(ptr)->field) _x = &(hnd).p->field; \
|
||
|
- const typeof(&(ptr)->field) _y = &(ptr)->field; \
|
||
|
+ const typeof(&(ptr)->field) _s = &(ptr)->field; \
|
||
|
+ void *_d = &(hnd).p->field; \
|
||
|
+ ((void)((hnd).p == (ptr))); \
|
||
|
is_hvm_vcpu(current) ? \
|
||
|
- copy_to_user_hvm(_x, _y, sizeof(*_x)) : \
|
||
|
- copy_to_user(_x, _y, sizeof(*_x)); \
|
||
|
+ copy_to_user_hvm(_d, _s, sizeof(*_s)) : \
|
||
|
+ copy_to_user(_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) _x = &(hnd).p->field; \
|
||
|
- typeof(&(ptr)->field) _y = &(ptr)->field; \
|
||
|
+ const void *_s = &(hnd).p->field; \
|
||
|
+ typeof(&(ptr)->field) _d = &(ptr)->field; \
|
||
|
+ ((void)((hnd).p == (ptr))); \
|
||
|
is_hvm_vcpu(current) ? \
|
||
|
- copy_from_user_hvm(_y, _x, sizeof(*_x)) : \
|
||
|
- copy_from_user(_y, _x, sizeof(*_x)); \
|
||
|
+ copy_from_user_hvm(_d, _s, sizeof(*_d)) : \
|
||
|
+ copy_from_user(_d, _s, sizeof(*_d)); \
|
||
|
})
|
||
|
|
||
|
/*
|
||
|
@@ -78,35 +81,37 @@
|
||
|
array_access_ok((hnd).p, (nr), sizeof(*(hnd).p)))
|
||
|
|
||
|
#define __copy_to_guest_offset(hnd, off, ptr, nr) ({ \
|
||
|
- typeof(ptr) _x = (hnd).p; \
|
||
|
- const typeof(ptr) _y = (ptr); \
|
||
|
+ const typeof(*(ptr)) *_s = (ptr); \
|
||
|
+ char (*_d)[sizeof(*_s)] = (void *)(hnd).p; \
|
||
|
+ ((void)((hnd).p == (ptr))); \
|
||
|
is_hvm_vcpu(current) ? \
|
||
|
- copy_to_user_hvm(_x+(off), _y, sizeof(*_x)*(nr)) : \
|
||
|
- __copy_to_user(_x+(off), _y, sizeof(*_x)*(nr)); \
|
||
|
+ copy_to_user_hvm(_d+(off), _s, sizeof(*_s)*(nr)) : \
|
||
|
+ __copy_to_user(_d+(off), _s, sizeof(*_s)*(nr)); \
|
||
|
})
|
||
|
|
||
|
#define __copy_from_guest_offset(ptr, hnd, off, nr) ({ \
|
||
|
- const typeof(ptr) _x = (hnd).p; \
|
||
|
- typeof(ptr) _y = (ptr); \
|
||
|
+ const typeof(*(ptr)) *_s = (hnd).p; \
|
||
|
+ typeof(*(ptr)) *_d = (ptr); \
|
||
|
is_hvm_vcpu(current) ? \
|
||
|
- copy_from_user_hvm(_y, _x+(off),sizeof(*_x)*(nr)) : \
|
||
|
- __copy_from_user(_y, _x+(off), sizeof(*_x)*(nr)); \
|
||
|
+ copy_from_user_hvm(_d, _s+(off), sizeof(*_d)*(nr)) :\
|
||
|
+ __copy_from_user(_d, _s+(off), sizeof(*_d)*(nr)); \
|
||
|
})
|
||
|
|
||
|
#define __copy_field_to_guest(hnd, ptr, field) ({ \
|
||
|
- typeof(&(ptr)->field) _x = &(hnd).p->field; \
|
||
|
- const typeof(&(ptr)->field) _y = &(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(_x, _y, sizeof(*_x)) : \
|
||
|
- __copy_to_user(_x, _y, sizeof(*_x)); \
|
||
|
+ copy_to_user_hvm(_d, _s, sizeof(*_s)) : \
|
||
|
+ __copy_to_user(_d, _s, sizeof(*_s)); \
|
||
|
})
|
||
|
|
||
|
#define __copy_field_from_guest(ptr, hnd, field) ({ \
|
||
|
- const typeof(&(ptr)->field) _x = &(hnd).p->field; \
|
||
|
- typeof(&(ptr)->field) _y = &(ptr)->field; \
|
||
|
+ const typeof(&(ptr)->field) _s = &(hnd).p->field; \
|
||
|
+ typeof(&(ptr)->field) _d = &(ptr)->field; \
|
||
|
is_hvm_vcpu(current) ? \
|
||
|
- copy_from_user_hvm(_y, _x, sizeof(*_x)) : \
|
||
|
- __copy_from_user(_y, _x, sizeof(*_x)); \
|
||
|
+ copy_from_user_hvm(_d, _s, sizeof(*_d)) : \
|
||
|
+ __copy_from_user(_d, _s, sizeof(*_d)); \
|
||
|
})
|
||
|
|
||
|
#endif /* __ASM_X86_GUEST_ACCESS_H__ */
|
||
|
Index: 2007-05-14/xen/include/xen/compat.h
|
||
|
===================================================================
|
||
|
--- 2007-05-14.orig/xen/include/xen/compat.h 2007-04-23 10:01:47.000000000 +0200
|
||
|
+++ 2007-05-14/xen/include/xen/compat.h 2007-05-14 14:33:33.000000000 +0200
|
||
|
@@ -44,9 +44,10 @@
|
||
|
* specifying an offset into the guest array.
|
||
|
*/
|
||
|
#define copy_to_compat_offset(hnd, off, ptr, nr) ({ \
|
||
|
- const typeof(ptr) _x = (typeof(**(hnd)._) *)(full_ptr_t)(hnd).c; \
|
||
|
- const typeof(*(ptr)) *const _y = (ptr); \
|
||
|
- copy_to_user(_x + (off), _y, sizeof(*_x) * (nr)); \
|
||
|
+ 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)); \
|
||
|
})
|
||
|
|
||
|
/*
|
||
|
@@ -54,9 +55,9 @@
|
||
|
* specifying an offset into the guest array.
|
||
|
*/
|
||
|
#define copy_from_compat_offset(ptr, hnd, off, nr) ({ \
|
||
|
- const typeof(ptr) _x = (typeof(**(hnd)._) *)(full_ptr_t)(hnd).c; \
|
||
|
- const typeof(ptr) _y = (ptr); \
|
||
|
- copy_from_user(_y, _x + (off), sizeof(*_x) * (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)); \
|
||
|
})
|
||
|
|
||
|
#define copy_to_compat(hnd, ptr, nr) \
|
||
|
@@ -67,16 +68,18 @@
|
||
|
|
||
|
/* Copy sub-field of a structure to guest context via a compat handle. */
|
||
|
#define copy_field_to_compat(hnd, ptr, field) ({ \
|
||
|
- typeof((ptr)->field) *const _x = &((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field; \
|
||
|
- const typeof((ptr)->field) *const _y = &(ptr)->field; \
|
||
|
- copy_to_user(_x, _y, sizeof(*_x)); \
|
||
|
+ const typeof(&(ptr)->field) _s = &(ptr)->field; \
|
||
|
+ void *_d = &((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field; \
|
||
|
+ ((void)((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c == (ptr))); \
|
||
|
+ copy_to_user(_d, _s, sizeof(*_s)); \
|
||
|
})
|
||
|
|
||
|
/* Copy sub-field of a structure from guest context via a compat handle. */
|
||
|
#define copy_field_from_compat(ptr, hnd, field) ({ \
|
||
|
- typeof((ptr)->field) *const _x = &((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field; \
|
||
|
- typeof((ptr)->field) *const _y = &(ptr)->field; \
|
||
|
- copy_from_user(_y, _x, sizeof(*_x)); \
|
||
|
+ const void *_s = &((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field; \
|
||
|
+ typeof(&(ptr)->field) _d = &(ptr)->field; \
|
||
|
+ ((void)((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c == (ptr))); \
|
||
|
+ copy_from_user(_d, _s, sizeof(*_d)); \
|
||
|
})
|
||
|
|
||
|
/*
|
||
|
@@ -87,15 +90,16 @@
|
||
|
compat_array_access_ok((void *)(full_ptr_t)(hnd).c, (nr), sizeof(**(hnd)._))
|
||
|
|
||
|
#define __copy_to_compat_offset(hnd, off, ptr, nr) ({ \
|
||
|
- const typeof(ptr) _x = (typeof(**(hnd)._) *)(full_ptr_t)(hnd).c; \
|
||
|
- const typeof(*(ptr)) *const _y = (ptr); \
|
||
|
- __copy_to_user(_x + (off), _y, sizeof(*_x) * (nr)); \
|
||
|
+ 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)); \
|
||
|
})
|
||
|
|
||
|
#define __copy_from_compat_offset(ptr, hnd, off, nr) ({ \
|
||
|
- const typeof(ptr) _x = (typeof(**(hnd)._) *)(full_ptr_t)(hnd).c; \
|
||
|
- const typeof(ptr) _y = (ptr); \
|
||
|
- __copy_from_user(_y, _x + (off), sizeof(*_x) * (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)); \
|
||
|
})
|
||
|
|
||
|
#define __copy_to_compat(hnd, ptr, nr) \
|
||
|
@@ -105,15 +109,17 @@
|
||
|
__copy_from_compat_offset(ptr, hnd, 0, nr)
|
||
|
|
||
|
#define __copy_field_to_compat(hnd, ptr, field) ({ \
|
||
|
- typeof((ptr)->field) *const _x = &((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field; \
|
||
|
- const typeof((ptr)->field) *const _y = &(ptr)->field; \
|
||
|
- __copy_to_user(_x, _y, sizeof(*_x)); \
|
||
|
+ const typeof(&(ptr)->field) _s = &(ptr)->field; \
|
||
|
+ void *_d = &((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field; \
|
||
|
+ ((void)((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c == (ptr))); \
|
||
|
+ __copy_to_user(_d, _s, sizeof(*_s)); \
|
||
|
})
|
||
|
|
||
|
#define __copy_field_from_compat(ptr, hnd, field) ({ \
|
||
|
- typeof((ptr)->field) *const _x = &((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field; \
|
||
|
- typeof((ptr)->field) *const _y = &(ptr)->field; \
|
||
|
- __copy_from_user(_y, _x, sizeof(*_x)); \
|
||
|
+ const void *_s = &((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c)->field; \
|
||
|
+ typeof(&(ptr)->field) _d = &(ptr)->field; \
|
||
|
+ ((void)((typeof(**(hnd)._) *)(full_ptr_t)(hnd).c == (ptr))); \
|
||
|
+ __copy_from_user(_d, _s, sizeof(*_d)); \
|
||
|
})
|
||
|
|
||
|
|