github.com/zaolin/u-root@v0.0.0-20200428085104-64aaafd46c6d/pkg/mei/ioctl_linux.go (about) 1 // Copyright 2020 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package mei 6 7 // this file contains a few ioctl-related constants and reimplementations of 8 // macros from Linux's include/uapi/asm-generic/ioctl.h . 9 10 const ( 11 IOC_NRBITS = 8 12 IOC_TYPEBITS = 8 13 IOC_SIZEBITS = 14 14 IOC_DIRBITS = 2 15 16 IOC_NRMASK = (1 << IOC_NRBITS) - 1 17 IOC_TYPEMASK = (1 << IOC_TYPEBITS) - 1 18 IOC_SIZEMASK = (1 << IOC_SIZEBITS) - 1 19 IOC_DIRMASK = (1 << IOC_DIRBITS) - 1 20 21 IOC_NRSHIFT = 0 22 IOC_TYPESHIFT = (IOC_NRSHIFT + IOC_NRBITS) 23 IOC_SIZESHIFT = (IOC_TYPESHIFT + IOC_TYPEBITS) 24 IOC_DIRSHIFT = (IOC_SIZESHIFT + IOC_SIZEBITS) 25 26 IOC_NONE = 0x0 27 IOC_WRITE = 0x1 28 IOC_READ = 0x2 29 ) 30 31 // IOC is an implementation of Linux's _IOC macro. 32 func IOC(dir, typ, nr, size uintptr) uintptr { 33 return (dir << IOC_DIRSHIFT) | 34 (typ << IOC_TYPESHIFT) | 35 (nr << IOC_NRSHIFT) | 36 (size << IOC_SIZESHIFT) 37 } 38 39 // IO is an implementation of Linux's _IO macro. 40 func IO(typ, nr, size uintptr) uintptr { 41 return IOC(IOC_NONE, typ, nr, size) 42 } 43 44 // IOR is an implementation of Linux's _IOR macro. 45 func IOR(typ, nr, size uintptr) uintptr { 46 return IOC(IOC_READ, typ, nr, size) 47 } 48 49 // IOW is an implementation of Linux's _IOW macro. 50 func IOW(typ, nr, size uintptr) uintptr { 51 return IOC(IOC_WRITE, typ, nr, size) 52 } 53 54 // IOWR is an implementation of Linux's _IOWR macro. 55 func IOWR(typ, nr, size uintptr) uintptr { 56 return IOC(IOC_READ|IOC_WRITE, typ, nr, size) 57 } 58 59 // IOC_DIR is an implementation of Linux's _IOC_DIR macro. 60 func IOC_DIR(nr uintptr) uintptr { 61 return (nr >> IOC_DIRSHIFT) & IOC_DIRMASK 62 } 63 64 // IOC_TYPE is an implementation of Linux's _IOC_TYPE macro. 65 func IOC_TYPE(nr uintptr) uintptr { 66 return (IOC_TYPESHIFT) & IOC_TYPEMASK 67 } 68 69 // IOC_NR is an implementation of Linux's _IOC_NR macro. 70 func IOC_NR(nr uintptr) uintptr { 71 return (nr >> IOC_NRSHIFT) & IOC_NRMASK 72 } 73 74 // IOC_SIZE is an implementation of Linux's _IOC_SIZE macro. 75 func IOC_SIZE(nr uintptr) uintptr { 76 return (nr >> IOC_SIZESHIFT) & IOC_SIZEMASK 77 }