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;
}
}
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;
}
}
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
/*--------------------------------------------------------------------*/