From: Julian Seward Date: Fri, 23 Jan 2015 12:00:25 +0000 (+0000) Subject: Write proper wrappers for ioctls ION_IOC_ALLOC, ION_IOC_MAP and X-Git-Tag: svn/VALGRIND_3_11_0~709 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=af929fb880853235016966bc7060b020856bab57;p=thirdparty%2Fvalgrind.git Write proper wrappers for ioctls ION_IOC_ALLOC, ION_IOC_MAP and ION_IOC_IMPORT, and add a wrapper for SYNC_IOC_MERGE. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14883 --- diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index 7c7254515c..9603512ac0 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -5514,6 +5514,38 @@ PRE(sys_ioctl) // this category). Nb: some of these may well belong in the // doesn't-use-ARG3 switch above. switch (ARG2 /* request */) { + + case VKI_ION_IOC_ALLOC: { + struct vki_ion_allocation_data* data + = (struct vki_ion_allocation_data*)ARG3; + PRE_FIELD_READ ("ioctl(ION_IOC_ALLOC).len", data->len); + PRE_FIELD_READ ("ioctl(ION_IOC_ALLOC).align", data->align); + PRE_FIELD_READ ("ioctl(ION_IOC_ALLOC).heap_id_mask", data->heap_id_mask); + PRE_FIELD_READ ("ioctl(ION_IOC_ALLOC).flags", data->flags); + PRE_FIELD_WRITE("ioctl(ION_IOC_ALLOC).handle", data->handle); + break; + } + case VKI_ION_IOC_MAP: { + struct vki_ion_fd_data* data = (struct vki_ion_fd_data*)ARG3; + PRE_FIELD_READ ("ioctl(ION_IOC_MAP).handle", data->handle); + PRE_FIELD_WRITE("ioctl(ION_IOC_MAP).fd", data->fd); + break; + } + case VKI_ION_IOC_IMPORT: { + struct vki_ion_fd_data* data = (struct vki_ion_fd_data*)ARG3; + PRE_FIELD_READ ("ioctl(ION_IOC_IMPORT).fd", data->fd); + PRE_FIELD_WRITE("ioctl(ION_IOC_IMPORT).handle", data->handle); + break; + } + + case VKI_SYNC_IOC_MERGE: { + struct vki_sync_merge_data* data = (struct vki_sync_merge_data*)ARG3; + PRE_FIELD_READ ("ioctl(SYNC_IOC_MERGE).fd2", data->fd2); + PRE_MEM_RASCIIZ("ioctl(SYNC_IOC_MERGE).name", (Addr)(&data->name[0])); + PRE_FIELD_WRITE("ioctl(SYNC_IOC_MERGE).fence", data->fence); + break; + } + case VKI_TCSETS: case VKI_TCSETSW: case VKI_TCSETSF: @@ -8285,26 +8317,39 @@ POST(sys_ioctl) /* The Linux kernel "ion" memory allocator, used on Android. Note: this is pretty poor given that there's no pre-handling to check that writable areas are addressable. */ - case VKI_ION_IOC_ALLOC: - POST_MEM_WRITE(ARG3, sizeof(struct vki_ion_allocation_data)); + case VKI_ION_IOC_ALLOC: { + struct vki_ion_allocation_data* data + = (struct vki_ion_allocation_data*)ARG3; + POST_FIELD_WRITE(data->handle); break; - case VKI_ION_IOC_MAP: - POST_MEM_WRITE(ARG3, sizeof(struct vki_ion_fd_data)); + } + case VKI_ION_IOC_MAP: { + struct vki_ion_fd_data* data = (struct vki_ion_fd_data*)ARG3; + POST_FIELD_WRITE(data->fd); break; + } case VKI_ION_IOC_FREE: // is this necessary? POST_MEM_WRITE(ARG3, sizeof(struct vki_ion_handle_data)); break; case VKI_ION_IOC_SHARE: break; - case VKI_ION_IOC_IMPORT: // is this necessary? - POST_MEM_WRITE(ARG3, sizeof(struct vki_ion_fd_data)); + case VKI_ION_IOC_IMPORT: { + struct vki_ion_fd_data* data = (struct vki_ion_fd_data*)ARG3; + POST_FIELD_WRITE(data->handle); break; + } case VKI_ION_IOC_SYNC: break; case VKI_ION_IOC_CUSTOM: // is this necessary? POST_MEM_WRITE(ARG3, sizeof(struct vki_ion_custom_data)); break; + case VKI_SYNC_IOC_MERGE: { + struct vki_sync_merge_data* data = (struct vki_sync_merge_data*)ARG3; + POST_FIELD_WRITE(data->fence); + break; + } + case VKI_TCSETS: case VKI_TCSETSW: case VKI_TCSETSF: diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index 8137e0caa3..76e539e206 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -3545,6 +3545,43 @@ struct vki_ion_custom_data { #define VKI_ION_IOC_CUSTOM \ _VKI_IOWR(VKI_ION_IOC_MAGIC, 6, struct vki_ion_custom_data) +//---------------------------------------------------------------------- +// From linux-3.19-rc5/drivers/staging/android/uapi/sync.h +//---------------------------------------------------------------------- + +struct vki_sync_merge_data { + __vki_s32 fd2; + char name[32]; + __vki_s32 fence; +}; + +struct vki_sync_pt_info { + __vki_u32 len; + char obj_name[32]; + char driver_name[32]; + __vki_s32 status; + __vki_u64 timestamp_ns; + __vki_u8 driver_data[0]; +}; + +struct vki_sync_fence_info_data { + __vki_u32 len; + char name[32]; + __vki_s32 status; + __vki_u8 pt_info[0]; +}; + +#define VKI_SYNC_IOC_MAGIC '>' + +#define VKI_SYNC_IOC_WAIT \ + _VKI_IOW(VKI_SYNC_IOC_MAGIC, 0, __vki_s32) + +#define VKI_SYNC_IOC_MERGE \ + _VKI_IOWR(VKI_SYNC_IOC_MAGIC, 1, struct vki_sync_merge_data) + +#define VKI_SYNC_IOC_FENCE_INFO \ + _VKI_IOWR(VKI_SYNC_IOC_MAGIC, 2, struct vki_sync_fence_info_data) + //---------------------------------------------------------------------- // From drivers/staging/lustre/lustre/include/lustre/lustre_user.h //----------------------------------------------------------------------