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  }