github.com/looshlee/beatles@v0.0.0-20220727174639-742810ab631c/bpf/include/linux/ioctl.h (about)

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