]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add support for Linux perf-events ioctls. Fixes #368419.
authorJulian Seward <jseward@acm.org>
Wed, 19 Oct 2016 16:08:25 +0000 (16:08 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 19 Oct 2016 16:08:25 +0000 (16:08 +0000)
Patch from Keno Fischer (keno@juliacomputing.com).

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

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

index 96868acb4d9b1a8ab7d78ed734a0d3cb7c955965..f2ebc161f159372707698a2f87f7b99057f428b9 100644 (file)
@@ -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)) {
index 47e89f9c000dfe366ecee5ff887541ffecd0840b..bdb8f3393a6aff1e487cbdde957f734d990ebc50 100644 (file)
@@ -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
 /*--------------------------------------------------------------------*/