]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add support for some EVIO ioctls. These are a bit abnormal because
authorTom Hughes <tom@compton.nu>
Fri, 7 May 2010 15:32:04 +0000 (15:32 +0000)
committerTom Hughes <tom@compton.nu>
Fri, 7 May 2010 15:32:04 +0000 (15:32 +0000)
the length part of the ioctl is not fixed so they are essentially
families of ioctls.

Based on patch from Peter Korsgaard. Fixes #235642.

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

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

index e4d1a217385cb8c95587ccfa23e1c2014e59e03a..d2cfbbda70cb4c80c45dc465f6b258be781f8072 100644 (file)
@@ -4821,7 +4821,34 @@ PRE(sys_ioctl)
       break;
 
    default:
-      ML_(PRE_unknown_ioctl)(tid, ARG2, ARG3);
+      /* EVIOC* are variable length and return size written on success */
+      switch (ARG2 & ~(_VKI_IOC_SIZEMASK << _VKI_IOC_SIZESHIFT)) {
+      case VKI_EVIOCGNAME(0):
+      case VKI_EVIOCGPHYS(0):
+      case VKI_EVIOCGUNIQ(0):
+      case VKI_EVIOCGKEY(0):
+      case VKI_EVIOCGLED(0):
+      case VKI_EVIOCGSND(0):
+      case VKI_EVIOCGSW(0):
+      case VKI_EVIOCGBIT(VKI_EV_SYN,0):
+      case VKI_EVIOCGBIT(VKI_EV_KEY,0):
+      case VKI_EVIOCGBIT(VKI_EV_REL,0):
+      case VKI_EVIOCGBIT(VKI_EV_ABS,0):
+      case VKI_EVIOCGBIT(VKI_EV_MSC,0):
+      case VKI_EVIOCGBIT(VKI_EV_SW,0):
+      case VKI_EVIOCGBIT(VKI_EV_LED,0):
+      case VKI_EVIOCGBIT(VKI_EV_SND,0):
+      case VKI_EVIOCGBIT(VKI_EV_REP,0):
+      case VKI_EVIOCGBIT(VKI_EV_FF,0):
+      case VKI_EVIOCGBIT(VKI_EV_PWR,0):
+      case VKI_EVIOCGBIT(VKI_EV_FF_STATUS,0):
+         if (RES > 0)
+            PRE_MEM_WRITE("ioctl(EVIO*)", ARG3, _VKI_IOC_SIZE(ARG2));
+         break;
+      default:
+         ML_(PRE_unknown_ioctl)(tid, ARG2, ARG3);
+         break;
+      }
       break;
    }   
 }
@@ -5607,7 +5634,34 @@ POST(sys_ioctl)
       break;
 
    default:
-      ML_(POST_unknown_ioctl)(tid, RES, ARG2, ARG3);
+      /* EVIOC* are variable length and return size written on success */
+      switch (ARG2 & ~(_VKI_IOC_SIZEMASK << _VKI_IOC_SIZESHIFT)) {
+      case VKI_EVIOCGNAME(0):
+      case VKI_EVIOCGPHYS(0):
+      case VKI_EVIOCGUNIQ(0):
+      case VKI_EVIOCGKEY(0):
+      case VKI_EVIOCGLED(0):
+      case VKI_EVIOCGSND(0):
+      case VKI_EVIOCGSW(0):
+      case VKI_EVIOCGBIT(VKI_EV_SYN,0):
+      case VKI_EVIOCGBIT(VKI_EV_KEY,0):
+      case VKI_EVIOCGBIT(VKI_EV_REL,0):
+      case VKI_EVIOCGBIT(VKI_EV_ABS,0):
+      case VKI_EVIOCGBIT(VKI_EV_MSC,0):
+      case VKI_EVIOCGBIT(VKI_EV_SW,0):
+      case VKI_EVIOCGBIT(VKI_EV_LED,0):
+      case VKI_EVIOCGBIT(VKI_EV_SND,0):
+      case VKI_EVIOCGBIT(VKI_EV_REP,0):
+      case VKI_EVIOCGBIT(VKI_EV_FF,0):
+      case VKI_EVIOCGBIT(VKI_EV_PWR,0):
+      case VKI_EVIOCGBIT(VKI_EV_FF_STATUS,0):
+         if (RES > 0)
+            POST_MEM_WRITE(ARG3, RES);
+         break;
+      default:
+         ML_(POST_unknown_ioctl)(tid, RES, ARG2, ARG3);
+         break;
+      }
       break;
    }
 }
index 8946225dbdf3e6ce52c8928de60cd22da7fed062..395a059da25a6bc46dcb94e892634826df3435aa 100644 (file)
@@ -2643,6 +2643,44 @@ struct vki_getcpu_cache {
        unsigned long blob[128 / sizeof(long)];
 };
 
+//----------------------------------------------------------------------
+// From linux-2.6.33.3/include/linux/input.h
+//----------------------------------------------------------------------
+
+/*
+ * IOCTLs (0x00 - 0x7f)
+ */
+
+#define VKI_EVIOCGNAME(len)    _VKI_IOC(_VKI_IOC_READ, 'E', 0x06, len)         /* get device name */
+#define VKI_EVIOCGPHYS(len)    _VKI_IOC(_VKI_IOC_READ, 'E', 0x07, len)         /* get physical location */
+#define VKI_EVIOCGUNIQ(len)    _VKI_IOC(_VKI_IOC_READ, 'E', 0x08, len)         /* get unique identifier */
+
+#define VKI_EVIOCGKEY(len)     _VKI_IOC(_VKI_IOC_READ, 'E', 0x18, len)         /* get global keystate */
+#define VKI_EVIOCGLED(len)     _VKI_IOC(_VKI_IOC_READ, 'E', 0x19, len)         /* get all LEDs */
+#define VKI_EVIOCGSND(len)     _VKI_IOC(_VKI_IOC_READ, 'E', 0x1a, len)         /* get all sounds status */
+#define VKI_EVIOCGSW(len)      _VKI_IOC(_VKI_IOC_READ, 'E', 0x1b, len)         /* get all switch states */
+
+#define VKI_EVIOCGBIT(ev,len)  _VKI_IOC(_VKI_IOC_READ, 'E', 0x20 + ev, len)    /* get event bits */
+
+/*
+ * Event types
+ */
+
+#define VKI_EV_SYN             0x00
+#define VKI_EV_KEY             0x01
+#define VKI_EV_REL             0x02
+#define VKI_EV_ABS             0x03
+#define VKI_EV_MSC             0x04
+#define VKI_EV_SW              0x05
+#define VKI_EV_LED             0x11
+#define VKI_EV_SND             0x12
+#define VKI_EV_REP             0x14
+#define VKI_EV_FF              0x15
+#define VKI_EV_PWR             0x16
+#define VKI_EV_FF_STATUS       0x17
+#define VKI_EV_MAX             0x1f
+#define VKI_EV_CNT             (VKI_EV_MAX+1)
+
 #endif // __VKI_LINUX_H
 
 /*--------------------------------------------------------------------*/