linux-headers (unknown)

(root)/
include/
asm-generic/
ioctl.h
       1  /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
       2  #ifndef _ASM_GENERIC_IOCTL_H
       3  #define _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  #define _IOC_TYPECHECK(t) (sizeof(t))
      76  
      77  /*
      78   * Used to create numbers.
      79   *
      80   * NOTE: _IOW means userland is writing and kernel is reading. _IOR
      81   * means userland is reading and kernel is writing.
      82   */
      83  #define _IO(type,nr)		_IOC(_IOC_NONE,(type),(nr),0)
      84  #define _IOR(type,nr,size)	_IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
      85  #define _IOW(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
      86  #define _IOWR(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
      87  #define _IOR_BAD(type,nr,size)	_IOC(_IOC_READ,(type),(nr),sizeof(size))
      88  #define _IOW_BAD(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),sizeof(size))
      89  #define _IOWR_BAD(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
      90  
      91  /* used to decode ioctl numbers.. */
      92  #define _IOC_DIR(nr)		(((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
      93  #define _IOC_TYPE(nr)		(((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
      94  #define _IOC_NR(nr)		(((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
      95  #define _IOC_SIZE(nr)		(((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
      96  
      97  /* ...and for the drivers/sound files... */
      98  
      99  #define IOC_IN		(_IOC_WRITE << _IOC_DIRSHIFT)
     100  #define IOC_OUT		(_IOC_READ << _IOC_DIRSHIFT)
     101  #define IOC_INOUT	((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
     102  #define IOCSIZE_MASK	(_IOC_SIZEMASK << _IOC_SIZESHIFT)
     103  #define IOCSIZE_SHIFT	(_IOC_SIZESHIFT)
     104  
     105  #endif /* _ASM_GENERIC_IOCTL_H */