Android: add wrappers for ashmem and binder ioctls. From the AOSP
authorsewardj <sewardj@a5019735-40e9-0310-863c-91ae7b9d1cf9>
Tue, 27 Sep 2011 10:26:52 +0000 (10:26 +0000)
committersewardj <sewardj@a5019735-40e9-0310-863c-91ae7b9d1cf9>
Tue, 27 Sep 2011 10:26:52 +0000 (10:26 +0000)
port of Valgrind.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12059 a5019735-40e9-0310-863c-91ae7b9d1cf9

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

index 562ba3d3411fe8a2450be09b262f289dfa677e01..3c4e0a8016afb3127877c71b5e08eb6cd9c6b989 100644 (file)
@@ -5032,6 +5032,74 @@ PRE(sys_ioctl)
       }
       break;
 
+#  if defined(VGPV_arm_linux_android)
+   /* ashmem */
+   case VKI_ASHMEM_GET_SIZE:
+   case VKI_ASHMEM_SET_SIZE:
+   case VKI_ASHMEM_GET_PROT_MASK:
+   case VKI_ASHMEM_SET_PROT_MASK:
+   case VKI_ASHMEM_GET_PIN_STATUS:
+   case VKI_ASHMEM_PURGE_ALL_CACHES:
+       break;
+   case VKI_ASHMEM_GET_NAME:
+       PRE_MEM_WRITE( "ioctl(ASHMEM_SET_NAME)", ARG3, VKI_ASHMEM_NAME_LEN );
+       break;
+   case VKI_ASHMEM_SET_NAME:
+       PRE_MEM_RASCIIZ( "ioctl(ASHMEM_SET_NAME)", ARG3);
+       break;
+   case VKI_ASHMEM_PIN:
+   case VKI_ASHMEM_UNPIN:
+       PRE_MEM_READ( "ioctl(ASHMEM_PIN|ASHMEM_UNPIN)",
+                     ARG3, sizeof(struct vki_ashmem_pin) );
+       break;
+
+   /* binder */
+   case VKI_BINDER_WRITE_READ:
+       if (ARG3) {
+           struct vki_binder_write_read* bwr
+              = (struct vki_binder_write_read*)ARG3;
+
+           PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).write_buffer",
+                          bwr->write_buffer);
+           PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).write_size",
+                          bwr->write_size);
+           PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).write_consumed",
+                          bwr->write_consumed);
+           PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).read_buffer",
+                          bwr->read_buffer);
+           PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).read_size",
+                          bwr->read_size);
+           PRE_FIELD_READ("ioctl(BINDER_WRITE_READ).read_consumed",
+                          bwr->read_consumed);
+
+           PRE_FIELD_WRITE("ioctl(BINDER_WRITE_READ).write_consumed",
+                           bwr->write_consumed);
+           PRE_FIELD_WRITE("ioctl(BINDER_WRITE_READ).read_consumed",
+                           bwr->read_consumed);
+
+           if (bwr->read_size)
+               PRE_MEM_WRITE("ioctl(BINDER_WRITE_READ).read_buffer[]",
+                             (Addr)bwr->read_buffer, bwr->read_size);
+           if (bwr->write_size)
+               PRE_MEM_READ("ioctl(BINDER_WRITE_READ).write_buffer[]",
+                            (Addr)bwr->write_buffer, bwr->write_size);
+       }
+       break;
+
+   case VKI_BINDER_SET_IDLE_TIMEOUT:
+   case VKI_BINDER_SET_MAX_THREADS:
+   case VKI_BINDER_SET_IDLE_PRIORITY:
+   case VKI_BINDER_SET_CONTEXT_MGR:
+   case VKI_BINDER_THREAD_EXIT:
+       break;
+   case VKI_BINDER_VERSION:
+       if (ARG3) {
+           struct vki_binder_version* bv = (struct vki_binder_version*)ARG3;
+           PRE_FIELD_WRITE("ioctl(BINDER_VERSION)", bv->protocol_version);
+       }
+       break;
+#  endif /* defined(VGPV_arm_linux_android) */
+
    default:
       /* EVIOC* are variable length and return size written on success */
       switch (ARG2 & ~(_VKI_IOC_SIZEMASK << _VKI_IOC_SIZESHIFT)) {
@@ -5847,6 +5915,49 @@ POST(sys_ioctl)
       }
       break;
 
