From owner-freebsd-multimedia Wed Nov 22 22:37:28 2000 Delivered-To: freebsd-multimedia@freebsd.org Received: from sm4.texas.rr.com (unknown [24.93.35.211]) by hub.freebsd.org (Postfix) with ESMTP id 3A95437B479 for ; Wed, 22 Nov 2000 22:36:33 -0800 (PST) Received: from bloop.craftncomp.com (cs2777-164.houston.rr.com [24.27.77.164]) by sm4.texas.rr.com (8.10.1/8.10.1) with ESMTP id eAN6aTQ20059; Thu, 23 Nov 2000 00:36:29 -0600 Received: from bloop.craftncomp.com (localhost.craftncomp.com [127.0.0.1]) by bloop.craftncomp.com (8.11.0/8.9.3) with ESMTP id eAN553G15445; Wed, 22 Nov 2000 23:05:03 -0600 (CST) (envelope-from shocking@bloop.craftncomp.com) Message-Id: <200011230505.eAN553G15445@bloop.craftncomp.com> X-Mailer: exmh version 2.2 06/23/2000 with nmh-1.0.4 To: Steve Reid Cc: freebsd-multimedia@FreeBSD.ORG Subject: Re: XF86-4, Linux binaries, DRI? In-Reply-To: Message from Steve Reid of "Wed, 22 Nov 2000 15:53:18 PST." <20001122155318.A11020@grok> Reply-To: shocking@houston.rr.com Mime-Version: 1.0 Content-Type: multipart/mixed ; boundary="==_Exmh_-15466650710" Date: Wed, 22 Nov 2000 23:05:02 -0600 From: Stephen Hocking Sender: owner-freebsd-multimedia@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org This is a multipart MIME message. --==_Exmh_-15466650710 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable OK, I've been there and done that. I'm sending you my linux_ioctl.c and = linux_ioctl.h which should help out. Bear in mind I'm running a system wh= ich = is currently pre_SMPng, so these may or may not work directly (i.e. may n= eed = some twiddling). They belong in /sys/compat/linux if you're running curre= nt, else /sys/i386/linux. Note that I'm running pre_SMPng current. = = Stephen = --==_Exmh_-15466650710 Content-Type: text/plain ; name="linux_ioctl.c"; charset=iso-8859-1 Content-Description: linux_ioctl.c Content-Disposition: attachment; filename="linux_ioctl.c" Content-Transfer-Encoding: quoted-printable /* * Copyright (c) 1994-1995 S=F8ren Schmidt * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer * in this position and unchanged. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the= * documentation and/or other materials provided with the distribution= =2E * 3. The name of the author may not be used to endorse or promote produc= ts * derived from this software withough specific prior written permissi= on * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANT= IES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED= =2E * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, B= UT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF U= SE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE = OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.54 2000/08/22 01:28:3= 6 marcel Exp $ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static linux_ioctl_function_t linux_ioctl_cdrom; static linux_ioctl_function_t linux_ioctl_console; static linux_ioctl_function_t linux_ioctl_disk; static linux_ioctl_function_t linux_ioctl_socket; static linux_ioctl_function_t linux_ioctl_sound; static linux_ioctl_function_t linux_ioctl_termio; static linux_ioctl_function_t linux_ioctl_drm; static struct linux_ioctl_handler cdrom_handler =3D { linux_ioctl_cdrom, LINUX_IOCTL_CDROM_MIN, LINUX_IOCTL_CDROM_MAX }; static struct linux_ioctl_handler console_handler =3D { linux_ioctl_console, LINUX_IOCTL_CONSOLE_MIN, LINUX_IOCTL_CONSOLE_MAX }= ; static struct linux_ioctl_handler disk_handler =3D { linux_ioctl_disk, LINUX_IOCTL_DISK_MIN, LINUX_IOCTL_DISK_MAX }; static struct linux_ioctl_handler socket_handler =3D { linux_ioctl_socket, LINUX_IOCTL_SOCKET_MIN, LINUX_IOCTL_SOCKET_MAX }; static struct linux_ioctl_handler sound_handler =3D { linux_ioctl_sound, LINUX_IOCTL_SOUND_MIN, LINUX_IOCTL_SOUND_MAX }; static struct linux_ioctl_handler termio_handler =3D { linux_ioctl_termio, LINUX_IOCTL_TERMIO_MIN, LINUX_IOCTL_TERMIO_MAX }; static struct linux_ioctl_handler drm_handler =3D { linux_ioctl_drm, LINUX_IOCTL_DRM_MIN, LINUX_IOCTL_DRM_MAX }; DATA_SET(linux_ioctl_handler_set, cdrom_handler); DATA_SET(linux_ioctl_handler_set, console_handler); DATA_SET(linux_ioctl_handler_set, disk_handler); DATA_SET(linux_ioctl_handler_set, socket_handler); DATA_SET(linux_ioctl_handler_set, sound_handler); DATA_SET(linux_ioctl_handler_set, termio_handler); DATA_SET(linux_ioctl_handler_set, drm_handler); struct handler_element = { TAILQ_ENTRY(handler_element) list; int (*func)(struct proc *, struct linux_ioctl_args *); int low, high, span; }; static TAILQ_HEAD(, handler_element) handlers =3D TAILQ_HEAD_INITIALIZER(handlers); static int linux_ioctl_disk(struct proc *p, struct linux_ioctl_args *args) { struct file *fp =3D p->p_fd->fd_ofiles[args->fd]; int error; struct disklabel dl; switch (args->cmd & 0xffff) { case LINUX_BLKGETSIZE: error =3D fo_ioctl(fp, DIOCGDINFO, (caddr_t)&dl, p); if (error) return (error); return copyout(&(dl.d_secperunit), (caddr_t)args->arg, sizeof(dl.d_secp= erunit)); break; } return (ENOIOCTL); } /* * termio related ioctls */ struct linux_termio { unsigned short c_iflag; unsigned short c_oflag; unsigned short c_cflag; unsigned short c_lflag; unsigned char c_line; unsigned char c_cc[LINUX_NCC]; }; struct linux_termios { unsigned int c_iflag; unsigned int c_oflag; unsigned int c_cflag; unsigned int c_lflag; unsigned char c_line; unsigned char c_cc[LINUX_NCCS]; }; struct linux_winsize { unsigned short ws_row, ws_col; unsigned short ws_xpixel, ws_ypixel; }; static struct speedtab sptab[] =3D { { B0, LINUX_B0 }, { B50, LINUX_B50 }, { B75, LINUX_B75 }, { B110, LINUX_B110 }, { B134, LINUX_B134 }, { B150, LINUX_B150 }, { B200, LINUX_B200 }, { B300, LINUX_B300 }, { B600, LINUX_B600 }, { B1200, LINUX_B1200 }, { B1800, LINUX_B1800 }, { B2400, LINUX_B2400 }, { B4800, LINUX_B4800 }, { B9600, LINUX_B9600 }, { B19200, LINUX_B19200 }, { B38400, LINUX_B38400 }, { B57600, LINUX_B57600 }, { B115200, LINUX_B115200 }, {-1, -1 } }; struct linux_serial_struct { int type; int line; int port; int irq; int flags; int xmit_fifo_size; int custom_divisor; int baud_base; unsigned short close_delay; char reserved_char[2]; int hub6; unsigned short closing_wait; unsigned short closing_wait2; int reserved[4]; }; static int linux_to_bsd_speed(int code, struct speedtab *table) { for ( ; table->sp_code !=3D -1; table++) if (table->sp_code =3D=3D code) return (table->sp_speed); return -1; } static int bsd_to_linux_speed(int speed, struct speedtab *table) { for ( ; table->sp_speed !=3D -1; table++) if (table->sp_speed =3D=3D speed) return (table->sp_code); return -1; } static void bsd_to_linux_termios(struct termios *bios, struct linux_termios *lios) { int i; #ifdef DEBUG printf("LINUX: BSD termios structure (input):\n"); printf("i=3D%08x o=3D%08x c=3D%08x l=3D%08x ispeed=3D%d ospeed=3D%d\n", bios->c_iflag, bios->c_oflag, bios->c_cflag, bios->c_lflag, bios->c_ispeed, bios->c_ospeed); printf("c_cc "); for (i=3D0; ic_cc[i]); printf("\n"); #endif lios->c_iflag =3D 0; if (bios->c_iflag & IGNBRK) lios->c_iflag |=3D LINUX_IGNBRK; if (bios->c_iflag & BRKINT) lios->c_iflag |=3D LINUX_BRKINT; if (bios->c_iflag & IGNPAR) lios->c_iflag |=3D LINUX_IGNPAR; if (bios->c_iflag & PARMRK) lios->c_iflag |=3D LINUX_PARMRK; if (bios->c_iflag & INPCK) lios->c_iflag |=3D LINUX_INPCK; if (bios->c_iflag & ISTRIP) lios->c_iflag |=3D LINUX_ISTRIP; if (bios->c_iflag & INLCR) lios->c_iflag |=3D LINUX_INLCR; if (bios->c_iflag & IGNCR) lios->c_iflag |=3D LINUX_IGNCR; if (bios->c_iflag & ICRNL) lios->c_iflag |=3D LINUX_ICRNL; if (bios->c_iflag & IXON) lios->c_iflag |=3D LINUX_IXON; if (bios->c_iflag & IXANY) lios->c_iflag |=3D LINUX_IXANY; if (bios->c_iflag & IXOFF) lios->c_iflag |=3D LINUX_IXOFF; if (bios->c_iflag & IMAXBEL) lios->c_iflag |=3D LINUX_IMAXBEL; lios->c_oflag =3D 0; if (bios->c_oflag & OPOST) lios->c_oflag |=3D LINUX_OPOST; if (bios->c_oflag & ONLCR) lios->c_oflag |=3D LINUX_ONLCR; if (bios->c_oflag & OXTABS) lios->c_oflag |=3D LINUX_XTABS; lios->c_cflag =3D bsd_to_linux_speed(bios->c_ispeed, sptab); lios->c_cflag |=3D (bios->c_cflag & CSIZE) >> 4; if (bios->c_cflag & CSTOPB) lios->c_cflag |=3D LINUX_CSTOPB; if (bios->c_cflag & CREAD) lios->c_cflag |=3D LINUX_CREAD; if (bios->c_cflag & PARENB) lios->c_cflag |=3D LINUX_PARENB; if (bios->c_cflag & PARODD) lios->c_cflag |=3D LINUX_PARODD; if (bios->c_cflag & HUPCL) lios->c_cflag |=3D LINUX_HUPCL; if (bios->c_cflag & CLOCAL) lios->c_cflag |=3D LINUX_CLOCAL; if (bios->c_cflag & CRTSCTS) lios->c_cflag |=3D LINUX_CRTSCTS; lios->c_lflag =3D 0; if (bios->c_lflag & ISIG) lios->c_lflag |=3D LINUX_ISIG; if (bios->c_lflag & ICANON) lios->c_lflag |=3D LINUX_ICANON; if (bios->c_lflag & ECHO) lios->c_lflag |=3D LINUX_ECHO; if (bios->c_lflag & ECHOE) lios->c_lflag |=3D LINUX_ECHOE; if (bios->c_lflag & ECHOK) lios->c_lflag |=3D LINUX_ECHOK; if (bios->c_lflag & ECHONL) lios->c_lflag |=3D LINUX_ECHONL; if (bios->c_lflag & NOFLSH) lios->c_lflag |=3D LINUX_NOFLSH; if (bios->c_lflag & TOSTOP) lios->c_lflag |=3D LINUX_TOSTOP; if (bios->c_lflag & ECHOCTL) lios->c_lflag |=3D LINUX_ECHOCTL; if (bios->c_lflag & ECHOPRT) lios->c_lflag |=3D LINUX_ECHOPRT; if (bios->c_lflag & ECHOKE) lios->c_lflag |=3D LINUX_ECHOKE; if (bios->c_lflag & FLUSHO) lios->c_lflag |=3D LINUX_FLUSHO; if (bios->c_lflag & PENDIN) lios->c_lflag |=3D LINUX_PENDIN; if (bios->c_lflag & IEXTEN) lios->c_lflag |=3D LINUX_IEXTEN; for (i=3D0; ic_cc[i] =3D LINUX_POSIX_VDISABLE; lios->c_cc[LINUX_VINTR] =3D bios->c_cc[VINTR]; lios->c_cc[LINUX_VQUIT] =3D bios->c_cc[VQUIT]; lios->c_cc[LINUX_VERASE] =3D bios->c_cc[VERASE]; lios->c_cc[LINUX_VKILL] =3D bios->c_cc[VKILL]; lios->c_cc[LINUX_VEOF] =3D bios->c_cc[VEOF]; lios->c_cc[LINUX_VEOL] =3D bios->c_cc[VEOL]; lios->c_cc[LINUX_VMIN] =3D bios->c_cc[VMIN]; lios->c_cc[LINUX_VTIME] =3D bios->c_cc[VTIME]; lios->c_cc[LINUX_VEOL2] =3D bios->c_cc[VEOL2]; lios->c_cc[LINUX_VSUSP] =3D bios->c_cc[VSUSP]; lios->c_cc[LINUX_VSTART] =3D bios->c_cc[VSTART]; lios->c_cc[LINUX_VSTOP] =3D bios->c_cc[VSTOP]; lios->c_cc[LINUX_VREPRINT] =3D bios->c_cc[VREPRINT]; lios->c_cc[LINUX_VDISCARD] =3D bios->c_cc[VDISCARD]; lios->c_cc[LINUX_VWERASE] =3D bios->c_cc[VWERASE]; lios->c_cc[LINUX_VLNEXT] =3D bios->c_cc[VLNEXT]; for (i=3D0; ic_cc[i] =3D=3D _POSIX_VDISABLE) lios->c_cc[i] =3D LINUX_POSIX_VDISABLE; } lios->c_line =3D 0; #ifdef DEBUG printf("LINUX: LINUX termios structure (output):\n"); printf("i=3D%08x o=3D%08x c=3D%08x l=3D%08x line=3D%d\n", lios->c_iflag,= lios->c_oflag, lios->c_cflag, lios->c_lflag, (int)lios->c_line); printf("c_cc "); for (i=3D0; ic_cc[i]); printf("\n"); #endif } static void linux_to_bsd_termios(struct linux_termios *lios, struct termios *bios) { int i; #ifdef DEBUG printf("LINUX: LINUX termios structure (input):\n"); printf("i=3D%08x o=3D%08x c=3D%08x l=3D%08x line=3D%d\n", lios->c_iflag,= lios->c_oflag, lios->c_cflag, lios->c_lflag, (int)lios->c_line); printf("c_cc "); for (i=3D0; ic_cc[i]); printf("\n"); #endif bios->c_iflag =3D 0; if (lios->c_iflag & LINUX_IGNBRK) bios->c_iflag |=3D IGNBRK; if (lios->c_iflag & LINUX_BRKINT) bios->c_iflag |=3D BRKINT; if (lios->c_iflag & LINUX_IGNPAR) bios->c_iflag |=3D IGNPAR; if (lios->c_iflag & LINUX_PARMRK) bios->c_iflag |=3D PARMRK; if (lios->c_iflag & LINUX_INPCK) bios->c_iflag |=3D INPCK; if (lios->c_iflag & LINUX_ISTRIP) bios->c_iflag |=3D ISTRIP; if (lios->c_iflag & LINUX_INLCR) bios->c_iflag |=3D INLCR; if (lios->c_iflag & LINUX_IGNCR) bios->c_iflag |=3D IGNCR; if (lios->c_iflag & LINUX_ICRNL) bios->c_iflag |=3D ICRNL; if (lios->c_iflag & LINUX_IXON) bios->c_iflag |=3D IXON; if (lios->c_iflag & LINUX_IXANY) bios->c_iflag |=3D IXANY; if (lios->c_iflag & LINUX_IXOFF) bios->c_iflag |=3D IXOFF; if (lios->c_iflag & LINUX_IMAXBEL) bios->c_iflag |=3D IMAXBEL; bios->c_oflag =3D 0; if (lios->c_oflag & LINUX_OPOST) bios->c_oflag |=3D OPOST; if (lios->c_oflag & LINUX_ONLCR) bios->c_oflag |=3D ONLCR; if (lios->c_oflag & LINUX_XTABS) bios->c_oflag |=3D OXTABS; bios->c_cflag =3D (lios->c_cflag & LINUX_CSIZE) << 4; if (lios->c_cflag & LINUX_CSTOPB) bios->c_cflag |=3D CSTOPB; if (lios->c_cflag & LINUX_CREAD) bios->c_cflag |=3D CREAD; if (lios->c_cflag & LINUX_PARENB) bios->c_cflag |=3D PARENB; if (lios->c_cflag & LINUX_PARODD) bios->c_cflag |=3D PARODD; if (lios->c_cflag & LINUX_HUPCL) bios->c_cflag |=3D HUPCL; if (lios->c_cflag & LINUX_CLOCAL) bios->c_cflag |=3D CLOCAL; if (lios->c_cflag & LINUX_CRTSCTS) bios->c_cflag |=3D CRTSCTS; bios->c_lflag =3D 0; if (lios->c_lflag & LINUX_ISIG) bios->c_lflag |=3D ISIG; if (lios->c_lflag & LINUX_ICANON) bios->c_lflag |=3D ICANON; if (lios->c_lflag & LINUX_ECHO) bios->c_lflag |=3D ECHO; if (lios->c_lflag & LINUX_ECHOE) bios->c_lflag |=3D ECHOE; if (lios->c_lflag & LINUX_ECHOK) bios->c_lflag |=3D ECHOK; if (lios->c_lflag & LINUX_ECHONL) bios->c_lflag |=3D ECHONL; if (lios->c_lflag & LINUX_NOFLSH) bios->c_lflag |=3D NOFLSH; if (lios->c_lflag & LINUX_TOSTOP) bios->c_lflag |=3D TOSTOP; if (lios->c_lflag & LINUX_ECHOCTL) bios->c_lflag |=3D ECHOCTL; if (lios->c_lflag & LINUX_ECHOPRT) bios->c_lflag |=3D ECHOPRT; if (lios->c_lflag & LINUX_ECHOKE) bios->c_lflag |=3D ECHOKE; if (lios->c_lflag & LINUX_FLUSHO) bios->c_lflag |=3D FLUSHO; if (lios->c_lflag & LINUX_PENDIN) bios->c_lflag |=3D PENDIN; if (lios->c_lflag & LINUX_IEXTEN) bios->c_lflag |=3D IEXTEN; for (i=3D0; ic_cc[i] =3D _POSIX_VDISABLE; bios->c_cc[VINTR] =3D lios->c_cc[LINUX_VINTR]; bios->c_cc[VQUIT] =3D lios->c_cc[LINUX_VQUIT]; bios->c_cc[VERASE] =3D lios->c_cc[LINUX_VERASE]; bios->c_cc[VKILL] =3D lios->c_cc[LINUX_VKILL]; bios->c_cc[VEOF] =3D lios->c_cc[LINUX_VEOF]; bios->c_cc[VEOL] =3D lios->c_cc[LINUX_VEOL]; bios->c_cc[VMIN] =3D lios->c_cc[LINUX_VMIN]; bios->c_cc[VTIME] =3D lios->c_cc[LINUX_VTIME]; bios->c_cc[VEOL2] =3D lios->c_cc[LINUX_VEOL2]; bios->c_cc[VSUSP] =3D lios->c_cc[LINUX_VSUSP]; bios->c_cc[VSTART] =3D lios->c_cc[LINUX_VSTART]; bios->c_cc[VSTOP] =3D lios->c_cc[LINUX_VSTOP]; bios->c_cc[VREPRINT] =3D lios->c_cc[LINUX_VREPRINT]; bios->c_cc[VDISCARD] =3D lios->c_cc[LINUX_VDISCARD]; bios->c_cc[VWERASE] =3D lios->c_cc[LINUX_VWERASE]; bios->c_cc[VLNEXT] =3D lios->c_cc[LINUX_VLNEXT]; for (i=3D0; ic_cc[i] =3D=3D LINUX_POSIX_VDISABLE) bios->c_cc[i] =3D _POSIX_VDISABLE; } bios->c_ispeed =3D bios->c_ospeed =3D linux_to_bsd_speed(lios->c_cflag & LINUX_CBAUD, sptab); #ifdef DEBUG printf("LINUX: BSD termios structure (output):\n"); printf("i=3D%08x o=3D%08x c=3D%08x l=3D%08x ispeed=3D%d ospeed=3D%d\n", bios->c_iflag, bios->c_oflag, bios->c_cflag, bios->c_lflag, bios->c_ispeed, bios->c_ospeed); printf("c_cc "); for (i=3D0; ic_cc[i]); printf("\n"); #endif } static void bsd_to_linux_termio(struct termios *bios, struct linux_termio *lio) { struct linux_termios lios; bsd_to_linux_termios(bios, &lios); lio->c_iflag =3D lios.c_iflag; lio->c_oflag =3D lios.c_oflag; lio->c_cflag =3D lios.c_cflag; lio->c_lflag =3D lios.c_lflag; lio->c_line =3D lios.c_line; memcpy(lio->c_cc, lios.c_cc, LINUX_NCC); } static void linux_to_bsd_termio(struct linux_termio *lio, struct termios *bios) { struct linux_termios lios; int i; lios.c_iflag =3D lio->c_iflag; lios.c_oflag =3D lio->c_oflag; lios.c_cflag =3D lio->c_cflag; lios.c_lflag =3D lio->c_lflag; for (i=3DLINUX_NCC; ic_cc, LINUX_NCC); linux_to_bsd_termios(&lios, bios); } static int linux_ioctl_termio(struct proc *p, struct linux_ioctl_args *args) { struct termios bios; struct linux_termios lios; struct linux_termio lio; struct file *fp =3D p->p_fd->fd_ofiles[args->fd]; int error; switch (args->cmd & 0xffff) { case LINUX_TCGETS: error =3D fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, p); if (error) return (error); bsd_to_linux_termios(&bios, &lios); return copyout(&lios, (caddr_t)args->arg, sizeof(lios)); case LINUX_TCSETS: error =3D copyin((caddr_t)args->arg, &lios, sizeof(lios)); if (error) return (error); linux_to_bsd_termios(&lios, &bios); return (fo_ioctl(fp, TIOCSETA, (caddr_t)&bios, p)); case LINUX_TCSETSW: error =3D copyin((caddr_t)args->arg, &lios, sizeof(lios)); if (error) return (error); linux_to_bsd_termios(&lios, &bios); return (fo_ioctl(fp, TIOCSETAW, (caddr_t)&bios, p)); case LINUX_TCSETSF: error =3D copyin((caddr_t)args->arg, &lios, sizeof(lios)); if (error) return (error); linux_to_bsd_termios(&lios, &bios); return (fo_ioctl(fp, TIOCSETAF, (caddr_t)&bios, p)); case LINUX_TCGETA: error =3D fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, p); if (error) return (error); bsd_to_linux_termio(&bios, &lio); return (copyout(&lio, (caddr_t)args->arg, sizeof(lio))); case LINUX_TCSETA: error =3D copyin((caddr_t)args->arg, &lio, sizeof(lio)); if (error) return (error); linux_to_bsd_termio(&lio, &bios); return (fo_ioctl(fp, TIOCSETA, (caddr_t)&bios, p)); case LINUX_TCSETAW: error =3D copyin((caddr_t)args->arg, &lio, sizeof(lio)); if (error) return (error); linux_to_bsd_termio(&lio, &bios); return (fo_ioctl(fp, TIOCSETAW, (caddr_t)&bios, p)); case LINUX_TCSETAF: error =3D copyin((caddr_t)args->arg, &lio, sizeof(lio)); if (error) return (error); linux_to_bsd_termio(&lio, &bios); return (fo_ioctl(fp, TIOCSETAF, (caddr_t)&bios, p)); /* LINUX_TCSBRK */ case LINUX_TCXONC: { switch (args->arg) { case LINUX_TCOOFF: args->cmd =3D TIOCSTOP; break; case LINUX_TCOON: args->cmd =3D TIOCSTART; break; case LINUX_TCIOFF: case LINUX_TCION: { int c; struct write_args wr; error =3D fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, p); if (error) return (error); c =3D (args->arg =3D=3D LINUX_TCIOFF) ? VSTOP : VSTART; c =3D bios.c_cc[c]; if (c !=3D _POSIX_VDISABLE) { wr.fd =3D args->fd; wr.buf =3D &c; wr.nbyte =3D sizeof(c); return (write(p, &wr)); } else return (0); } default: return (EINVAL); } args->arg =3D 0; return (ioctl(p, (struct ioctl_args *)args)); } case LINUX_TCFLSH: { args->cmd =3D TIOCFLUSH; switch (args->arg) { case LINUX_TCIFLUSH: args->arg =3D FREAD; break; case LINUX_TCOFLUSH: args->arg =3D FWRITE; break; case LINUX_TCIOFLUSH: args->arg =3D FREAD | FWRITE; break; default: return (EINVAL); } return (ioctl(p, (struct ioctl_args *)args)); } case LINUX_TIOCEXCL: args->cmd =3D TIOCEXCL; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_TIOCNXCL: args->cmd =3D TIOCNXCL; return (ioctl(p, (struct ioctl_args *)args)); /* LINUX_TIOCSCTTY */ case LINUX_TIOCGPGRP: args->cmd =3D TIOCGPGRP; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_TIOCSPGRP: args->cmd =3D TIOCSPGRP; return (ioctl(p, (struct ioctl_args *)args)); /* LINUX_TIOCOUTQ */ /* LINUX_TIOCSTI */ case LINUX_TIOCGWINSZ: args->cmd =3D TIOCGWINSZ; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_TIOCSWINSZ: args->cmd =3D TIOCSWINSZ; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_TIOCMGET: args->cmd =3D TIOCMGET; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_TIOCMBIS: args->cmd =3D TIOCMBIS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_TIOCMBIC: args->cmd =3D TIOCMBIC; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_TIOCMSET: args->cmd =3D TIOCMSET; return (ioctl(p, (struct ioctl_args *)args)); /* TIOCGSOFTCAR */ /* TIOCSSOFTCAR */ case LINUX_FIONREAD: /* LINUX_TIOCINQ */ args->cmd =3D FIONREAD; return (ioctl(p, (struct ioctl_args *)args)); /* LINUX_TIOCLINUX */ case LINUX_TIOCCONS: args->cmd =3D TIOCCONS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_TIOCGSERIAL: { struct linux_serial_struct lss; lss.type =3D LINUX_PORT_16550A; lss.flags =3D 0; lss.close_delay =3D 0; return copyout(&lss, (caddr_t)args->arg, sizeof(lss)); } case LINUX_TIOCSSERIAL: { struct linux_serial_struct lss; error =3D copyin((caddr_t)args->arg, &lss, sizeof(lss)); if (error) return (error); /* XXX - It really helps to have an implementation that * does nothing. NOT! */ return (0); } /* LINUX_TIOCPKT */ case LINUX_FIONBIO: args->cmd =3D FIONBIO; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_TIOCNOTTY: args->cmd =3D TIOCNOTTY; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_TIOCSETD: { int line; switch (args->arg) { case LINUX_N_TTY: line =3D TTYDISC; break; case LINUX_N_SLIP: line =3D SLIPDISC; break; case LINUX_N_PPP: line =3D PPPDISC; break; default: return (EINVAL); } return (fo_ioctl(fp, TIOCSETD, (caddr_t)&line, p)); } case LINUX_TIOCGETD: { int linux_line; int bsd_line =3D TTYDISC; error =3D fo_ioctl(fp, TIOCGETD, (caddr_t)&bsd_line, p); if (error) return (error); switch (bsd_line) { case TTYDISC: linux_line =3D LINUX_N_TTY; break; case SLIPDISC: linux_line =3D LINUX_N_SLIP; break; case PPPDISC: linux_line =3D LINUX_N_PPP; break; default: return (EINVAL); } return (copyout(&linux_line, (caddr_t)args->arg, sizeof(int))); } /* LINUX_TCSBRKP */ /* LINUX_TIOCTTYGSTRUCT */ case LINUX_FIONCLEX: args->cmd =3D FIONCLEX; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_FIOCLEX: args->cmd =3D FIOCLEX; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_FIOASYNC: args->cmd =3D FIOASYNC; return (ioctl(p, (struct ioctl_args *)args)); /* LINUX_TIOCSERCONFIG */ /* LINUX_TIOCSERGWILD */ /* LINUX_TIOCSERSWILD */ /* LINUX_TIOCGLCKTRMIOS */ /* LINUX_TIOCSLCKTRMIOS */ } return (ENOIOCTL); } /* * CDROM related ioctls */ struct linux_cdrom_msf { u_char cdmsf_min0; u_char cdmsf_sec0; u_char cdmsf_frame0; u_char cdmsf_min1; u_char cdmsf_sec1; u_char cdmsf_frame1; }; struct linux_cdrom_tochdr { u_char cdth_trk0; u_char cdth_trk1; }; union linux_cdrom_addr { struct { u_char minute; u_char second; u_char frame; } msf; int lba; }; struct linux_cdrom_tocentry { u_char cdte_track; = u_char cdte_adr:4; u_char cdte_ctrl:4; u_char cdte_format; = union linux_cdrom_addr cdte_addr; u_char cdte_datamode; = }; struct linux_cdrom_subchnl { u_char cdsc_format; u_char cdsc_audiostatus; u_char cdsc_adr:4; u_char cdsc_ctrl:4; u_char cdsc_trk; u_char cdsc_ind; union linux_cdrom_addr cdsc_absaddr; union linux_cdrom_addr cdsc_reladdr; }; static void bsd_to_linux_msf_lba(u_char af, union msf_lba *bp, union linux_cdrom_addr= *lp) { if (af =3D=3D CD_LBA_FORMAT) lp->lba =3D bp->lba; else { lp->msf.minute =3D bp->msf.minute; lp->msf.second =3D bp->msf.second; lp->msf.frame =3D bp->msf.frame; } } static void set_linux_cdrom_addr(union linux_cdrom_addr *addr, int format, int lba) { if (format =3D=3D LINUX_CDROM_MSF) { addr->msf.frame =3D lba % 75; lba /=3D 75; lba +=3D 2; addr->msf.second =3D lba % 60; addr->msf.minute =3D lba / 60; } else addr->lba =3D lba; } static int linux_ioctl_cdrom(struct proc *p, struct linux_ioctl_args *args) { struct file *fp =3D p->p_fd->fd_ofiles[args->fd]; int error; switch (args->cmd & 0xffff) { case LINUX_CDROMPAUSE: args->cmd =3D CDIOCPAUSE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_CDROMRESUME: args->cmd =3D CDIOCRESUME; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_CDROMPLAYMSF: args->cmd =3D CDIOCPLAYMSF; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_CDROMPLAYTRKIND: args->cmd =3D CDIOCPLAYTRACKS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_CDROMREADTOCHDR: { struct ioc_toc_header th; struct linux_cdrom_tochdr lth; error =3D fo_ioctl(fp, CDIOREADTOCHEADER, (caddr_t)&th, p); if (!error) { lth.cdth_trk0 =3D th.starting_track; lth.cdth_trk1 =3D th.ending_track; copyout(<h, (caddr_t)args->arg, sizeof(lth)); } return (error); } case LINUX_CDROMREADTOCENTRY: { struct linux_cdrom_tocentry lte, *ltep =3D (struct linux_cdrom_tocentry *)args->arg; struct ioc_read_toc_single_entry irtse; irtse.address_format =3D ltep->cdte_format; irtse.track =3D ltep->cdte_track; error =3D fo_ioctl(fp, CDIOREADTOCENTRY, (caddr_t)&irtse, p); if (!error) { lte =3D *ltep; lte.cdte_ctrl =3D irtse.entry.control; lte.cdte_adr =3D irtse.entry.addr_type; bsd_to_linux_msf_lba(irtse.address_format, &irtse.entry.addr, <e.cdte_addr); copyout(<e, (caddr_t)args->arg, sizeof(lte)); } return (error); } case LINUX_CDROMSTOP: args->cmd =3D CDIOCSTOP; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_CDROMSTART: args->cmd =3D CDIOCSTART; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_CDROMEJECT: args->cmd =3D CDIOCEJECT; return (ioctl(p, (struct ioctl_args *)args)); /* LINUX_CDROMVOLCTRL */ case LINUX_CDROMSUBCHNL: { struct linux_cdrom_subchnl sc; struct ioc_read_subchannel bsdsc; struct cd_sub_channel_info *bsdinfo; caddr_t sg =3D stackgap_init(); bsdinfo =3D (struct cd_sub_channel_info*)stackgap_alloc(&sg, sizeof(struct cd_sub_channel_info)); bsdsc.address_format =3D CD_LBA_FORMAT; bsdsc.data_format =3D CD_CURRENT_POSITION; bsdsc.track =3D 0; bsdsc.data_len =3D sizeof(struct cd_sub_channel_info); bsdsc.data =3D bsdinfo; error =3D fo_ioctl(fp, CDIOCREADSUBCHANNEL, (caddr_t)&bsdsc, p); if (error) return (error); error =3D copyin((caddr_t)args->arg, &sc, sizeof(struct linux_cdrom_subchnl)); if (error) return (error); sc.cdsc_audiostatus =3D bsdinfo->header.audio_status; sc.cdsc_adr =3D bsdinfo->what.position.addr_type; sc.cdsc_ctrl =3D bsdinfo->what.position.control; sc.cdsc_trk =3D bsdinfo->what.position.track_number; sc.cdsc_ind =3D bsdinfo->what.position.index_number; set_linux_cdrom_addr(&sc.cdsc_absaddr, sc.cdsc_format, bsdinfo->what.position.absaddr.lba); set_linux_cdrom_addr(&sc.cdsc_reladdr, sc.cdsc_format, bsdinfo->what.position.reladdr.lba); error =3D copyout(&sc, (caddr_t)args->arg, sizeof(struct linux_cdrom_subchnl)); return (error); } /* LINUX_CDROMREADMODE2 */ /* LINUX_CDROMREADMODE1 */ /* LINUX_CDROMREADAUDIO */ /* LINUX_CDROMEJECT_SW */ /* LINUX_CDROMMULTISESSION */ /* LINUX_CDROM_GET_UPC */ case LINUX_CDROMRESET: args->cmd =3D CDIOCRESET; return (ioctl(p, (struct ioctl_args *)args)); /* LINUX_CDROMVOLREAD */ /* LINUX_CDROMREADRAW */ /* LINUX_CDROMREADCOOKED */ /* LINUX_CDROMSEEK */ /* LINUX_CDROMPLAYBLK */ /* LINUX_CDROMREADALL */ /* LINUX_CDROMCLOSETRAY */ /* LINUX_CDROMLOADFROMSLOT */ } return (ENOIOCTL); } /* * Sound related ioctls */ static unsigned dirbits[4] =3D { IOC_VOID, IOC_IN, IOC_OUT, IOC_INOUT }; #define SETDIR(c) (((c) & ~IOC_DIRMASK) | dirbits[args->cmd >> 30]) static int linux_ioctl_sound(struct proc *p, struct linux_ioctl_args *args) { switch (args->cmd & 0xffff) { case LINUX_SOUND_MIXER_WRITE_VOLUME: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_VOLUME); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_BASS: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_BASS); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_TREBLE: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_TREBLE); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_SYNTH: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_SYNTH); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_PCM: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_PCM); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_SPEAKER: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_SPEAKER); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_LINE: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_LINE); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_MIC: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_MIC); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_CD: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_CD); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_IMIX: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_IMIX); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_ALTPCM: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_ALTPCM); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_RECLEV: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_RECLEV); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_IGAIN: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_IGAIN); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_OGAIN: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_OGAIN); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_LINE1: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_LINE1); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_LINE2: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_LINE2); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_MIXER_WRITE_LINE3: args->cmd =3D SETDIR(SOUND_MIXER_WRITE_LINE3); return (ioctl(p, (struct ioctl_args *)args)); case LINUX_OSS_GETVERSION: { int version =3D linux_get_oss_version(p); return (copyout(&version, (caddr_t)args->arg, sizeof(int))); } case LINUX_SOUND_MIXER_READ_DEVMASK: args->cmd =3D SOUND_MIXER_READ_DEVMASK; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_RESET: args->cmd =3D SNDCTL_DSP_RESET; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_SYNC: args->cmd =3D SNDCTL_DSP_SYNC; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_SPEED: args->cmd =3D SNDCTL_DSP_SPEED; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_STEREO: args->cmd =3D SNDCTL_DSP_STEREO; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_GETBLKSIZE: /* LINUX_SNDCTL_DSP_SETBLKSIZE */ args->cmd =3D SNDCTL_DSP_GETBLKSIZE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_SETFMT: args->cmd =3D SNDCTL_DSP_SETFMT; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_PCM_WRITE_CHANNELS: args->cmd =3D SOUND_PCM_WRITE_CHANNELS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SOUND_PCM_WRITE_FILTER: args->cmd =3D SOUND_PCM_WRITE_FILTER; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_POST: args->cmd =3D SNDCTL_DSP_POST; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_SUBDIVIDE: args->cmd =3D SNDCTL_DSP_SUBDIVIDE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_SETFRAGMENT: args->cmd =3D SNDCTL_DSP_SETFRAGMENT; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_GETFMTS: args->cmd =3D SNDCTL_DSP_GETFMTS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_GETOSPACE: args->cmd =3D SNDCTL_DSP_GETOSPACE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_GETISPACE: args->cmd =3D SNDCTL_DSP_GETISPACE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_NONBLOCK: args->cmd =3D SNDCTL_DSP_NONBLOCK; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_GETCAPS: args->cmd =3D SNDCTL_DSP_GETCAPS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_SETTRIGGER: /* LINUX_SNDCTL_GETTRIGGER */ args->cmd =3D SNDCTL_DSP_SETTRIGGER; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_GETIPTR: args->cmd =3D SNDCTL_DSP_GETIPTR; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_GETOPTR: args->cmd =3D SNDCTL_DSP_GETOPTR; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_DSP_GETODELAY: args->cmd =3D SNDCTL_DSP_GETODELAY; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SEQ_RESET: args->cmd =3D SNDCTL_SEQ_RESET; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SEQ_SYNC: args->cmd =3D SNDCTL_SEQ_SYNC; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SYNTH_INFO: args->cmd =3D SNDCTL_SYNTH_INFO; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SEQ_CTRLRATE: args->cmd =3D SNDCTL_SEQ_CTRLRATE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SEQ_GETOUTCOUNT: args->cmd =3D SNDCTL_SEQ_GETOUTCOUNT; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SEQ_GETINCOUNT: args->cmd =3D SNDCTL_SEQ_GETINCOUNT; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SEQ_PERCMODE: args->cmd =3D SNDCTL_SEQ_PERCMODE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_FM_LOAD_INSTR: args->cmd =3D SNDCTL_FM_LOAD_INSTR; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SEQ_TESTMIDI: args->cmd =3D SNDCTL_SEQ_TESTMIDI; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SEQ_RESETSAMPLES: args->cmd =3D SNDCTL_SEQ_RESETSAMPLES; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SEQ_NRSYNTHS: args->cmd =3D SNDCTL_SEQ_NRSYNTHS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SEQ_NRMIDIS: args->cmd =3D SNDCTL_SEQ_NRMIDIS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_MIDI_INFO: args->cmd =3D SNDCTL_MIDI_INFO; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SEQ_TRESHOLD: args->cmd =3D SNDCTL_SEQ_TRESHOLD; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SNDCTL_SYNTH_MEMAVL: args->cmd =3D SNDCTL_SYNTH_MEMAVL; return (ioctl(p, (struct ioctl_args *)args)); } return (ENOIOCTL); } /* * Console related ioctls */ #define ISSIGVALID(sig) ((sig) > 0 && (sig) < NSIG) static int linux_ioctl_console(struct proc *p, struct linux_ioctl_args *args) { struct file *fp =3D p->p_fd->fd_ofiles[args->fd]; switch (args->cmd & 0xffff) { case LINUX_KIOCSOUND: args->cmd =3D KIOCSOUND; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_KDMKTONE: args->cmd =3D KDMKTONE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_KDGETLED: args->cmd =3D KDGETLED; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_KDSETLED: args->cmd =3D KDSETLED; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_KDSETMODE: args->cmd =3D KDSETMODE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_KDGETMODE: args->cmd =3D KDGETMODE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_KDGKBMODE: args->cmd =3D KDGKBMODE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_KDSKBMODE: { int kbdmode; switch (args->arg) { case LINUX_KBD_RAW: kbdmode =3D K_RAW; break; case LINUX_KBD_XLATE: kbdmode =3D K_XLATE; break; case LINUX_KBD_MEDIUMRAW: kbdmode =3D K_RAW; break; default: return (EINVAL); } return (fo_ioctl(fp, KDSKBMODE, (caddr_t)&kbdmode, p)); } case LINUX_VT_OPENQRY: args->cmd =3D VT_OPENQRY; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_VT_GETMODE: args->cmd =3D VT_GETMODE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_VT_SETMODE: { struct vt_mode *mode; args->cmd =3D VT_SETMODE; mode =3D (struct vt_mode *)args->arg; if (!ISSIGVALID(mode->frsig) && ISSIGVALID(mode->acqsig)) mode->frsig =3D mode->acqsig; return (ioctl(p, (struct ioctl_args *)args)); } case LINUX_VT_GETSTATE: args->cmd =3D VT_GETACTIVE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_VT_RELDISP: args->cmd =3D VT_RELDISP; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_VT_ACTIVATE: args->cmd =3D VT_ACTIVATE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_VT_WAITACTIVE: args->cmd =3D VT_WAITACTIVE; return (ioctl(p, (struct ioctl_args *)args)); } = return (ENOIOCTL); } /* * Socket related ioctls */ static int linux_ioctl_socket(struct proc *p, struct linux_ioctl_args *args) { switch (args->cmd & 0xffff) { case LINUX_FIOSETOWN: args->cmd =3D FIOSETOWN; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SIOCSPGRP: args->cmd =3D SIOCSPGRP; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_FIOGETOWN: args->cmd =3D FIOGETOWN; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SIOCGPGRP: args->cmd =3D SIOCGPGRP; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SIOCATMARK: args->cmd =3D SIOCATMARK; return (ioctl(p, (struct ioctl_args *)args)); /* LINUX_SIOCGSTAMP */ case LINUX_SIOCGIFCONF: args->cmd =3D OSIOCGIFCONF; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SIOCGIFFLAGS: args->cmd =3D SIOCGIFFLAGS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SIOCGIFADDR: args->cmd =3D OSIOCGIFADDR; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SIOCGIFDSTADDR: args->cmd =3D OSIOCGIFDSTADDR; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SIOCGIFBRDADDR: args->cmd =3D OSIOCGIFBRDADDR; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SIOCGIFNETMASK: args->cmd =3D OSIOCGIFNETMASK; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SIOCGIFHWADDR: { int ifn; struct ifnet *ifp; struct ifaddr *ifa; struct sockaddr_dl *sdl; struct linux_ifreq *ifr =3D (struct linux_ifreq *)args->arg; /* Note that we don't actually respect the name in the ifreq * structure, as Linux interface names are all different. */ for (ifn =3D 0; ifn < if_index; ifn++) { ifp =3D ifnet_addrs[ifn]->ifa_ifp; if (ifp->if_type =3D=3D IFT_ETHER) { ifa =3D TAILQ_FIRST(&ifp->if_addrhead); while (ifa) { sdl=3D(struct sockaddr_dl*)ifa->ifa_addr; if (sdl !=3D NULL && (sdl->sdl_family =3D=3D AF_LINK) && (sdl->sdl_type =3D=3D IFT_ETHER)) { return (copyout(LLADDR(sdl), &ifr->ifr_hwaddr.sa_data, LINUX_IFHWADDRLEN)); } ifa =3D TAILQ_NEXT(ifa, ifa_link); } } } return (ENOENT); } case LINUX_SIOCADDMULTI: args->cmd =3D SIOCADDMULTI; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_SIOCDELMULTI: args->cmd =3D SIOCDELMULTI; return (ioctl(p, (struct ioctl_args *)args)); } return (ENOIOCTL); } /* * linux drm ioctl's */ static int linux_ioctl_drm(struct proc *p, struct linux_ioctl_args *args) { switch (args->cmd & 0xffff) { case LINUX_DRM_IOCTL_VERSION: args->cmd =3D DRM_IOCTL_VERSION; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_GET_UNIQUE: args->cmd =3D DRM_IOCTL_GET_UNIQUE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_GET_MAGIC: args->cmd =3D DRM_IOCTL_GET_MAGIC; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_IRQ_BUSID: args->cmd =3D DRM_IOCTL_IRQ_BUSID; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_SET_UNIQUE: args->cmd =3D DRM_IOCTL_SET_UNIQUE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_AUTH_MAGIC: args->cmd =3D DRM_IOCTL_AUTH_MAGIC; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_BLOCK: args->cmd =3D DRM_IOCTL_BLOCK; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_UNBLOCK: args->cmd =3D DRM_IOCTL_UNBLOCK; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_CONTROL: args->cmd =3D DRM_IOCTL_CONTROL; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_ADD_MAP: args->cmd =3D DRM_IOCTL_ADD_MAP; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_ADD_BUFS: args->cmd =3D DRM_IOCTL_ADD_BUFS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_MARK_BUFS: args->cmd =3D DRM_IOCTL_MARK_BUFS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_INFO_BUFS: args->cmd =3D DRM_IOCTL_INFO_BUFS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_MAP_BUFS: args->cmd =3D DRM_IOCTL_MAP_BUFS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_FREE_BUFS: args->cmd =3D DRM_IOCTL_FREE_BUFS; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_ADD_CTX: args->cmd =3D DRM_IOCTL_ADD_CTX; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_RM_CTX: args->cmd =3D DRM_IOCTL_RM_CTX; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_MOD_CTX: args->cmd =3D DRM_IOCTL_MOD_CTX; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_GET_CTX: args->cmd =3D DRM_IOCTL_GET_CTX; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_SWITCH_CTX: args->cmd =3D DRM_IOCTL_SWITCH_CTX; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_NEW_CTX: args->cmd =3D DRM_IOCTL_NEW_CTX; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_RES_CTX: args->cmd =3D DRM_IOCTL_RES_CTX; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_ADD_DRAW: args->cmd =3D DRM_IOCTL_ADD_DRAW; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_RM_DRAW: args->cmd =3D DRM_IOCTL_RM_DRAW; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_DMA: args->cmd =3D DRM_IOCTL_DMA; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_LOCK: args->cmd =3D DRM_IOCTL_LOCK; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_UNLOCK: args->cmd =3D DRM_IOCTL_UNLOCK; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_FINISH: args->cmd =3D DRM_IOCTL_FINISH; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_AGP_ACQUIRE: args->cmd =3D DRM_IOCTL_AGP_ACQUIRE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_AGP_RELEASE: args->cmd =3D DRM_IOCTL_AGP_RELEASE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_AGP_ENABLE: args->cmd =3D DRM_IOCTL_AGP_ENABLE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_AGP_INFO: args->cmd =3D DRM_IOCTL_AGP_INFO; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_AGP_ALLOC: args->cmd =3D DRM_IOCTL_AGP_ALLOC; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_AGP_FREE: args->cmd =3D DRM_IOCTL_AGP_FREE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_AGP_BIND: args->cmd =3D DRM_IOCTL_AGP_BIND; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_AGP_UNBIND: args->cmd =3D DRM_IOCTL_AGP_UNBIND; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_MGA_INIT: args->cmd =3D DRM_IOCTL_MGA_INIT; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_MGA_SWAP: args->cmd =3D DRM_IOCTL_MGA_SWAP; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_MGA_CLEAR: args->cmd =3D DRM_IOCTL_MGA_CLEAR; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_MGA_ILOAD: args->cmd =3D DRM_IOCTL_MGA_ILOAD; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_MGA_VERTEX: args->cmd =3D DRM_IOCTL_MGA_VERTEX; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_MGA_FLUSH: args->cmd =3D DRM_IOCTL_MGA_FLUSH; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_MGA_INDICES: args->cmd =3D DRM_IOCTL_MGA_INDICES; return (ioctl(p, (struct ioctl_args *)args)); #if 0 case LINUX_DRM_IOCTL_MGA_SOMETHING: args->cmd =3D DRM_IOCTL_MGA_SOMETHING; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_I810_INIT: args->cmd =3D DRM_IOCTL_I810_INIT; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_I810_VERTEX: args->cmd =3D DRM_IOCTL_I810_VERTEX; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_I810_CLEAR: args->cmd =3D DRM_IOCTL_I810_CLEAR; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_I810_FLUSH: args->cmd =3D DRM_IOCTL_I810_FLUSH; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_I810_GETAGE: args->cmd =3D DRM_IOCTL_I810_GETAGE; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_I810_GETBUF: args->cmd =3D DRM_IOCTL_I810_GETBUF; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_I810_SWAP: args->cmd =3D DRM_IOCTL_I810_SWAP; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_R128_INIT: args->cmd =3D DRM_IOCTL_R128_INIT; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_R128_RESET: args->cmd =3D DRM_IOCTL_R128_RESET; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_R128_FLUSH: args->cmd =3D DRM_IOCTL_R128_FLUSH; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_R128_CCEID: args->cmd =3D DRM_IOCTL_R128_CCEID; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_R128_PACKET: args->cmd =3D DRM_IOCTL_R128_PACKET; return (ioctl(p, (struct ioctl_args *)args)); case LINUX_DRM_IOCTL_R128_VERTEX: args->cmd =3D DRM_IOCTL_R128_VERTEX; return (ioctl(p, (struct ioctl_args *)args)); #endif } return (ENOIOCTL); } /* * main ioctl syscall function */ int linux_ioctl(struct proc *p, struct linux_ioctl_args *args) { struct filedesc *fdp =3D p->p_fd; struct file *fp; struct handler_element *he; int error, cmd; #ifdef DEBUG printf("Linux-emul(%ld): ioctl(%d, %04lx, *)\n", (long)p->p_pid, args->fd, args->cmd); #endif if ((unsigned)args->fd >=3D fdp->fd_nfiles) return (EBADF); fp =3D fdp->fd_ofiles[args->fd]; if (fp =3D=3D NULL || (fp->f_flag & (FREAD|FWRITE)) =3D=3D 0) return (EBADF); /* Iterate over the ioctl handlers */ cmd =3D args->cmd & 0xffff; TAILQ_FOREACH(he, &handlers, list) { if (cmd >=3D he->low && cmd <=3D he->high) { error =3D (*he->func)(p, args); if (error !=3D ENOIOCTL) return (error); } } printf("linux: 'ioctl' fd=3D%d, cmd=3D%x ('%c',%d) not implemented\n", args->fd, (int)(args->cmd & 0xffff), (int)(args->cmd & 0xff00) >> 8, (int)(args->cmd & 0xff)); return (EINVAL); } int linux_ioctl_register_handler(struct linux_ioctl_handler *h) { struct handler_element *he, *cur; if (h =3D=3D NULL || h->func =3D=3D NULL) return (EINVAL); /* * Reuse the element if the handler is already on the list, otherwise * create a new element. */ TAILQ_FOREACH(he, &handlers, list) { if (he->func =3D=3D h->func) break; } if (he =3D=3D NULL) { MALLOC(he, struct handler_element *, sizeof(*he), M_LINUX, M_WAITOK); he->func =3D h->func; } else TAILQ_REMOVE(&handlers, he, list); = /* Initialize range information. */ he->low =3D h->low; he->high =3D h->high; he->span =3D h->high - h->low + 1; /* Add the element to the list, sorted on span. */ TAILQ_FOREACH(cur, &handlers, list) { if (cur->span > he->span) { TAILQ_INSERT_BEFORE(cur, he, list); return (0); } } TAILQ_INSERT_TAIL(&handlers, he, list); return (0); } int linux_ioctl_unregister_handler(struct linux_ioctl_handler *h) { struct handler_element *he; if (h =3D=3D NULL || h->func =3D=3D NULL) return (EINVAL); TAILQ_FOREACH(he, &handlers, list) { if (he->func =3D=3D h->func) { TAILQ_REMOVE(&handlers, he, list); FREE(he, M_LINUX); return (0); } } return (EINVAL); } int linux_ioctl_register_handlers(struct linker_set *s) { int error, i; if (s =3D=3D NULL) return (EINVAL); for (i =3D 0; i < s->ls_length; i++) { error =3D linux_ioctl_register_handler(s->ls_items[i]); if (error) return (error); } return (0); } int linux_ioctl_unregister_handlers(struct linker_set *s) { int error, i; if (s =3D=3D NULL) return (EINVAL); for (i =3D 0; i < s->ls_length; i++) { error =3D linux_ioctl_unregister_handler(s->ls_items[i]); if (error) return (error); } return (0); } --==_Exmh_-15466650710 Content-Type: text/plain ; name="linux_ioctl.h"; charset=iso-8859-1 Content-Description: linux_ioctl.h Content-Disposition: attachment; filename="linux_ioctl.h" Content-Transfer-Encoding: quoted-printable /*- * Copyright (c) 1999 Marcel Moolenaar * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer = * in this position and unchanged. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the= * documentation and/or other materials provided with the distribution= =2E * 3. The name of the author may not be used to endorse or promote produc= ts * derived from this software without specific prior written permissio= n. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANT= IES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED= =2E * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, B= UT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF U= SE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE = OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/compat/linux/linux_ioctl.h,v 1.4 2000/08/25 07:31:13= marcel Exp $ */ #ifndef _LINUX_IOCTL_H_ #define _LINUX_IOCTL_H_ /* * disk */ #define LINUX_BLKROSET 0x125d #define LINUX_BLKROGET 0x125e #define LINUX_BLKRRPART 0x125f #define LINUX_BLKGETSIZE 0x1260 #define LINUX_BLKFLSBUF 0x1261 #define LINUX_BLKRASET 0x1262 #define LINUX_BLKRAGET 0x1263 #define LINUX_BLKFRASET 0x1264 #define LINUX_BLKFRAGET 0x1265 #define LINUX_BLKSECTSET 0x1266 #define LINUX_BLKSECTGET 0x1267 #define LINUX_BLKSSZGET 0x1268 #define LINUX_IOCTL_DISK_MIN LINUX_BLKROSET #define LINUX_IOCTL_DISK_MAX LINUX_BLKSSZGET /* * cdrom */ #define LINUX_CDROMPAUSE 0x5301 = #define LINUX_CDROMRESUME 0x5302 #define LINUX_CDROMPLAYMSF 0x5303 #define LINUX_CDROMPLAYTRKIND 0x5304 #define LINUX_CDROMREADTOCHDR 0x5305 #define LINUX_CDROMREADTOCENTRY 0x5306 #define LINUX_CDROMSTOP 0x5307 #define LINUX_CDROMSTART 0x5308 #define LINUX_CDROMEJECT 0x5309 #define LINUX_CDROMVOLCTRL 0x530a #define LINUX_CDROMSUBCHNL 0x530b #define LINUX_CDROMREADMODE2 0x530c #define LINUX_CDROMREADMODE1 0x530d #define LINUX_CDROMREADAUDIO 0x530e #define LINUX_CDROMEJECT_SW 0x530f #define LINUX_CDROMMULTISESSION 0x5310 #define LINUX_CDROM_GET_UPC 0x5311 #define LINUX_CDROMRESET 0x5312 #define LINUX_CDROMVOLREAD 0x5313 #define LINUX_CDROMREADRAW 0x5314 #define LINUX_CDROMREADCOOKED 0x5315 #define LINUX_CDROMSEEK 0x5316 #define LINUX_CDROMPLAYBLK 0x5317 #define LINUX_CDROMREADALL 0x5318 #define LINUX_CDROMCLOSETRAY 0x5319 #define LINUX_CDROMLOADFROMSLOT 0x531a #define LINUX_IOCTL_CDROM_MIN LINUX_CDROMPAUSE #define LINUX_IOCTL_CDROM_MAX LINUX_CDROMLOADFROMSLOT #define LINUX_CDROM_LBA 0x01 #define LINUX_CDROM_MSF 0x02 /* * console */ #define LINUX_KIOCSOUND 0x4B2F #define LINUX_KDMKTONE 0x4B30 #define LINUX_KDGETLED 0x4B31 #define LINUX_KDSETLED 0x4B32 #define LINUX_KDSETMODE 0x4B3A #define LINUX_KDGETMODE 0x4B3B #define LINUX_KDGKBMODE 0x4B44 #define LINUX_KDSKBMODE 0x4B45 #define LINUX_VT_OPENQRY 0x5600 #define LINUX_VT_GETMODE 0x5601 #define LINUX_VT_SETMODE 0x5602 #define LINUX_VT_GETSTATE 0x5603 #define LINUX_VT_RELDISP 0x5605 #define LINUX_VT_ACTIVATE 0x5606 = #define LINUX_VT_WAITACTIVE 0x5607 #define LINUX_IOCTL_CONSOLE_MIN LINUX_KIOCSOUND #define LINUX_IOCTL_CONSOLE_MAX LINUX_VT_WAITACTIVE #define LINUX_LED_SCR 0x01 #define LINUX_LED_NUM 0x02 #define LINUX_LED_CAP 0x04 #define LINUX_KD_TEXT 0x0 #define LINUX_KD_GRAPHICS 0x1 #define LINUX_KD_TEXT0 0x2 #define LINUX_KD_TEXT1 0x3 #define LINUX_KBD_RAW 0 #define LINUX_KBD_XLATE 1 #define LINUX_KBD_MEDIUMRAW 2 /* * socket */ #define LINUX_FIOSETOWN 0x8901 #define LINUX_SIOCSPGRP 0x8902 #define LINUX_FIOGETOWN 0x8903 #define LINUX_SIOCGPGRP 0x8904 #define LINUX_SIOCATMARK 0x8905 #define LINUX_SIOCGSTAMP 0x8906 #define LINUX_SIOCGIFCONF 0x8912 #define LINUX_SIOCGIFFLAGS 0x8913 #define LINUX_SIOCGIFADDR 0x8915 #define LINUX_SIOCGIFDSTADDR 0x8917 #define LINUX_SIOCGIFBRDADDR 0x8919 #define LINUX_SIOCGIFNETMASK 0x891b #define LINUX_SIOCGIFHWADDR 0x8927 #define LINUX_SIOCADDMULTI 0x8931 #define LINUX_SIOCDELMULTI 0x8932 #define LINUX_IOCTL_SOCKET_MIN LINUX_FIOSETOWN #define LINUX_IOCTL_SOCKET_MAX LINUX_SIOCDELMULTI /* * sound */ #define LINUX_SOUND_MIXER_WRITE_VOLUME 0x4d00 #define LINUX_SOUND_MIXER_WRITE_BASS 0x4d01 #define LINUX_SOUND_MIXER_WRITE_TREBLE 0x4d02 #define LINUX_SOUND_MIXER_WRITE_SYNTH 0x4d03 #define LINUX_SOUND_MIXER_WRITE_PCM 0x4d04 #define LINUX_SOUND_MIXER_WRITE_SPEAKER 0x4d05 #define LINUX_SOUND_MIXER_WRITE_LINE 0x4d06 #define LINUX_SOUND_MIXER_WRITE_MIC 0x4d07 #define LINUX_SOUND_MIXER_WRITE_CD 0x4d08 #define LINUX_SOUND_MIXER_WRITE_IMIX 0x4d09 #define LINUX_SOUND_MIXER_WRITE_ALTPCM 0x4d0A #define LINUX_SOUND_MIXER_WRITE_RECLEV 0x4d0B #define LINUX_SOUND_MIXER_WRITE_IGAIN 0x4d0C #define LINUX_SOUND_MIXER_WRITE_OGAIN 0x4d0D #define LINUX_SOUND_MIXER_WRITE_LINE1 0x4d0E #define LINUX_SOUND_MIXER_WRITE_LINE2 0x4d0F #define LINUX_SOUND_MIXER_WRITE_LINE3 0x4d10 #define LINUX_OSS_GETVERSION 0x4d76 #define LINUX_SOUND_MIXER_READ_DEVMASK 0x4dfe #define LINUX_SNDCTL_DSP_RESET 0x5000 #define LINUX_SNDCTL_DSP_SYNC 0x5001 #define LINUX_SNDCTL_DSP_SPEED 0x5002 #define LINUX_SNDCTL_DSP_STEREO 0x5003 #define LINUX_SNDCTL_DSP_GETBLKSIZE 0x5004 #define LINUX_SNDCTL_DSP_SETBLKSIZE LINUX_SNDCTL_DSP_GETBLKSIZE #define LINUX_SNDCTL_DSP_SETFMT 0x5005 #define LINUX_SOUND_PCM_WRITE_CHANNELS 0x5006 #define LINUX_SOUND_PCM_WRITE_FILTER 0x5007 #define LINUX_SNDCTL_DSP_POST 0x5008 #define LINUX_SNDCTL_DSP_SUBDIVIDE 0x5009 #define LINUX_SNDCTL_DSP_SETFRAGMENT 0x500A #define LINUX_SNDCTL_DSP_GETFMTS 0x500B #define LINUX_SNDCTL_DSP_GETOSPACE 0x500C #define LINUX_SNDCTL_DSP_GETISPACE 0x500D #define LINUX_SNDCTL_DSP_NONBLOCK 0x500E #define LINUX_SNDCTL_DSP_GETCAPS 0x500F #define LINUX_SNDCTL_DSP_GETTRIGGER 0x5010 #define LINUX_SNDCTL_DSP_SETTRIGGER LINUX_SNDCTL_DSP_GETTRIGGER #define LINUX_SNDCTL_DSP_GETIPTR 0x5011 #define LINUX_SNDCTL_DSP_GETOPTR 0x5012 #define LINUX_SNDCTL_DSP_GETODELAY 0x5017 #define LINUX_SNDCTL_SEQ_RESET 0x5100 #define LINUX_SNDCTL_SEQ_SYNC 0x5101 #define LINUX_SNDCTL_SYNTH_INFO 0x5102 #define LINUX_SNDCTL_SEQ_CTRLRATE 0x5103 #define LINUX_SNDCTL_SEQ_GETOUTCOUNT 0x5104 #define LINUX_SNDCTL_SEQ_GETINCOUNT 0x5105 #define LINUX_SNDCTL_SEQ_PERCMODE 0x5106 #define LINUX_SNDCTL_FM_LOAD_INSTR 0x5107 #define LINUX_SNDCTL_SEQ_TESTMIDI 0x5108 #define LINUX_SNDCTL_SEQ_RESETSAMPLES 0x5109 #define LINUX_SNDCTL_SEQ_NRSYNTHS 0x510A #define LINUX_SNDCTL_SEQ_NRMIDIS 0x510B #define LINUX_SNDCTL_MIDI_INFO 0x510C #define LINUX_SNDCTL_SEQ_TRESHOLD 0x510D #define LINUX_SNDCTL_SYNTH_MEMAVL 0x510E #define LINUX_IOCTL_SOUND_MIN LINUX_SOUND_MIXER_WRITE_VOLUME #define LINUX_IOCTL_SOUND_MAX LINUX_SNDCTL_SYNTH_MEMAVL /* * termio */ #define LINUX_TCGETS 0x5401 #define LINUX_TCSETS 0x5402 #define LINUX_TCSETSW 0x5403 #define LINUX_TCSETSF 0x5404 #define LINUX_TCGETA 0x5405 #define LINUX_TCSETA 0x5406 #define LINUX_TCSETAW 0x5407 #define LINUX_TCSETAF 0x5408 #define LINUX_TCSBRK 0x5409 #define LINUX_TCXONC 0x540A #define LINUX_TCFLSH 0x540B #define LINUX_TIOCEXCL 0x540C #define LINUX_TIOCNXCL 0x540D #define LINUX_TIOCSCTTY 0x540E #define LINUX_TIOCGPGRP 0x540F #define LINUX_TIOCSPGRP 0x5410 #define LINUX_TIOCOUTQ 0x5411 #define LINUX_TIOCSTI 0x5412 #define LINUX_TIOCGWINSZ 0x5413 #define LINUX_TIOCSWINSZ 0x5414 #define LINUX_TIOCMGET 0x5415 #define LINUX_TIOCMBIS 0x5416 #define LINUX_TIOCMBIC 0x5417 #define LINUX_TIOCMSET 0x5418 #define LINUX_TIOCGSOFTCAR 0x5419 #define LINUX_TIOCSSOFTCAR 0x541A #define LINUX_FIONREAD 0x541B #define LINUX_TIOCINQ FIONREAD #define LINUX_TIOCLINUX 0x541C #define LINUX_TIOCCONS 0x541D #define LINUX_TIOCGSERIAL 0x541E #define LINUX_TIOCSSERIAL 0x541F #define LINUX_TIOCPKT 0x5420 #define LINUX_FIONBIO 0x5421 #define LINUX_TIOCNOTTY 0x5422 #define LINUX_TIOCSETD 0x5423 #define LINUX_TIOCGETD 0x5424 #define LINUX_TCSBRKP 0x5425 #define LINUX_TIOCTTYGSTRUCT 0x5426 #define LINUX_FIONCLEX 0x5450 #define LINUX_FIOCLEX 0x5451 #define LINUX_FIOASYNC 0x5452 #define LINUX_TIOCSERCONFIG 0x5453 #define LINUX_TIOCSERGWILD 0x5454 #define LINUX_TIOCSERSWILD 0x5455 #define LINUX_TIOCGLCKTRMIOS 0x5456 #define LINUX_TIOCSLCKTRMIOS 0x5457 #define LINUX_IOCTL_TERMIO_MIN LINUX_TCGETS #define LINUX_IOCTL_TERMIO_MAX LINUX_TIOCSLCKTRMIOS /* arguments for tcflow() and LINUX_TCXONC */ #define LINUX_TCOOFF 0 #define LINUX_TCOON 1 #define LINUX_TCIOFF 2 #define LINUX_TCION 3 /* arguments for tcflush() and LINUX_TCFLSH */ #define LINUX_TCIFLUSH 0 #define LINUX_TCOFLUSH 1 #define LINUX_TCIOFLUSH 2 /* line disciplines */ #define LINUX_N_TTY 0 #define LINUX_N_SLIP 1 #define LINUX_N_MOUSE 2 #define LINUX_N_PPP 3 /* Linux termio c_cc values */ #define LINUX_VINTR 0 #define LINUX_VQUIT 1 #define LINUX_VERASE 2 #define LINUX_VKILL 3 #define LINUX_VEOF 4 #define LINUX_VTIME 5 #define LINUX_VMIN 6 #define LINUX_VSWTC 7 #define LINUX_NCC 8 /* Linux termios c_cc values */ #define LINUX_VSTART 8 #define LINUX_VSTOP 9 #define LINUX_VSUSP 10 #define LINUX_VEOL 11 #define LINUX_VREPRINT 12 #define LINUX_VDISCARD 13 #define LINUX_VWERASE 14 #define LINUX_VLNEXT 15 #define LINUX_VEOL2 16 #define LINUX_NCCS 19 #define LINUX_POSIX_VDISABLE '\0' /* Linux c_iflag masks */ #define LINUX_IGNBRK 0x0000001 #define LINUX_BRKINT 0x0000002 #define LINUX_IGNPAR 0x0000004 #define LINUX_PARMRK 0x0000008 #define LINUX_INPCK 0x0000010 #define LINUX_ISTRIP 0x0000020 #define LINUX_INLCR 0x0000040 #define LINUX_IGNCR 0x0000080 #define LINUX_ICRNL 0x0000100 #define LINUX_IUCLC 0x0000200 #define LINUX_IXON 0x0000400 #define LINUX_IXANY 0x0000800 #define LINUX_IXOFF 0x0001000 #define LINUX_IMAXBEL 0x0002000 /* Linux c_oflag masks */ #define LINUX_OPOST 0x0000001 #define LINUX_OLCUC 0x0000002 #define LINUX_ONLCR 0x0000004 #define LINUX_OCRNL 0x0000008 #define LINUX_ONOCR 0x0000010 #define LINUX_ONLRET 0x0000020 #define LINUX_OFILL 0x0000040 #define LINUX_OFDEL 0x0000080 #define LINUX_NLDLY 0x0000100 #define LINUX_NL0 0x0000000 #define LINUX_NL1 0x0000100 #define LINUX_CRDLY 0x0000600 #define LINUX_CR0 0x0000000 #define LINUX_CR1 0x0000200 #define LINUX_CR2 0x0000400 #define LINUX_CR3 0x0000600 #define LINUX_TABDLY 0x0001800 #define LINUX_TAB0 0x0000000 #define LINUX_TAB1 0x0000800 #define LINUX_TAB2 0x0001000 #define LINUX_TAB3 0x0001800 #define LINUX_XTABS 0x0001800 #define LINUX_BSDLY 0x0002000 #define LINUX_BS0 0x0000000 #define LINUX_BS1 0x0002000 #define LINUX_VTDLY 0x0004000 #define LINUX_VT0 0x0000000 #define LINUX_VT1 0x0004000 #define LINUX_FFDLY 0x0008000 #define LINUX_FF0 0x0000000 #define LINUX_FF1 0x0008000 #define LINUX_CBAUD 0x0000100f #define LINUX_B0 0x00000000 #define LINUX_B50 0x00000001 #define LINUX_B75 0x00000002 #define LINUX_B110 0x00000003 #define LINUX_B134 0x00000004 #define LINUX_B150 0x00000005 #define LINUX_B200 0x00000006 #define LINUX_B300 0x00000007 #define LINUX_B600 0x00000008 #define LINUX_B1200 0x00000009 #define LINUX_B1800 0x0000000a #define LINUX_B2400 0x0000000b #define LINUX_B4800 0x0000000c #define LINUX_B9600 0x0000000d #define LINUX_B19200 0x0000000e #define LINUX_B38400 0x0000000f #define LINUX_EXTA LINUX_B19200 #define LINUX_EXTB LINUX_B38400 #define LINUX_CBAUDEX 0x00001000 #define LINUX_B57600 0x00001001 #define LINUX_B115200 0x00001002 #define LINUX_CSIZE 0x00000030 #define LINUX_CS5 0x00000000 #define LINUX_CS6 0x00000010 #define LINUX_CS7 0x00000020 #define LINUX_CS8 0x00000030 #define LINUX_CSTOPB 0x00000040 #define LINUX_CREAD 0x00000080 #define LINUX_PARENB 0x00000100 #define LINUX_PARODD 0x00000200 #define LINUX_HUPCL 0x00000400 #define LINUX_CLOCAL 0x00000800 #define LINUX_CRTSCTS 0x80000000 /* Linux c_lflag masks */ #define LINUX_ISIG 0x00000001 #define LINUX_ICANON 0x00000002 #define LINUX_XCASE 0x00000004 #define LINUX_ECHO 0x00000008 #define LINUX_ECHOE 0x00000010 #define LINUX_ECHOK 0x00000020 #define LINUX_ECHONL 0x00000040 #define LINUX_NOFLSH 0x00000080 #define LINUX_TOSTOP 0x00000100 #define LINUX_ECHOCTL 0x00000200 #define LINUX_ECHOPRT 0x00000400 #define LINUX_ECHOKE 0x00000800 #define LINUX_FLUSHO 0x00001000 #define LINUX_PENDIN 0x00002000 #define LINUX_IEXTEN 0x00008000 /* serial_struct values for TIOC[GS]SERIAL ioctls */ #define LINUX_ASYNC_CLOSING_WAIT_INF 0 #define LINUX_ASYNC_CLOSING_WAIT_NONE 65535 #define LINUX_PORT_UNKNOWN 0 #define LINUX_PORT_8250 1 #define LINUX_PORT_16450 2 #define LINUX_PORT_16550 3 #define LINUX_PORT_16550A 4 #define LINUX_PORT_CIRRUS 5 #define LINUX_PORT_16650 6 #define LINUX_PORT_MAX 6 #define LINUX_ASYNC_HUP_NOTIFY 0x0001 #define LINUX_ASYNC_FOURPORT 0x0002 #define LINUX_ASYNC_SAK 0x0004 #define LINUX_ASYNC_SPLIT_TERMIOS 0x0008 #define LINUX_ASYNC_SPD_MASK 0x0030 #define LINUX_ASYNC_SPD_HI 0x0010 #define LINUX_ASYNC_SPD_VHI 0x0020 #define LINUX_ASYNC_SPD_CUST 0x0030 #define LINUX_ASYNC_SKIP_TEST 0x0040 #define LINUX_ASYNC_AUTO_IRQ 0x0080 #define LINUX_ASYNC_SESSION_LOCKOUT 0x0100 #define LINUX_ASYNC_PGRP_LOCKOUT 0x0200 #define LINUX_ASYNC_CALLOUT_NOHUP 0x0400 #define LINUX_ASYNC_FLAGS 0x0FFF /* XFree86 4.0.x DRI support */ #define LINUX_DRM_IOCTL_VERSION 0x6400 #define LINUX_DRM_IOCTL_GET_UNIQUE 0x6401 #define LINUX_DRM_IOCTL_GET_MAGIC 0x6402 #define LINUX_DRM_IOCTL_IRQ_BUSID 0x6403 #define LINUX_DRM_IOCTL_SET_UNIQUE 0x6410 #define LINUX_DRM_IOCTL_AUTH_MAGIC 0x6411 #define LINUX_DRM_IOCTL_BLOCK 0x6412 #define LINUX_DRM_IOCTL_UNBLOCK 0x6413 #define LINUX_DRM_IOCTL_CONTROL 0x6414 #define LINUX_DRM_IOCTL_ADD_MAP 0x6415 #define LINUX_DRM_IOCTL_ADD_BUFS 0x6416 #define LINUX_DRM_IOCTL_MARK_BUFS 0x6417 #define LINUX_DRM_IOCTL_INFO_BUFS 0x6418 #define LINUX_DRM_IOCTL_MAP_BUFS 0x6419 #define LINUX_DRM_IOCTL_FREE_BUFS 0x641a #define LINUX_DRM_IOCTL_ADD_CTX 0x6420 #define LINUX_DRM_IOCTL_RM_CTX 0x6421 #define LINUX_DRM_IOCTL_MOD_CTX 0x6422 #define LINUX_DRM_IOCTL_GET_CTX 0x6423 #define LINUX_DRM_IOCTL_SWITCH_CTX 0x6424 #define LINUX_DRM_IOCTL_NEW_CTX 0x6425 #define LINUX_DRM_IOCTL_RES_CTX 0x6426 #define LINUX_DRM_IOCTL_ADD_DRAW 0x6427 #define LINUX_DRM_IOCTL_RM_DRAW 0x6428 #define LINUX_DRM_IOCTL_DMA 0x6429 #define LINUX_DRM_IOCTL_LOCK 0x642a #define LINUX_DRM_IOCTL_UNLOCK 0x642b #define LINUX_DRM_IOCTL_FINISH 0x642c /* dri/agp ioctls */ #define LINUX_DRM_IOCTL_AGP_ACQUIRE 0x6430 #define LINUX_DRM_IOCTL_AGP_RELEASE 0x6431 #define LINUX_DRM_IOCTL_AGP_ENABLE 0x6432 #define LINUX_DRM_IOCTL_AGP_INFO 0x6433 #define LINUX_DRM_IOCTL_AGP_ALLOC 0x6434 #define LINUX_DRM_IOCTL_AGP_FREE 0x6435 #define LINUX_DRM_IOCTL_AGP_BIND 0x6436 #define LINUX_DRM_IOCTL_AGP_UNBIND 0x6437 /* mga G400 specific ioctls */ #define LINUX_DRM_IOCTL_MGA_INIT 0x6440 #define LINUX_DRM_IOCTL_MGA_SWAP 0x6441 #define LINUX_DRM_IOCTL_MGA_CLEAR 0x6442 #define LINUX_DRM_IOCTL_MGA_ILOAD 0x6443 #define LINUX_DRM_IOCTL_MGA_VERTEX 0x6444 #define LINUX_DRM_IOCTL_MGA_FLUSH 0x6445 #define LINUX_DRM_IOCTL_MGA_INDICES 0x6446 #define LINUX_DRM_IOCTL_MGA_SOMETHING 0x6447 /* I810 specific ioctls */ #define LINUX_DRM_IOCTL_I810_INIT 0x6440 #define LINUX_DRM_IOCTL_I810_VERTEX 0x6441 #define LINUX_DRM_IOCTL_I810_CLEAR 0x6442 #define LINUX_DRM_IOCTL_I810_FLUSH 0x6443 #define LINUX_DRM_IOCTL_I810_GETAGE 0x6444 #define LINUX_DRM_IOCTL_I810_GETBUF 0x6445 #define LINUX_DRM_IOCTL_I810_SWAP 0x6446 /* Rage 128 specific ioctls */ #define LINUX_DRM_IOCTL_R128_INIT 0x6440 #define LINUX_DRM_IOCTL_R128_RESET 0x6441 #define LINUX_DRM_IOCTL_R128_FLUSH 0x6442 #define LINUX_DRM_IOCTL_R128_CCEID 0x6443 #define LINUX_DRM_IOCTL_R128_PACKET 0x6444 #define LINUX_DRM_IOCTL_R128_VERTEX 0x6445 /* card specific ioctls may increase the DRM_MAX */ #define LINUX_IOCTL_DRM_MIN LINUX_DRM_IOCTL_VERSION #define LINUX_IOCTL_DRM_MAX LINUX_DRM_IOCTL_MGA_SOMETHING #endif /* !_LINUX_IOCTL_H_ */ --==_Exmh_-15466650710 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable The views expressed above are not those of PGS Tensor. "We've heard that a million monkeys at a million keyboards could prod= uce the Complete Works of Shakespeare; now, thanks to the Internet, we k= now this is not true." Robert Wilensky, University of Califor= nia --==_Exmh_-15466650710-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-multimedia" in the body of the message