mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
6d89ead199
The third parameter to _IOR et al is a type name, not a size. So the parameter being named "size" is irritating. Rename it to "argtype" instead to reduce confusion. There is a very minor chance that this breaks stuff. It only hurts however if there is a variable (or macro) in userspace that is called "argtype" *and* it's used in the parameters of _IOR and friends. IMHO this is negligible because usually definitions making use of these macros are provided by kernel headers (i.e. us) or if they are replicated in userspace code, they are replicated and so supposed to match the kernel definitions (e.g. to make them usable by programs without the need to update the kernel headers used to compile the program). Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
108 lines
3.5 KiB
C
108 lines
3.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
#ifndef _UAPI_ASM_GENERIC_IOCTL_H
|
|
#define _UAPI_ASM_GENERIC_IOCTL_H
|
|
|
|
/* ioctl command encoding: 32 bits total, command in lower 16 bits,
|
|
* size of the parameter structure in the lower 14 bits of the
|
|
* upper 16 bits.
|
|
* Encoding the size of the parameter structure in the ioctl request
|
|
* is useful for catching programs compiled with old versions
|
|
* and to avoid overwriting user space outside the user buffer area.
|
|
* The highest 2 bits are reserved for indicating the ``access mode''.
|
|
* NOTE: This limits the max parameter size to 16kB -1 !
|
|
*/
|
|
|
|
/*
|
|
* The following is for compatibility across the various Linux
|
|
* platforms. The generic ioctl numbering scheme doesn't really enforce
|
|
* a type field. De facto, however, the top 8 bits of the lower 16
|
|
* bits are indeed used as a type field, so we might just as well make
|
|
* this explicit here. Please be sure to use the decoding macros
|
|
* below from now on.
|
|
*/
|
|
#define _IOC_NRBITS 8
|
|
#define _IOC_TYPEBITS 8
|
|
|
|
/*
|
|
* Let any architecture override either of the following before
|
|
* including this file.
|
|
*/
|
|
|
|
#ifndef _IOC_SIZEBITS
|
|
# define _IOC_SIZEBITS 14
|
|
#endif
|
|
|
|
#ifndef _IOC_DIRBITS
|
|
# define _IOC_DIRBITS 2
|
|
#endif
|
|
|
|
#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1)
|
|
#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1)
|
|
#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1)
|
|
#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1)
|
|
|
|
#define _IOC_NRSHIFT 0
|
|
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
|
|
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
|
|
#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
|
|
|
|
/*
|
|
* Direction bits, which any architecture can choose to override
|
|
* before including this file.
|
|
*
|
|
* NOTE: _IOC_WRITE means userland is writing and kernel is
|
|
* reading. _IOC_READ means userland is reading and kernel is writing.
|
|
*/
|
|
|
|
#ifndef _IOC_NONE
|
|
# define _IOC_NONE 0U
|
|
#endif
|
|
|
|
#ifndef _IOC_WRITE
|
|
# define _IOC_WRITE 1U
|
|
#endif
|
|
|
|
#ifndef _IOC_READ
|
|
# define _IOC_READ 2U
|
|
#endif
|
|
|
|
#define _IOC(dir,type,nr,size) \
|
|
(((dir) << _IOC_DIRSHIFT) | \
|
|
((type) << _IOC_TYPESHIFT) | \
|
|
((nr) << _IOC_NRSHIFT) | \
|
|
((size) << _IOC_SIZESHIFT))
|
|
|
|
#ifndef __KERNEL__
|
|
#define _IOC_TYPECHECK(t) (sizeof(t))
|
|
#endif
|
|
|
|
/*
|
|
* Used to create numbers.
|
|
*
|
|
* NOTE: _IOW means userland is writing and kernel is reading. _IOR
|
|
* means userland is reading and kernel is writing.
|
|
*/
|
|
#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0)
|
|
#define _IOR(type,nr,argtype) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(argtype)))
|
|
#define _IOW(type,nr,argtype) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(argtype)))
|
|
#define _IOWR(type,nr,argtype) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(argtype)))
|
|
#define _IOR_BAD(type,nr,argtype) _IOC(_IOC_READ,(type),(nr),sizeof(argtype))
|
|
#define _IOW_BAD(type,nr,argtype) _IOC(_IOC_WRITE,(type),(nr),sizeof(argtype))
|
|
#define _IOWR_BAD(type,nr,argtype) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(argtype))
|
|
|
|
/* used to decode ioctl numbers.. */
|
|
#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
|
|
#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
|
|
#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
|
|
#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
|
|
|
|
/* ...and for the drivers/sound files... */
|
|
|
|
#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT)
|
|
#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT)
|
|
#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
|
|
#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT)
|
|
#define IOCSIZE_SHIFT (_IOC_SIZESHIFT)
|
|
|
|
#endif /* _UAPI_ASM_GENERIC_IOCTL_H */
|