Some of our TARGET_* constant definitions for ioctls were wrong because the ioctl number is based on the sizeof() the type passed to the TARGET_IO* macros, and we were passing a host type rather than a target type. This was originally reported as a bug where the FS_IOC_{GET,SET}FLAGS ioctls weren't working for 32-bit arm guests on x86-64 hosts.
I did a quick audit of all the uses of the TARGET_IO* macros in syscall_defs.h, and: * FS_IOC_GETFLAGS/SETFLAGS are indeed wrong * 3 ioctls to do with magtapes are also wrong * TARGET_FS_IOC_FIEMAP, TARGET_FICLONERANGE and TARGET_SOUND_MIXER_INFO take a host struct which is defined such that it's the same size for all archs * lots and lots of ioctls use 'int', which is OK as for us 'abi_int' is always 32 bits (it might have different alignment requirements, but they don't matter for this purpose) * TARGET_SIOCPGRP takes a pid_t, which is always 'int' This patchset fixes the bugs in the first two bullet points, and leaves everything else alone since it doesn't actually manifest as wrong behaviour. Patch 1 is tested by the LTP 'setxattrs3' test case. There's no LTP test case for the magtape ioctls, so that patch change is untested. Peter Maydell (2): linux-user: Fix target FS_IOC_GETFLAGS and FS_IOC_SETFLAGS numbers linux-user: Fix TARGET_MTIOCTOP/MTIOCGET/MTIOCPOS values linux-user/syscall_defs.h | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) -- 2.7.4