From: Julian Seward Date: Tue, 27 Sep 2011 10:26:52 +0000 (+0000) Subject: Android: add wrappers for ashmem and binder ioctls. From the AOSP X-Git-Tag: svn/VALGRIND_3_7_0~178 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cea6601bf2ec9b4d4ea70e32e969f0a339ec922f;p=thirdparty%2Fvalgrind.git Android: add wrappers for ashmem and binder ioctls. From the AOSP port of Valgrind. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12059 --- diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index 562ba3d341..3c4e0a8016 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -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)) { diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index a7861a0b4c..4cc8584b8c 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -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 /*--------------------------------------------------------------------*/