+#  if defined(VGPV_arm_linux_android)
+   /* ashmem */
+   case VKI_ASHMEM_GET_SIZE:
+   case VKI_ASHMEM_SET_SIZE:
+   case VKI_ASHMEM_GET_PROT_MASK:
+   case VKI_ASHMEM_SET_PROT_MASK:
+   case VKI_ASHMEM_GET_PIN_STATUS:
+   case VKI_ASHMEM_PURGE_ALL_CACHES:
+   case VKI_ASHMEM_SET_NAME:
+   case VKI_ASHMEM_PIN:
+   case VKI_ASHMEM_UNPIN:
+       break;
+   case VKI_ASHMEM_GET_NAME:
+       POST_MEM_WRITE( ARG3, VKI_ASHMEM_NAME_LEN );
+       break;
+
+   /* binder */
+   case VKI_BINDER_WRITE_READ:
+       if (ARG3) {
+           struct vki_binder_write_read* bwr
+              = (struct vki_binder_write_read*)ARG3;
+           POST_FIELD_WRITE(bwr->write_consumed);
+           POST_FIELD_WRITE(bwr->read_consumed);
+
+           if (bwr->read_size)
+               POST_MEM_WRITE((Addr)bwr->read_buffer, bwr->read_consumed);
+       }
+       break;
+
+   case VKI_BINDER_SET_IDLE_TIMEOUT:
+   case VKI_BINDER_SET_MAX_THREADS:
+   case VKI_BINDER_SET_IDLE_PRIORITY:
+   case VKI_BINDER_SET_CONTEXT_MGR:
+   case VKI_BINDER_THREAD_EXIT:
+       break;
+   case VKI_BINDER_VERSION:
+       if (ARG3) {
+           struct vki_binder_version* bv = (struct vki_binder_version*)ARG3;
+           POST_FIELD_WRITE(bv->protocol_version);
+       }
+       break;
+#  endif /* defined(VGPV_arm_linux_android) */
+
    default:
       /* EVIOC* are variable length and return size written on success */
       switch (ARG2 & ~(_VKI_IOC_SIZEMASK << _VKI_IOC_SIZESHIFT)) {
index a7861a0b4c4178af972b985be4b56a3453d38dfb..4cc8584b8c9b03c67aa67d01b087e1ace05ee88b 100644 (file)
@@ -214,6 +214,7 @@ typedef unsigned int                vki_uint;
 //----------------------------------------------------------------------
 
 typedef                __vki_s32       vki_int32_t;
+typedef                __vki_s64       vki_int64_t;
 
 typedef                __vki_u8        vki_uint8_t;
 typedef                __vki_u16       vki_uint16_t;
@@ -2761,6 +2762,67 @@ struct vki_getcpu_cache {
 #define VKI_FIOQSIZE 0x5460     /* Value differs on some platforms */
 #endif
 
+//----------------------------------------------------------------------
+// From kernel/common/include/linux/ashmem.h
+//----------------------------------------------------------------------
+
+#if defined(VGPV_arm_linux_android)
+
+#define VKI_ASHMEM_NAME_LEN 256
+
+#define VKI_ASHMEM_NAME_DEF "dev/ashmem"
+
+#define VKI_ASHMEM_NOT_PURGED 0
+#define VKI_ASHMEM_WAS_PURGED 1
+
+#define VKI_ASHMEM_IS_UNPINNED 0
+#define VKI_ASHMEM_IS_PINNED 1
+
+struct vki_ashmem_pin {
+   vki_uint32_t offset;
+   vki_uint32_t len;
+};
+
+#define __VKI_ASHMEMIOC 0x77
+
+#define VKI_ASHMEM_SET_NAME _VKI_IOW(__VKI_ASHMEMIOC, 1, char[VKI_ASHMEM_NAME_LEN])
+#define VKI_ASHMEM_GET_NAME _VKI_IOR(__VKI_ASHMEMIOC, 2, char[VKI_ASHMEM_NAME_LEN])
+#define VKI_ASHMEM_SET_SIZE _VKI_IOW(__VKI_ASHMEMIOC, 3, vki_size_t)
+#define VKI_ASHMEM_GET_SIZE _VKI_IO(__VKI_ASHMEMIOC, 4)
+#define VKI_ASHMEM_SET_PROT_MASK _VKI_IOW(__VKI_ASHMEMIOC, 5, unsigned long)
+#define VKI_ASHMEM_GET_PROT_MASK _VKI_IO(__VKI_ASHMEMIOC, 6)
+#define VKI_ASHMEM_PIN _VKI_IOW(__VKI_ASHMEMIOC, 7, struct vki_ashmem_pin)
+#define VKI_ASHMEM_UNPIN _VKI_IOW(__VKI_ASHMEMIOC, 8, struct vki_ashmem_pin)
+#define VKI_ASHMEM_GET_PIN_STATUS _VKI_IO(__VKI_ASHMEMIOC, 9)
+#define VKI_ASHMEM_PURGE_ALL_CACHES _VKI_IO(__VKI_ASHMEMIOC, 10)
+
+//----------------------------------------------------------------------
+// From kernel/common/include/linux/binder.h
+//----------------------------------------------------------------------
+
+struct vki_binder_write_read {
+ signed long write_size;
+ signed long write_consumed;
+ unsigned long write_buffer;
+ signed long read_size;
+ signed long read_consumed;
+ unsigned long read_buffer;
+};
+
+struct vki_binder_version {
+ signed long protocol_version;
+};
+
+#define VKI_BINDER_WRITE_READ _VKI_IOWR('b', 1, struct vki_binder_write_read)
+#define VKI_BINDER_SET_IDLE_TIMEOUT _VKI_IOW('b', 3, vki_int64_t)
+#define VKI_BINDER_SET_MAX_THREADS _VKI_IOW('b', 5, vki_size_t)
+#define VKI_BINDER_SET_IDLE_PRIORITY _VKI_IOW('b', 6, int)
+#define VKI_BINDER_SET_CONTEXT_MGR _VKI_IOW('b', 7, int)
+#define VKI_BINDER_THREAD_EXIT _VKI_IOW('b', 8, int)
+#define VKI_BINDER_VERSION _VKI_IOWR('b', 9, struct vki_binder_version)
+
+#endif /* defined(VGPV_arm_linux_android) */
+
 #endif // __VKI_LINUX_H
 
 /*--------------------------------------------------------------------*/