blob: 5fb7c26b0622b4315dce36510edb3fdb57b74511 [file]
/* **********************************************************
* Copyright (c) 2010-2022 Google, Inc. All rights reserved.
* Copyright (c) 2009-2010 VMware, Inc. All rights reserved.
* **********************************************************/
/* Dr. Memory: the memory debugger
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License, and no later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "dr_api.h"
#include "drsyscall.h"
#include "drsyscall_os.h"
#include "linux_defines.h"
#include "table_defines.h"
/* From "man ioctl_list" */
/* FIXME: "Some ioctls take a pointer to a structure which contains
* additional pointers." These are marked below with "FIXME: more".
* They are listed in the man page but I'm too lazy to add them just now.
* Some of the ioctls marked "more" take additional arguments as well.
*/
/* The name of the ioctl is "ioctl.name". To avoid long lines from repeating
* the request name we wrap it in a macro.
*/
#define IOCTL(request) {PACKNUM(16,54,54, 29), request}, "ioctl." STRINGIFY(request)
/* All ioctls take fd and request as the first two args. */
#define FD_REQ \
{0, sizeof(int), SYSARG_INLINED, INT_TYPE}, /* fd */ \
{1, sizeof(int), SYSARG_INLINED, INT_TYPE} /* request */
#define INT_TYPE DRSYS_TYPE_SIGNED_INT
#define UINT_TYPE DRSYS_TYPE_UNSIGNED_INT
syscall_info_t syscall_ioctl_info[] = {
// <include/asm-i386/socket.h>
{IOCTL(FIOSETOWN), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(SIOCSPGRP), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(FIOGETOWN), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SIOCGPGRP), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SIOCATMARK), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SIOCGSTAMP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct timeval), W}}},
// <include/asm-i386/termios.h>
{IOCTL(TCGETS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct termios), W}}},
{IOCTL(TCSETS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct termios), R}}},
{IOCTL(TCSETSW), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct termios ), R}}},
{IOCTL(TCSETSF), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct termios), R}}},
{IOCTL(TCGETA), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct termios), W}}},
{IOCTL(TCSETA), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct termios), R}}},
{IOCTL(TCSETAW), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct termios), R}}},
{IOCTL(TCSETAF), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct termios), R}}},
{IOCTL(TCSBRK), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(TCXONC), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(TCFLSH), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(TIOCEXCL), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(TIOCNXCL), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(TIOCSCTTY), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(TIOCGPGRP), OK, RLONG, 3, {FD_REQ, {2, sizeof(pid_t), W, INT_TYPE}}},
{IOCTL(TIOCSPGRP), OK, RLONG, 3, {FD_REQ, {2, sizeof(pid_t), R, INT_TYPE}}},
{IOCTL(TIOCOUTQ), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(TIOCSTI), OK, RLONG, 3, {FD_REQ, {2, sizeof(char), R, INT_TYPE}}},
{IOCTL(TIOCGWINSZ), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct winsize), W}}},
{IOCTL(TIOCSWINSZ), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct winsize), R}}},
{IOCTL(TIOCMGET), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(TIOCMBIS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(TIOCMBIC), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(TIOCMSET), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(TIOCGSOFTCAR), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(TIOCSSOFTCAR), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(TIOCINQ /*== FIONREAD*/), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(TIOCLINUX), OK, RLONG, 3, {FD_REQ, {2, sizeof(char), R, INT_TYPE}}}, /* FIXME: more */
{IOCTL(TIOCCONS), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(TIOCGSERIAL), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct serial_struct), W}}},
{IOCTL(TIOCSSERIAL), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct serial_struct), R}}},
{IOCTL(TIOCPKT), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(FIONBIO), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(TIOCNOTTY), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(TIOCSETD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(TIOCGETD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(TCSBRKP), OK, RLONG, 3, {FD_REQ, /* int */}},
#if 0 /* FIXME: struct not in my headers */
{IOCTL(TIOCTTYGSTRUCT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct tty_struct), W}}},
#endif
{IOCTL(FIONCLEX), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(FIOCLEX), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(FIOASYNC), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(TIOCSERCONFIG), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(TIOCSERGWILD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(TIOCSERSWILD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(TIOCGLCKTRMIOS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct termios), W}}},
{IOCTL(TIOCSLCKTRMIOS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct termios), R}}},
#if 0 /* FIXME: struct not in my headers */
{IOCTL(TIOCSERGSTRUCT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct async_struct), W}}},
#endif
{IOCTL(TIOCSERGETLSR), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(TIOCSERGETMULTI), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct serial_multiport_struct), W}}},
{IOCTL(TIOCSERSETMULTI), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct serial_multiport_struct), R}}},
// <include/linux/ax25.h>
{IOCTL(SIOCAX25GETUID), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct sockaddr_ax25), R}}},
{IOCTL(SIOCAX25ADDUID), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct sockaddr_ax25), R}}},
{IOCTL(SIOCAX25DELUID), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct sockaddr_ax25), R}}},
{IOCTL(SIOCAX25NOUID), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
#if 0 /* FIXME: define not in my headers */
{IOCTL(SIOCAX25DIGCTL), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(SIOCAX25GETPARMS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ax25_parms_struct), R|W}}},
{IOCTL(SIOCAX25SETPARMS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ax25_parms_struct), R}}},
#endif
// <include/linux/cdk.h>
{IOCTL(STL_BINTR), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(STL_BSTART), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(STL_BSTOP), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(STL_BRESET), OK, RLONG, 3, {FD_REQ, /* void */}},
// <include/linux/cdrom.h>
{IOCTL(CDROMPAUSE), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(CDROMRESUME), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(CDROMPLAYMSF), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_msf), R}}},
{IOCTL(CDROMPLAYTRKIND), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_ti), R}}},
{IOCTL(CDROMREADTOCHDR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_tochdr), W}}},
{IOCTL(CDROMREADTOCENTRY), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_tocentry), R|W}}},
{IOCTL(CDROMSTOP), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(CDROMSTART), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(CDROMEJECT), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(CDROMVOLCTRL), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_volctrl), R}}},
{IOCTL(CDROMSUBCHNL), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_subchnl), R|W}}},
{IOCTL(CDROMREADMODE2), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_msf), R}}}, /* FIXME: more */
{IOCTL(CDROMREADMODE1), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_msf), R}}}, /* FIXME: more */
{IOCTL(CDROMREADAUDIO), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_read_audio), R}}}, /* FIXME: more */
{IOCTL(CDROMEJECT_SW), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(CDROMMULTISESSION), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_multisession), R|W}}},
{IOCTL(CDROM_GET_UPC), OK, RLONG, 3, {FD_REQ, {2, sizeof(char[8]), W}}},
{IOCTL(CDROMRESET), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(CDROMVOLREAD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_volctrl), W}}},
{IOCTL(CDROMREADRAW), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_msf), R}}}, /* FIXME: more */
{IOCTL(CDROMREADCOOKED), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_msf), R}}}, /* FIXME: more */
{IOCTL(CDROMSEEK), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cdrom_msf), R}}},
// <include/linux/cm206.h>
#if 0 /* FIXME: define not in my headers */
{IOCTL(CM206CTL_GET_STAT), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(CM206CTL_GET_LAST_STAT), OK, RLONG, 3, {FD_REQ, /* int */}},
#endif
// <include/linux/cyclades.h>
#if 0 /* XXX: cycles has been removed from the kernel */
{IOCTL(CYGETMON), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct cyclades_monitor), W}}},
{IOCTL(CYGETTHRESH), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(CYSETTHRESH), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(CYGETDEFTHRESH), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(CYSETDEFTHRESH), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(CYGETTIMEOUT), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(CYSETTIMEOUT), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(CYGETDEFTIMEOUT), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(CYSETDEFTIMEOUT), OK, RLONG, 3, {FD_REQ, /* int */}},
#endif
// <include/linux/ext2_fs.h>
{IOCTL(EXT2_IOC_GETFLAGS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(EXT2_IOC_SETFLAGS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(EXT2_IOC_GETVERSION), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(EXT2_IOC_SETVERSION), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
// <include/linux/fd.h>
{IOCTL(FDCLRPRM), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(FDSETPRM), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct floppy_struct), R}}},
{IOCTL(FDDEFPRM), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct floppy_struct), R}}},
{IOCTL(FDGETPRM), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct floppy_struct), W}}},
{IOCTL(FDMSGON), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(FDMSGOFF), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(FDFMTBEG), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(FDFMTTRK), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct format_descr), R}}},
{IOCTL(FDFMTEND), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(FDSETEMSGTRESH), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(FDFLUSH), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(FDSETMAXERRS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct floppy_max_errors), R}}},
{IOCTL(FDGETMAXERRS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct floppy_max_errors), W}}},
{IOCTL(FDGETDRVTYP), OK, RLONG, 3, {FD_REQ, {2, sizeof(char[16]), W}}},
{IOCTL(FDSETDRVPRM), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct floppy_drive_params), R}}},
{IOCTL(FDGETDRVPRM), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct floppy_drive_params), W}}},
{IOCTL(FDGETDRVSTAT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct floppy_drive_struct), W}}},
{IOCTL(FDPOLLDRVSTAT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct floppy_drive_struct), W}}},
{IOCTL(FDRESET), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(FDGETFDCSTAT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct floppy_fdc_state), W}}},
{IOCTL(FDWERRORCLR), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(FDWERRORGET), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct floppy_write_errors), W}}},
{IOCTL(FDRAWCMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct floppy_raw_cmd), R|W}}}, /* FIXME: more */
{IOCTL(FDTWADDLE), OK, RLONG, 3, {FD_REQ, /* void */}},
// <include/linux/fs.h>
{IOCTL(BLKROSET), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(BLKROGET), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(BLKRRPART), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(BLKGETSIZE), OK, RLONG, 3, {FD_REQ, {2, sizeof(unsigned long), W, UINT_TYPE}}},
{IOCTL(BLKFLSBUF), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(BLKRASET), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(BLKRAGET), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(FIBMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(FIGETBSZ), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
// <include/linux/hdreg.h>
{IOCTL(HDIO_GETGEO), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct hd_geometry), W}}},
{IOCTL(HDIO_GET_UNMASKINTR), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(HDIO_GET_MULTCOUNT), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(HDIO_GET_IDENTITY), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct hd_driveid), W}}},
{IOCTL(HDIO_GET_KEEPSETTINGS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
#if 0 /* FIXME: define not in my headers */
{IOCTL(HDIO_GET_CHIPSET), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
#endif
{IOCTL(HDIO_GET_NOWERR), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(HDIO_GET_DMA), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(HDIO_DRIVE_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(HDIO_SET_MULTCOUNT), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(HDIO_SET_UNMASKINTR), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(HDIO_SET_KEEPSETTINGS), OK, RLONG, 3, {FD_REQ, /* int */}},
#if 0 /* FIXME: define not in my headers */
{IOCTL(HDIO_SET_CHIPSET), OK, RLONG, 3, {FD_REQ, /* int */}},
#endif
{IOCTL(HDIO_SET_NOWERR), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(HDIO_SET_DMA), OK, RLONG, 3, {FD_REQ, /* int */}},
#if 0 /* FIXME: having problems including header */
// <include/linux/if_eql.h>
{IOCTL(EQL_ENSLAVE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}}, /* FIXME: more */
{IOCTL(EQL_EMANCIPATE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}}, /* FIXME: more */
{IOCTL(EQL_GETSLAVECFG), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}}, /* FIXME: more */
{IOCTL(EQL_SETSLAVECFG), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}}, /* FIXME: more */
{IOCTL(EQL_GETMASTRCFG), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}}, /* FIXME: more */
{IOCTL(EQL_SETMASTRCFG), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}}, /* FIXME: more */
#endif
// <include/linux/if_plip.h>
{IOCTL(SIOCDEVPLIP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}},
#if 0 /* FIXME: having problems including header */
// <include/linux/if_ppp.h>
{IOCTL(PPPIOCGFLAGS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(PPPIOCSFLAGS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(PPPIOCGASYNCMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(PPPIOCSASYNCMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(PPPIOCGUNIT), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(PPPIOCSINPSIG), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(PPPIOCSDEBUG), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(PPPIOCGDEBUG), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(PPPIOCGSTAT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ppp_stats), W}}},
{IOCTL(PPPIOCGTIME), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ppp_ddinfo), W}}},
{IOCTL(PPPIOCGXASYNCMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct { int [8]; }), W}}},
{IOCTL(PPPIOCSXASYNCMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct { int [8]; }), R}}},
{IOCTL(PPPIOCSMRU), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(PPPIOCRASYNCMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(PPPIOCSMAXCID), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
#endif
#if 0 /* FIXME: identical to ax25 1st 3 */
// <include/linux/ipx.h>
{IOCTL(SIOCAIPXITFCRT), OK, RLONG, 3, {FD_REQ, {2, sizeof(char), R, INT_TYPE}}},
{IOCTL(SIOCAIPXPRISLT), OK, RLONG, 3, {FD_REQ, {2, sizeof(char), R, INT_TYPE}}},
{IOCTL(SIOCIPXCFGDATA), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ipx_config_data), W}}},
#endif
// <include/linux/kd.h>
{IOCTL(GIO_FONT), OK, RLONG, 3, {FD_REQ, {2, sizeof(char[8192]), W}}},
{IOCTL(PIO_FONT), OK, RLONG, 3, {FD_REQ, {2, sizeof(char[8192]), R}}},
#if 0 /* FIXME: struct not in my defines */
{IOCTL(GIO_FONTX), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct console_font_desc), R|W}}}, /* FIXME: more */
{IOCTL(PIO_FONTX), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct console_font_desc), R}}}, /* FIXME: more */
#endif
{IOCTL(GIO_CMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(char[48]), W}}},
{IOCTL(PIO_CMAP), OK, RLONG, 3, {FD_REQ, /* const struct { char [48]; } */}},
{IOCTL(KIOCSOUND), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(KDMKTONE), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(KDGETLED), OK, RLONG, 3, {FD_REQ, {2, sizeof(char), W, INT_TYPE}}},
{IOCTL(KDSETLED), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(KDGKBTYPE), OK, RLONG, 3, {FD_REQ, {2, sizeof(char), W, INT_TYPE}}},
{IOCTL(KDADDIO), OK, RLONG, 3, {FD_REQ, /* int */}}, /* FIXME: more */
{IOCTL(KDDELIO), OK, RLONG, 3, {FD_REQ, /* int */}}, /* FIXME: more */
{IOCTL(KDENABIO), OK, RLONG, 3, {FD_REQ, /* void */}}, /* FIXME: more */
{IOCTL(KDDISABIO), OK, RLONG, 3, {FD_REQ, /* void */}}, /* FIXME: more */
{IOCTL(KDSETMODE), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(KDGETMODE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(KDMAPDISP), OK, RLONG, 3, {FD_REQ, /* void */}}, /* FIXME: more */
{IOCTL(KDUNMAPDISP), OK, RLONG, 3, {FD_REQ, /* void */}}, /* FIXME: more */
{IOCTL(GIO_SCRNMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(char[E_TABSZ]), W}}},
{IOCTL(PIO_SCRNMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(char[E_TABSZ]), R}}},
{IOCTL(GIO_UNISCRNMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(short[E_TABSZ]), W}}},
{IOCTL(PIO_UNISCRNMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(short[E_TABSZ]), R}}},
{IOCTL(GIO_UNIMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct unimapdesc), R|W}}}, /* FIXME: more */
{IOCTL(PIO_UNIMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct unimapdesc), R}}}, /* FIXME: more */
{IOCTL(PIO_UNIMAPCLR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct unimapinit), R}}},
{IOCTL(KDGKBMODE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(KDSKBMODE), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(KDGKBMETA), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(KDSKBMETA), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(KDGKBLED), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(KDSKBLED), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(KDGKBENT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct kbentry), R|W}}},
{IOCTL(KDSKBENT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct kbentry), R}}},
{IOCTL(KDGKBSENT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct kbsentry), R|W}}},
{IOCTL(KDSKBSENT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct kbsentry), R}}},
{IOCTL(KDGKBDIACR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct kbdiacrs), W}}},
{IOCTL(KDSKBDIACR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct kbdiacrs), R}}},
{IOCTL(KDGETKEYCODE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct kbkeycode), R|W}}},
{IOCTL(KDSETKEYCODE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct kbkeycode), R}}},
{IOCTL(KDSIGACCEPT), OK, RLONG, 3, {FD_REQ, /* int */}},
// <include/linux/lp.h>
{IOCTL(LPCHAR), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(LPTIME), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(LPABORT), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(LPSETIRQ), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(LPGETIRQ), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(LPWAIT), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(LPCAREFUL), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(LPABORTOPEN), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(LPGETSTATUS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(LPRESET), OK, RLONG, 3, {FD_REQ, /* void */}},
#if 0 /* FIXME: define not in my headers */
{IOCTL(LPGETSTATS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct lp_stats), W}}},
#endif
#if 0 /* FIXME: identical to ax25 1st 2 */
// <include/linux/mroute.h>
{IOCTL(SIOCGETVIFCNT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct sioc_vif_req), R|W}}},
{IOCTL(SIOCGETSGCNT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct sioc_sg_req), R|W}}},
#endif
#ifndef ANDROID
// <include/linux/mtio.h>
{IOCTL(MTIOCTOP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct mtop), R}}},
{IOCTL(MTIOCGET), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct mtget), W}}},
{IOCTL(MTIOCPOS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct mtpos), W}}},
{IOCTL(MTIOCGETCONFIG), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct mtconfiginfo), W}}},
{IOCTL(MTIOCSETCONFIG), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct mtconfiginfo), R}}},
#endif
#if 0 /* FIXME: define not in my headers */
// <include/linux/netrom.h>
{IOCTL(SIOCNRGETPARMS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct nr_parms_struct), R|W}}},
{IOCTL(SIOCNRSETPARMS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct nr_parms_struct), R}}},
{IOCTL(SIOCNRDECOBS), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SIOCNRRTCTL), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
#endif
#if 0 /* FIXME: define not in my headers */
// <include/linux/sbpcd.h>
{IOCTL(DDIOCSDBG), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(CDROMAUDIOBUFSIZ), OK, RLONG, 3, {FD_REQ, /* int */}},
#endif
#if 0 /* FIXME: define not in my headers */
// <include/linux/scc.h>
{IOCTL(TIOCSCCINI), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(TIOCCHANINI), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct scc_modem), R}}},
{IOCTL(TIOCGKISS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ioctl_command), R|W}}},
{IOCTL(TIOCSKISS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ioctl_command), R}}},
{IOCTL(TIOCSCCSTAT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct scc_stat), W}}},
#endif
#if 0 /* FIXME: define not in my headers */
// <include/linux/scsi.h>
{IOCTL(SCSI_IOCTL_GET_IDLUN), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct { int [2]; }), W}}},
{IOCTL(SCSI_IOCTL_TAGGED_ENABLE), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SCSI_IOCTL_TAGGED_DISABLE), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SCSI_IOCTL_PROBE_HOST), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}}, /* FIXME: more */
#endif
// <include/linux/smb_fs.h>
{IOCTL(SMB_IOC_GETMOUNTUID), OK, RLONG, 3, {FD_REQ, {2, sizeof(uid_t), W, UINT_TYPE}}},
// <include/linux/sockios.h>
{IOCTL(SIOCADDRT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct rtentry), R}}}, /* FIXME: more */
{IOCTL(SIOCDELRT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct rtentry), R}}}, /* FIXME: more */
{IOCTL(SIOCGIFCONF), OK, RLONG, 3, {FD_REQ, /* handled manually */}},
{IOCTL(SIOCGIFNAME), OK, RLONG, 3, {FD_REQ, /* char [] */}},
{IOCTL(SIOCSIFLINK), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SIOCGIFFLAGS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}},
{IOCTL(SIOCSIFFLAGS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R}}},
{IOCTL(SIOCGIFADDR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}},
{IOCTL(SIOCSIFADDR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R}}},
{IOCTL(SIOCGIFDSTADDR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}},
{IOCTL(SIOCSIFDSTADDR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R}}},
{IOCTL(SIOCGIFBRDADDR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}},
{IOCTL(SIOCSIFBRDADDR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R}}},
{IOCTL(SIOCGIFNETMASK), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}},
{IOCTL(SIOCSIFNETMASK), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R}}},
{IOCTL(SIOCGIFMETRIC), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}},
{IOCTL(SIOCSIFMETRIC), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R}}},
{IOCTL(SIOCGIFMEM), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}},
{IOCTL(SIOCSIFMEM), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R}}},
{IOCTL(SIOCGIFMTU), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}},
{IOCTL(SIOCSIFMTU), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R}}},
#if 0 /* FIXME: define not in my headers */
{IOCTL(OLD_SIOCGIFHWADDR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}},
#endif
{IOCTL(SIOCSIFHWADDR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R}}}, /* FIXME: more */
{IOCTL(SIOCGIFENCAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SIOCSIFENCAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(SIOCGIFHWADDR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}},
{IOCTL(SIOCGIFSLAVE), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SIOCSIFSLAVE), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SIOCADDMULTI), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R}}},
{IOCTL(SIOCDELMULTI), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R}}},
#if 0 /* FIXME: define not in my headers */
{IOCTL(SIOCADDRTOLD), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SIOCDELRTOLD), OK, RLONG, 3, {FD_REQ, /* void */}},
#endif
{IOCTL(SIOCDARP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct arpreq), R}}},
{IOCTL(SIOCGARP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct arpreq), R|W}}},
{IOCTL(SIOCSARP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct arpreq), R}}},
{IOCTL(SIOCDRARP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct arpreq), R}}},
{IOCTL(SIOCGRARP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct arpreq), R|W}}},
{IOCTL(SIOCSRARP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct arpreq), R}}},
{IOCTL(SIOCGIFMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R|W}}},
{IOCTL(SIOCSIFMAP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ifreq), R}}},
// <include/linux/soundcard.h>
{IOCTL(SNDCTL_SEQ_RESET), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SNDCTL_SEQ_SYNC), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SNDCTL_SYNTH_INFO), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct synth_info), R|W}}},
{IOCTL(SNDCTL_SEQ_CTRLRATE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SNDCTL_SEQ_GETOUTCOUNT), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SNDCTL_SEQ_GETINCOUNT), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SNDCTL_SEQ_PERCMODE), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SNDCTL_FM_LOAD_INSTR), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct sbi_instrument), R}}},
{IOCTL(SNDCTL_SEQ_TESTMIDI), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(SNDCTL_SEQ_RESETSAMPLES), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(SNDCTL_SEQ_NRSYNTHS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SNDCTL_SEQ_NRMIDIS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SNDCTL_MIDI_INFO), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct midi_info), R|W}}},
{IOCTL(SNDCTL_SEQ_THRESHOLD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(SNDCTL_SYNTH_MEMAVL), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SNDCTL_FM_4OP_ENABLE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
#if 0 /* FIXME: define not in my headers */
{IOCTL(SNDCTL_PMGR_ACCESS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct patmgr_info), R|W}}},
#endif
{IOCTL(SNDCTL_SEQ_PANIC), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SNDCTL_SEQ_OUTOFBAND), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct seq_event_rec), R}}},
{IOCTL(SNDCTL_TMR_TIMEBASE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
#if 0 /* FIXME: identical to TCSETS and subsequent 2 */
{IOCTL(SNDCTL_TMR_START), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SNDCTL_TMR_STOP), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SNDCTL_TMR_CONTINUE), OK, RLONG, 3, {FD_REQ, /* void */}},
#endif
{IOCTL(SNDCTL_TMR_TEMPO), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SNDCTL_TMR_SOURCE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SNDCTL_TMR_METRONOME), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(SNDCTL_TMR_SELECT), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
#if 0 /* FIXME: define not in my headers */
{IOCTL(SNDCTL_PMGR_IFACE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct patmgr_info), R|W}}},
#endif
{IOCTL(SNDCTL_MIDI_PRETIME), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SNDCTL_MIDI_MPUMODE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
#if 0 /* FIXME: struct not in my headers */
{IOCTL(SNDCTL_MIDI_MPUCMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct mpu_command_rec), R|W}}},
#endif
{IOCTL(SNDCTL_DSP_RESET), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SNDCTL_DSP_SYNC), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SNDCTL_DSP_SPEED), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SNDCTL_DSP_STEREO), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SNDCTL_DSP_GETBLKSIZE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_PCM_WRITE_CHANNELS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_PCM_WRITE_FILTER), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SNDCTL_DSP_POST), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SNDCTL_DSP_SUBDIVIDE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SNDCTL_DSP_SETFRAGMENT), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SNDCTL_DSP_GETFMTS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SNDCTL_DSP_SETFMT), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SNDCTL_DSP_GETOSPACE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct audio_buf_info), W}}},
{IOCTL(SNDCTL_DSP_GETISPACE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct audio_buf_info), W}}},
{IOCTL(SNDCTL_DSP_NONBLOCK), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SOUND_PCM_READ_RATE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_PCM_READ_CHANNELS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_PCM_READ_BITS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_PCM_READ_FILTER), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SNDCTL_COPR_RESET), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(SNDCTL_COPR_LOAD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct copr_buffer), R}}},
{IOCTL(SNDCTL_COPR_RDATA), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct copr_debug_buf), R|W}}},
{IOCTL(SNDCTL_COPR_RCODE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct copr_debug_buf), R|W}}},
{IOCTL(SNDCTL_COPR_WDATA), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct copr_debug_buf), R}}},
{IOCTL(SNDCTL_COPR_WCODE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct copr_debug_buf), R}}},
{IOCTL(SNDCTL_COPR_RUN), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct copr_debug_buf), R|W}}},
{IOCTL(SNDCTL_COPR_HALT), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct copr_debug_buf), R|W}}},
{IOCTL(SNDCTL_COPR_SENDMSG), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct copr_msg), R}}},
{IOCTL(SNDCTL_COPR_RCVMSG), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct copr_msg), W}}},
{IOCTL(SOUND_MIXER_READ_VOLUME), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_BASS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_TREBLE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_SYNTH), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_PCM), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_SPEAKER), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_LINE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_MIC), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_CD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_IMIX), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_ALTPCM), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_RECLEV), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_IGAIN), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_OGAIN), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_LINE1), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_LINE2), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_LINE3), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_MUTE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
#if 0 /* FIXME: identical to SOUND_MIXER_READ_MUTE */
{IOCTL(SOUND_MIXER_READ_ENHANCE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_LOUD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
#endif
{IOCTL(SOUND_MIXER_READ_RECSRC), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_DEVMASK), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_RECMASK), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_STEREODEVS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_READ_CAPS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_VOLUME), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_BASS), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_TREBLE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_SYNTH), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_PCM), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_SPEAKER), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_LINE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_MIC), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_CD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_IMIX), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_ALTPCM), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_RECLEV), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_IGAIN), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_OGAIN), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_LINE1), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_LINE2), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_LINE3), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_MUTE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
#if 0 /* FIXME: identical to SOUND_MIXER_WRITE_MUTE */
{IOCTL(SOUND_MIXER_WRITE_ENHANCE), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
{IOCTL(SOUND_MIXER_WRITE_LOUD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
#endif
{IOCTL(SOUND_MIXER_WRITE_RECSRC), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R|W, INT_TYPE}}},
#if 0 /* FIXME: define not in my headers */
// <include/linux/umsdos_fs.h>
{IOCTL(UMSDOS_READDIR_DOS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct umsdos_ioctl), R|W}}},
{IOCTL(UMSDOS_UNLINK_DOS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct umsdos_ioctl), R}}},
{IOCTL(UMSDOS_RMDIR_DOS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct umsdos_ioctl), R}}},
{IOCTL(UMSDOS_STAT_DOS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct umsdos_ioctl), R|W}}},
{IOCTL(UMSDOS_CREAT_EMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct umsdos_ioctl), R}}},
{IOCTL(UMSDOS_UNLINK_EMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct umsdos_ioctl), R}}},
{IOCTL(UMSDOS_READDIR_EMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct umsdos_ioctl), R|W}}},
{IOCTL(UMSDOS_GETVERSION), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct umsdos_ioctl), W}}},
{IOCTL(UMSDOS_INIT_EMD), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(UMSDOS_DOS_SETUP), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct umsdos_ioctl), R}}},
{IOCTL(UMSDOS_RENAME_DOS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct umsdos_ioctl), R}}},
#endif
// <include/linux/vt.h>
{IOCTL(VT_OPENQRY), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(VT_GETMODE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct vt_mode), W}}},
{IOCTL(VT_SETMODE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct vt_mode), R}}},
{IOCTL(VT_GETSTATE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct vt_stat), W}}},
{IOCTL(VT_SENDSIG), OK, RLONG, 3, {FD_REQ, /* void */}},
{IOCTL(VT_RELDISP), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(VT_ACTIVATE), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(VT_WAITACTIVE), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(VT_DISALLOCATE), OK, RLONG, 3, {FD_REQ, /* int */}},
{IOCTL(VT_RESIZE), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct vt_sizes), R}}},
{IOCTL(VT_RESIZEX), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct vt_consize), R}}},
/* include <linux/ipmi.h> PR 531644 */
{IOCTL(IPMICTL_SEND_COMMAND), OK, RLONG, 3, {FD_REQ, /* handled manually */}},
{IOCTL(IPMICTL_SEND_COMMAND_SETTIME), OK, RLONG, 3, {FD_REQ, /* handled manually */}},
{IOCTL(IPMICTL_RECEIVE_MSG), OK, RLONG, 3, {FD_REQ, /* handled manually */}},
{IOCTL(IPMICTL_RECEIVE_MSG_TRUNC), OK, RLONG, 3, {FD_REQ, /* handled manually */}},
{IOCTL(IPMICTL_REGISTER_FOR_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ipmi_cmdspec), R}}},
{IOCTL(IPMICTL_UNREGISTER_FOR_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ipmi_cmdspec), R}}},
{IOCTL(IPMICTL_REGISTER_FOR_CMD_CHANS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ipmi_cmdspec_chans), R}}},
{IOCTL(IPMICTL_UNREGISTER_FOR_CMD_CHANS), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ipmi_cmdspec_chans), R}}},
{IOCTL(IPMICTL_SET_GETS_EVENTS_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
{IOCTL(IPMICTL_SET_MY_CHANNEL_ADDRESS_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ipmi_channel_lun_address_set), R}}},
{IOCTL(IPMICTL_GET_MY_CHANNEL_ADDRESS_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ipmi_channel_lun_address_set), W}}},
{IOCTL(IPMICTL_SET_MY_CHANNEL_LUN_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ipmi_channel_lun_address_set), R}}},
{IOCTL(IPMICTL_GET_MY_CHANNEL_LUN_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ipmi_channel_lun_address_set), W}}},
{IOCTL(IPMICTL_SET_MY_ADDRESS_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(uint), R, UINT_TYPE}}},
{IOCTL(IPMICTL_GET_MY_ADDRESS_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(uint), W, UINT_TYPE}}},
{IOCTL(IPMICTL_SET_MY_LUN_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(uint), R, UINT_TYPE}}},
{IOCTL(IPMICTL_GET_MY_LUN_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(uint), W, UINT_TYPE}}},
{IOCTL(IPMICTL_SET_TIMING_PARMS_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ipmi_timing_parms), R}}},
{IOCTL(IPMICTL_GET_TIMING_PARMS_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(struct ipmi_timing_parms), W}}},
{IOCTL(IPMICTL_GET_MAINTENANCE_MODE_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), W, INT_TYPE}}},
{IOCTL(IPMICTL_SET_MAINTENANCE_MODE_CMD), OK, RLONG, 3, {FD_REQ, {2, sizeof(int), R, INT_TYPE}}},
};
size_t count_syscall_ioctl_info = BUFFER_SIZE_ELEMENTS(syscall_ioctl_info);