]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Write proper wrappers for ioctls ION_IOC_ALLOC, ION_IOC_MAP and
authorJulian Seward <jseward@acm.org>
Fri, 23 Jan 2015 12:00:25 +0000 (12:00 +0000)
committerJulian Seward <jseward@acm.org>
Fri, 23 Jan 2015 12:00:25 +0000 (12:00 +0000)
ION_IOC_IMPORT, and add a wrapper for SYNC_IOC_MERGE.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14883

coregrind/m_syswrap/syswrap-linux.c
include/vki/vki-linux.h

index 7c7254515c92a050d1a66e0fa7f3d96d2d31f62b..9603512ac011fc90fb02d132307f3e2898d40775 100644 (file)
@@ -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:
index 8137e0caa3133075078e4f4ec428428cd698c26e..76e539e206b256ba009882fe6172f5fbb7e996e1 100644 (file)
@@ -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
 //----------------------------------------------------------------------