1*6f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 28a1ab315SDavid Howells #ifndef _UAPI_ASM_GENERIC_IOCTL_H 38a1ab315SDavid Howells #define _UAPI_ASM_GENERIC_IOCTL_H 48a1ab315SDavid Howells 58a1ab315SDavid Howells /* ioctl command encoding: 32 bits total, command in lower 16 bits, 68a1ab315SDavid Howells * size of the parameter structure in the lower 14 bits of the 78a1ab315SDavid Howells * upper 16 bits. 88a1ab315SDavid Howells * Encoding the size of the parameter structure in the ioctl request 98a1ab315SDavid Howells * is useful for catching programs compiled with old versions 108a1ab315SDavid Howells * and to avoid overwriting user space outside the user buffer area. 118a1ab315SDavid Howells * The highest 2 bits are reserved for indicating the ``access mode''. 128a1ab315SDavid Howells * NOTE: This limits the max parameter size to 16kB -1 ! 138a1ab315SDavid Howells */ 148a1ab315SDavid Howells 158a1ab315SDavid Howells /* 168a1ab315SDavid Howells * The following is for compatibility across the various Linux 178a1ab315SDavid Howells * platforms. The generic ioctl numbering scheme doesn't really enforce 188a1ab315SDavid Howells * a type field. De facto, however, the top 8 bits of the lower 16 198a1ab315SDavid Howells * bits are indeed used as a type field, so we might just as well make 208a1ab315SDavid Howells * this explicit here. Please be sure to use the decoding macros 218a1ab315SDavid Howells * below from now on. 228a1ab315SDavid Howells */ 238a1ab315SDavid Howells #define _IOC_NRBITS 8 248a1ab315SDavid Howells #define _IOC_TYPEBITS 8 258a1ab315SDavid Howells 268a1ab315SDavid Howells /* 278a1ab315SDavid Howells * Let any architecture override either of the following before 288a1ab315SDavid Howells * including this file. 298a1ab315SDavid Howells */ 308a1ab315SDavid Howells 318a1ab315SDavid Howells #ifndef _IOC_SIZEBITS 328a1ab315SDavid Howells # define _IOC_SIZEBITS 14 338a1ab315SDavid Howells #endif 348a1ab315SDavid Howells 358a1ab315SDavid Howells #ifndef _IOC_DIRBITS 368a1ab315SDavid Howells # define _IOC_DIRBITS 2 378a1ab315SDavid Howells #endif 388a1ab315SDavid Howells 398a1ab315SDavid Howells #define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) 408a1ab315SDavid Howells #define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) 418a1ab315SDavid Howells #define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) 428a1ab315SDavid Howells #define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) 438a1ab315SDavid Howells 448a1ab315SDavid Howells #define _IOC_NRSHIFT 0 458a1ab315SDavid Howells #define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) 468a1ab315SDavid Howells #define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) 478a1ab315SDavid Howells #define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) 488a1ab315SDavid Howells 498a1ab315SDavid Howells /* 508a1ab315SDavid Howells * Direction bits, which any architecture can choose to override 518a1ab315SDavid Howells * before including this file. 52e067eba5SAndrea Arcangeli * 53e067eba5SAndrea Arcangeli * NOTE: _IOC_WRITE means userland is writing and kernel is 54e067eba5SAndrea Arcangeli * reading. _IOC_READ means userland is reading and kernel is writing. 558a1ab315SDavid Howells */ 568a1ab315SDavid Howells 578a1ab315SDavid Howells #ifndef _IOC_NONE 588a1ab315SDavid Howells # define _IOC_NONE 0U 598a1ab315SDavid Howells #endif 608a1ab315SDavid Howells 618a1ab315SDavid Howells #ifndef _IOC_WRITE 628a1ab315SDavid Howells # define _IOC_WRITE 1U 638a1ab315SDavid Howells #endif 648a1ab315SDavid Howells 658a1ab315SDavid Howells #ifndef _IOC_READ 668a1ab315SDavid Howells # define _IOC_READ 2U 678a1ab315SDavid Howells #endif 688a1ab315SDavid Howells 698a1ab315SDavid Howells #define _IOC(dir,type,nr,size) \ 708a1ab315SDavid Howells (((dir) << _IOC_DIRSHIFT) | \ 718a1ab315SDavid Howells ((type) << _IOC_TYPESHIFT) | \ 728a1ab315SDavid Howells ((nr) << _IOC_NRSHIFT) | \ 738a1ab315SDavid Howells ((size) << _IOC_SIZESHIFT)) 748a1ab315SDavid Howells 758a1ab315SDavid Howells #ifndef __KERNEL__ 768a1ab315SDavid Howells #define _IOC_TYPECHECK(t) (sizeof(t)) 778a1ab315SDavid Howells #endif 788a1ab315SDavid Howells 79e067eba5SAndrea Arcangeli /* 80e067eba5SAndrea Arcangeli * Used to create numbers. 81e067eba5SAndrea Arcangeli * 82e067eba5SAndrea Arcangeli * NOTE: _IOW means userland is writing and kernel is reading. _IOR 83e067eba5SAndrea Arcangeli * means userland is reading and kernel is writing. 84e067eba5SAndrea Arcangeli */ 858a1ab315SDavid Howells #define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) 868a1ab315SDavid Howells #define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size))) 878a1ab315SDavid Howells #define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) 888a1ab315SDavid Howells #define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) 898a1ab315SDavid Howells #define _IOR_BAD(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) 908a1ab315SDavid Howells #define _IOW_BAD(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) 918a1ab315SDavid Howells #define _IOWR_BAD(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) 928a1ab315SDavid Howells 938a1ab315SDavid Howells /* used to decode ioctl numbers.. */ 948a1ab315SDavid Howells #define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) 958a1ab315SDavid Howells #define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) 968a1ab315SDavid Howells #define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) 978a1ab315SDavid Howells #define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) 988a1ab315SDavid Howells 998a1ab315SDavid Howells /* ...and for the drivers/sound files... */ 1008a1ab315SDavid Howells 1018a1ab315SDavid Howells #define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT) 1028a1ab315SDavid Howells #define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT) 1038a1ab315SDavid Howells #define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT) 1048a1ab315SDavid Howells #define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) 1058a1ab315SDavid Howells #define IOCSIZE_SHIFT (_IOC_SIZESHIFT) 1068a1ab315SDavid Howells 1078a1ab315SDavid Howells #endif /* _UAPI_ASM_GENERIC_IOCTL_H */ 108