From: Tom Hughes Date: Fri, 7 May 2010 15:32:04 +0000 (+0000) Subject: Add support for some EVIO ioctls. These are a bit abnormal because X-Git-Tag: svn/VALGRIND_3_6_0~300 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef5b3e48b6966297f19efe70345a8df3f4d10054;p=thirdparty%2Fvalgrind.git Add support for some EVIO ioctls. These are a bit abnormal because 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 --- diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index e4d1a21738..d2cfbbda70 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -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; } } diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index 8946225dbd..395a059da2 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -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 /*--------------------------------------------------------------------*/