root/include/uapi/asm-generic/ioctl.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
   2 #ifndef _UAPI_ASM_GENERIC_IOCTL_H
   3 #define _UAPI_ASM_GENERIC_IOCTL_H
   4 
   5 /* ioctl command encoding: 32 bits total, command in lower 16 bits,
   6  * size of the parameter structure in the lower 14 bits of the
   7  * upper 16 bits.
   8  * Encoding the size of the parameter structure in the ioctl request
   9  * is useful for catching programs compiled with old versions
  10  * and to avoid overwriting user space outside the user buffer area.
  11  * The highest 2 bits are reserved for indicating the ``access mode''.
  12  * NOTE: This limits the max parameter size to 16kB -1 !
  13  */
  14 
  15 /*
  16  * The following is for compatibility across the various Linux
  17  * platforms.  The generic ioctl numbering scheme doesn't really enforce
  18  * a type field.  De facto, however, the top 8 bits of the lower 16
  19  * bits are indeed used as a type field, so we might just as well make
  20  * this explicit here.  Please be sure to use the decoding macros
  21  * below from now on.
  22  */
  23 #define _IOC_NRBITS     8
  24 #define _IOC_TYPEBITS   8
  25 
  26 /*
  27  * Let any architecture override either of the following before
  28  * including this file.
  29  */
  30 
  31 #ifndef _IOC_SIZEBITS
  32 # define _IOC_SIZEBITS  14
  33 #endif
  34 
  35 #ifndef _IOC_DIRBITS
  36 # define _IOC_DIRBITS   2
  37 #endif
  38 
  39 #define _IOC_NRMASK     ((1 << _IOC_NRBITS)-1)
  40 #define _IOC_TYPEMASK   ((1 << _IOC_TYPEBITS)-1)
  41 #define _IOC_SIZEMASK   ((1 << _IOC_SIZEBITS)-1)
  42 #define _IOC_DIRMASK    ((1 << _IOC_DIRBITS)-1)
  43 
  44 #define _IOC_NRSHIFT    0
  45 #define _IOC_TYPESHIFT  (_IOC_NRSHIFT+_IOC_NRBITS)
  46 #define _IOC_SIZESHIFT  (_IOC_TYPESHIFT+_IOC_TYPEBITS)
  47 #define _IOC_DIRSHIFT   (_IOC_SIZESHIFT+_IOC_SIZEBITS)
  48 
  49 /*
  50  * Direction bits, which any architecture can choose to override
  51  * before including this file.
  52  *
  53  * NOTE: _IOC_WRITE means userland is writing and kernel is
  54  * reading. _IOC_READ means userland is reading and kernel is writing.
  55  */
  56 
  57 #ifndef _IOC_NONE
  58 # define _IOC_NONE      0U
  59 #endif
  60 
  61 #ifndef _IOC_WRITE
  62 # define _IOC_WRITE     1U
  63 #endif
  64 
  65 #ifndef _IOC_READ
  66 # define _IOC_READ      2U
  67 #endif
  68 
  69 #define _IOC(dir,type,nr,size) \
  70         (((dir)  << _IOC_DIRSHIFT) | \
  71          ((type) << _IOC_TYPESHIFT) | \
  72          ((nr)   << _IOC_NRSHIFT) | \
  73          ((size) << _IOC_SIZESHIFT))
  74 
  75 #ifndef __KERNEL__
  76 #define _IOC_TYPECHECK(t) (sizeof(t))
  77 #endif
  78 
  79 /*
  80  * Used to create numbers.
  81  *
  82  * NOTE: _IOW means userland is writing and kernel is reading. _IOR
  83  * means userland is reading and kernel is writing.
  84  */
  85 #define _IO(type,nr)            _IOC(_IOC_NONE,(type),(nr),0)
  86 #define _IOR(type,nr,size)      _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
  87 #define _IOW(type,nr,size)      _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
  88 #define _IOWR(type,nr,size)     _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
  89 #define _IOR_BAD(type,nr,size)  _IOC(_IOC_READ,(type),(nr),sizeof(size))
  90 #define _IOW_BAD(type,nr,size)  _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
  91 #define _IOWR_BAD(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
  92 
  93 /* used to decode ioctl numbers.. */
  94 #define _IOC_DIR(nr)            (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
  95 #define _IOC_TYPE(nr)           (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
  96 #define _IOC_NR(nr)             (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
  97 #define _IOC_SIZE(nr)           (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
  98 
  99 /* ...and for the drivers/sound files... */
 100 
 101 #define IOC_IN          (_IOC_WRITE << _IOC_DIRSHIFT)
 102 #define IOC_OUT         (_IOC_READ << _IOC_DIRSHIFT)
 103 #define IOC_INOUT       ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
 104 #define IOCSIZE_MASK    (_IOC_SIZEMASK << _IOC_SIZESHIFT)
 105 #define IOCSIZE_SHIFT   (_IOC_SIZESHIFT)
 106 
 107 #endif /* _UAPI_ASM_GENERIC_IOCTL_H */

/* [<][>][^][v][top][bottom][index][help] */