From: Julian Seward Date: Wed, 19 Oct 2016 16:08:25 +0000 (+0000) Subject: Add support for Linux perf-events ioctls. Fixes #368419. X-Git-Tag: svn/VALGRIND_3_13_0~328 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=71b25c5da312716d2b15c25378f80e60931892fd;p=thirdparty%2Fvalgrind.git Add support for Linux perf-events ioctls. Fixes #368419. Patch from Keno Fischer (keno@juliacomputing.com). git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16077 --- diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index 96868acb4d..f2ebc161f1 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -5640,6 +5640,10 @@ PRE(sys_ioctl) case VKI_FIONCLEX: case VKI_TIOCNOTTY: + /* linux perf_event ioctls */ + case VKI_PERF_EVENT_IOC_ENABLE: + case VKI_PERF_EVENT_IOC_DISABLE: + /* linux/soundcard interface (ALSA) */ case VKI_SNDRV_PCM_IOCTL_HW_FREE: case VKI_SNDRV_PCM_IOCTL_HWSYNC: @@ -8496,6 +8500,25 @@ PRE(sys_ioctl) break; } + case VKI_PERF_EVENT_IOC_RESET: + case VKI_PERF_EVENT_IOC_REFRESH: + case VKI_PERF_EVENT_IOC_SET_OUTPUT: + case VKI_PERF_EVENT_IOC_SET_BPF: + /* These take scalar arguments, so already handled above */ + break; + + case VKI_PERF_EVENT_IOC_PERIOD: + PRE_MEM_READ("ioctl(VKI_PERF_EVENT_IOC_PERIOD)", (Addr)ARG3, sizeof(__vki_u64)); + break; + + case VKI_PERF_EVENT_IOC_SET_FILTER: + PRE_MEM_RASCIIZ("ioctl(VKI_PERF_EVENT_IOC_SET_FILTER).filter", ARG3); + break; + + case VKI_PERF_EVENT_IOC_ID: + PRE_MEM_WRITE("ioctl(VKI_PERF_EVENT_IOC_ID)", (Addr)ARG3, sizeof(__vki_u64)); + break; + default: /* EVIOC* are variable length and return size written on success */ switch (ARG2 & ~(_VKI_IOC_SIZEMASK << _VKI_IOC_SIZESHIFT)) { @@ -10388,6 +10411,20 @@ POST(sys_ioctl) case VKI_TIOCSSERIAL: break; + case VKI_PERF_EVENT_IOC_ENABLE: + case VKI_PERF_EVENT_IOC_DISABLE: + case VKI_PERF_EVENT_IOC_REFRESH: + case VKI_PERF_EVENT_IOC_RESET: + case VKI_PERF_EVENT_IOC_PERIOD: + case VKI_PERF_EVENT_IOC_SET_OUTPUT: + case VKI_PERF_EVENT_IOC_SET_FILTER: + case VKI_PERF_EVENT_IOC_SET_BPF: + break; + + case VKI_PERF_EVENT_IOC_ID: + POST_MEM_WRITE((Addr)ARG3, sizeof(__vki_u64)); + break; + 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 47e89f9c00..bdb8f3393a 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -2946,6 +2946,16 @@ struct vki_perf_event_attr { }; }; +#define VKI_PERF_EVENT_IOC_ENABLE _VKI_IO ('$', 0) +#define VKI_PERF_EVENT_IOC_DISABLE _VKI_IO ('$', 1) +#define VKI_PERF_EVENT_IOC_REFRESH _VKI_IO ('$', 2) +#define VKI_PERF_EVENT_IOC_RESET _VKI_IO ('$', 3) +#define VKI_PERF_EVENT_IOC_PERIOD _VKI_IOW('$', 4, __vki_u64) +#define VKI_PERF_EVENT_IOC_SET_OUTPUT _VKI_IO ('$', 5) +#define VKI_PERF_EVENT_IOC_SET_FILTER _VKI_IOW('$', 6, char *) +#define VKI_PERF_EVENT_IOC_ID _VKI_IOR('$', 7, __vki_u64 *) +#define VKI_PERF_EVENT_IOC_SET_BPF _VKI_IOW('$', 8, __vki_u32) + /*--------------------------------------------------------------------*/ // From linux-2.6.32.4/include/linux/getcpu.h /*--------------------------------------------------------------------*/