// 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:
/* 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:
#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
//----------------------------------------------------------------------