1 1.15 thorpej /* $NetBSD: linux32_ioctl.c,v 1.15 2021/09/19 23:51:37 thorpej Exp $ */ 2 1.1 manu 3 1.1 manu /*- 4 1.1 manu * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved. 5 1.1 manu * 6 1.1 manu * Redistribution and use in source and binary forms, with or without 7 1.1 manu * modification, are permitted provided that the following conditions 8 1.1 manu * are met: 9 1.1 manu * 1. Redistributions of source code must retain the above copyright 10 1.1 manu * notice, this list of conditions and the following disclaimer. 11 1.1 manu * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 manu * notice, this list of conditions and the following disclaimer in the 13 1.1 manu * documentation and/or other materials provided with the distribution. 14 1.1 manu * 3. All advertising materials mentioning features or use of this software 15 1.1 manu * must display the following acknowledgement: 16 1.1 manu * This product includes software developed by Emmanuel Dreyfus 17 1.1 manu * 4. The name of the author may not be used to endorse or promote 18 1.1 manu * products derived from this software without specific prior written 19 1.1 manu * permission. 20 1.1 manu * 21 1.1 manu * THIS SOFTWARE IS PROVIDED BY THE THE AUTHOR AND CONTRIBUTORS ``AS IS'' 22 1.1 manu * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 23 1.1 manu * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 1.1 manu * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS 25 1.1 manu * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 1.1 manu * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 1.1 manu * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 1.1 manu * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 1.1 manu * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 1.1 manu * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 1.1 manu * POSSIBILITY OF SUCH DAMAGE. 32 1.1 manu */ 33 1.1 manu 34 1.1 manu #include <sys/cdefs.h> 35 1.15 thorpej __KERNEL_RCSID(0, "$NetBSD: linux32_ioctl.c,v 1.15 2021/09/19 23:51:37 thorpej Exp $"); 36 1.1 manu 37 1.1 manu #include <sys/types.h> 38 1.1 manu #include <sys/param.h> 39 1.1 manu #include <sys/time.h> 40 1.1 manu #include <sys/ucred.h> 41 1.13 christos #include <sys/ioctl.h> 42 1.15 thorpej #include <sys/file.h> 43 1.15 thorpej #include <sys/filedesc.h> 44 1.1 manu 45 1.1 manu #include <compat/netbsd32/netbsd32.h> 46 1.1 manu #include <compat/netbsd32/netbsd32_syscallargs.h> 47 1.1 manu 48 1.1 manu #include <compat/linux/common/linux_types.h> 49 1.1 manu #include <compat/linux/common/linux_signal.h> 50 1.12 ad #include <compat/linux/common/linux_ipc.h> 51 1.15 thorpej #include <compat/linux/common/linux_ioctl.h> 52 1.12 ad #include <compat/linux/common/linux_sem.h> 53 1.1 manu #include <compat/linux/linux_syscallargs.h> 54 1.1 manu 55 1.1 manu #include <compat/linux32/common/linux32_types.h> 56 1.1 manu #include <compat/linux32/common/linux32_signal.h> 57 1.2 manu #include <compat/linux32/common/linux32_ioctl.h> 58 1.2 manu #include <compat/linux32/common/linux32_termios.h> 59 1.1 manu #include <compat/linux32/common/linux32_sysctl.h> 60 1.1 manu #include <compat/linux32/linux32_syscallargs.h> 61 1.1 manu 62 1.10 jmcneill #include <compat/ossaudio/ossaudio.h> 63 1.10 jmcneill #include <compat/ossaudio/ossaudiovar.h> 64 1.10 jmcneill 65 1.1 manu int 66 1.9 dsl linux32_sys_ioctl(struct lwp *l, const struct linux32_sys_ioctl_args *uap, register_t *retval) 67 1.1 manu { 68 1.9 dsl /* { 69 1.1 manu syscallarg(int) fd; 70 1.1 manu syscallarg(netbsd32_u_long) com; 71 1.1 manu syscallarg(netbsd32_charp) data; 72 1.9 dsl } */ 73 1.10 jmcneill struct oss_sys_ioctl_args ossuap; 74 1.2 manu int group; 75 1.2 manu int error; 76 1.2 manu 77 1.2 manu group = LINUX32_IOCGROUP((int)SCARG(uap, com)); 78 1.1 manu 79 1.4 manu #ifdef DEBUG_LINUX 80 1.1 manu printf("linux32_sys_ioctl(%d, 0x%x/\'%c\', %p)\n", SCARG(uap, fd), 81 1.7 dsl SCARG(uap, com), (char)group, SCARG_P32(uap, data)); 82 1.4 manu #endif 83 1.2 manu 84 1.2 manu switch(group) { 85 1.2 manu case 'T': 86 1.15 thorpej { 87 1.15 thorpej /* 88 1.15 thorpej * Termios, the MIDI sequencer, and timerfd use 'T' to 89 1.15 thorpej * identify the ioctl, so we have to differentiate them 90 1.15 thorpej * in another way. 91 1.15 thorpej * 92 1.15 thorpej * (XXX We don't bother with MIDI here.) 93 1.15 thorpej */ 94 1.15 thorpej struct file *fp; 95 1.15 thorpej 96 1.15 thorpej if ((fp = fd_getfile(SCARG(uap, fd))) == NULL) 97 1.15 thorpej return EBADF; 98 1.15 thorpej 99 1.15 thorpej if (fp->f_type == DTYPE_TIMERFD) { 100 1.15 thorpej struct linux_sys_ioctl_args ua; 101 1.15 thorpej SCARG(&ua, fd) = SCARG(uap, fd); 102 1.15 thorpej SCARG(&ua, com) = SCARG(uap, com); 103 1.15 thorpej SCARG(&ua, data) = SCARG_P32(uap, data); 104 1.15 thorpej error = linux_ioctl_timerfd(l, &ua, retval); 105 1.15 thorpej } else { 106 1.15 thorpej error = linux32_ioctl_termios(l, uap, retval); 107 1.15 thorpej } 108 1.15 thorpej fd_putfile(SCARG(uap, fd)); 109 1.2 manu break; 110 1.15 thorpej } 111 1.10 jmcneill case 'M': 112 1.10 jmcneill case 'Q': 113 1.10 jmcneill case 'P': 114 1.10 jmcneill SCARG(&ossuap, fd) = SCARG(uap, fd); 115 1.10 jmcneill SCARG(&ossuap, com) = (u_long)SCARG(uap, com); 116 1.10 jmcneill SCARG(&ossuap, data) = SCARG_P32(uap, data); 117 1.10 jmcneill switch (group) { 118 1.10 jmcneill case 'M': 119 1.10 jmcneill error = oss_ioctl_mixer(l, &ossuap, retval); 120 1.10 jmcneill break; 121 1.10 jmcneill case 'Q': 122 1.10 jmcneill error = oss_ioctl_sequencer(l, &ossuap, retval); 123 1.10 jmcneill break; 124 1.10 jmcneill case 'P': 125 1.10 jmcneill error = oss_ioctl_audio(l, &ossuap, retval); 126 1.10 jmcneill break; 127 1.10 jmcneill default: 128 1.10 jmcneill error = EINVAL; /* shutup gcc */ 129 1.10 jmcneill break; 130 1.10 jmcneill } 131 1.10 jmcneill break; 132 1.13 christos case 'V': /* video4linux2 */ 133 1.13 christos case 'd': /* drm */ 134 1.13 christos { 135 1.13 christos struct sys_ioctl_args ua; 136 1.13 christos u_long com = 0; 137 1.13 christos if (SCARG(uap, com) & IOC_IN) 138 1.13 christos com |= IOC_OUT; 139 1.13 christos if (SCARG(uap, com) & IOC_OUT) 140 1.13 christos com |= IOC_IN; 141 1.13 christos SCARG(&ua, fd) = SCARG(uap, fd); 142 1.13 christos SCARG(&ua, com) = SCARG(uap, com); 143 1.13 christos SCARG(&ua, com) &= ~IOC_DIRMASK; 144 1.13 christos SCARG(&ua, com) |= com; 145 1.13 christos SCARG(&ua, data) = SCARG_P32(uap, data); 146 1.13 christos error = sys_ioctl(l, (const void *)&ua, retval); 147 1.13 christos break; 148 1.13 christos } 149 1.11 christos case 0x89: 150 1.11 christos error = linux32_ioctl_socket(l, uap, retval); 151 1.3 manu break; 152 1.2 manu default: 153 1.14 maxv #ifdef DEBUG_LINUX 154 1.2 manu printf("Not yet implemented ioctl group \'%c\'\n", group); 155 1.14 maxv #endif 156 1.2 manu error = EINVAL; 157 1.2 manu break; 158 1.2 manu } 159 1.2 manu 160 1.2 manu if (error == EPASSTHROUGH) 161 1.2 manu error = EINVAL; 162 1.1 manu 163 1.2 manu return error; 164 1.1 manu } 165