1f93b9c36SSascha Wildner.\" $NetBSD: ioctl.9,v 1.26 2008/11/12 12:35:54 ad Exp $ 2f93b9c36SSascha Wildner.\" 3f93b9c36SSascha Wildner.\" Copyright (c) 1999 The NetBSD Foundation, Inc. 4f93b9c36SSascha Wildner.\" All rights reserved. 5f93b9c36SSascha Wildner.\" 6f93b9c36SSascha Wildner.\" This code is derived from software contributed to The NetBSD Foundation 7f93b9c36SSascha Wildner.\" by Heiko W.Rupp <hwr@pilhuhn.de> 8f93b9c36SSascha Wildner.\" 9f93b9c36SSascha Wildner.\" Redistribution and use in source and binary forms, with or without 10f93b9c36SSascha Wildner.\" modification, are permitted provided that the following conditions 11f93b9c36SSascha Wildner.\" are met: 12f93b9c36SSascha Wildner.\" 1. Redistributions of source code must retain the above copyright 13f93b9c36SSascha Wildner.\" notice, this list of conditions and the following disclaimer. 14f93b9c36SSascha Wildner.\" 2. Redistributions in binary form must reproduce the above copyright 15f93b9c36SSascha Wildner.\" notice, this list of conditions and the following disclaimer in the 16f93b9c36SSascha Wildner.\" documentation and/or other materials provided with the distribution. 17f93b9c36SSascha Wildner.\" 18f93b9c36SSascha Wildner.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19f93b9c36SSascha Wildner.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20f93b9c36SSascha Wildner.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21f93b9c36SSascha Wildner.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22f93b9c36SSascha Wildner.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23f93b9c36SSascha Wildner.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24f93b9c36SSascha Wildner.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25f93b9c36SSascha Wildner.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26f93b9c36SSascha Wildner.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27f93b9c36SSascha Wildner.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28f93b9c36SSascha Wildner.\" POSSIBILITY OF SUCH DAMAGE. 29f93b9c36SSascha Wildner.\" 30*2352f0a1SSascha Wildner.Dd June 20, 2015 31f93b9c36SSascha Wildner.Dt IOCTL 9 32f93b9c36SSascha Wildner.Os 33f93b9c36SSascha Wildner.Sh NAME 34f93b9c36SSascha Wildner.Nm ioctl , 35f93b9c36SSascha Wildner.Nm _IO , 36f93b9c36SSascha Wildner.Nm _IOR , 37f93b9c36SSascha Wildner.Nm _IOW , 38f93b9c36SSascha Wildner.Nm _IOWR 39f93b9c36SSascha Wildner.Nd "how to implement a new ioctl call to access device drivers" 40f93b9c36SSascha Wildner.Sh SYNOPSIS 41f93b9c36SSascha Wildner.In sys/ioctl.h 42f93b9c36SSascha Wildner.In sys/ioccom.h 43f93b9c36SSascha Wildner.Ft int 44f93b9c36SSascha Wildner.Fn ioctl "int d" "unsigned long request" "..." 45f93b9c36SSascha Wildner.Fn _IO "g" "t" 46f93b9c36SSascha Wildner.Fn _IOR "g" "n" "t" 47f93b9c36SSascha Wildner.Fn _IOW "g" "n" "t" 48f93b9c36SSascha Wildner.Fn _IOWR "g" "n" "t" 49f93b9c36SSascha Wildner.Sh DESCRIPTION 50f93b9c36SSascha WildnerWhenever an 51f93b9c36SSascha Wildner.Xr ioctl 2 52f93b9c36SSascha Wildnercall is made, the kernel dispatches it to the device driver 53f93b9c36SSascha Wildnerwhich can then interpret the request number and data in a specialized 54f93b9c36SSascha Wildnermanner. 55f93b9c36SSascha WildnerIoctls are defined as: 56f93b9c36SSascha Wildner.Bd -literal 57f93b9c36SSascha Wildner#define MYDEVIOCTL fun(g, n, t) 58f93b9c36SSascha Wildner.Ed 59f93b9c36SSascha Wildner.Pp 60f93b9c36SSascha Wildnerwhere the different symbols correspond to: 61f93b9c36SSascha Wildner.Bl -tag -width ".Dv MYDEVIOCTL" 62f93b9c36SSascha Wildner.It Dv MYDEVIOCTL 63f93b9c36SSascha WildnerThe name which will later be given in the 64f93b9c36SSascha Wildner.Xr ioctl 2 65f93b9c36SSascha Wildnersystem call as second argument, e.g., 66f93b9c36SSascha Wildner.Bd -literal 67f93b9c36SSascha Wildnerioctl(fd, MYDEVIOCTL, ...) 68f93b9c36SSascha Wildner.Ed 69f93b9c36SSascha Wildner.It Fn fun 70f93b9c36SSascha WildnerA macro which can be one of: 71f93b9c36SSascha Wildner.Bl -tag -width ".Fn _IOWR" 72f93b9c36SSascha Wildner.It Fn _IO 73f93b9c36SSascha WildnerThe call is a simple message to the kernel by itself. 74f93b9c36SSascha WildnerIt does not copy anything into the kernel, nor does it want anything back. 75f93b9c36SSascha Wildner.It Fn _IOR 76f93b9c36SSascha WildnerThe call only reads parameters from the kernel and does not 77f93b9c36SSascha Wildnerpass any to it. 78f93b9c36SSascha Wildner.It Fn _IOW 79f93b9c36SSascha WildnerThe call only writes parameters to the kernel, but does not want anything 80f93b9c36SSascha Wildnerback. 81f93b9c36SSascha Wildner.It Fn _IOWR 82f93b9c36SSascha WildnerThe call writes data to the kernel and wants information back. 83f93b9c36SSascha Wildner.El 84f93b9c36SSascha Wildner.Pp 85f93b9c36SSascha WildnerWe always consider reading or writing to the kernel, from the user perspective. 86f93b9c36SSascha Wildner.It Fa g 87f93b9c36SSascha WildnerThis integer describes to which subsystem the ioctl applies. 88f93b9c36SSascha WildnerHere are some examples: 89f93b9c36SSascha Wildner.Pp 90f93b9c36SSascha Wildner.Bl -tag -width xxxxx -compact 91f685c57dSSascha Wildner.It '5' 92f685c57dSSascha Wildner.Xr perfmon 4 93f685c57dSSascha Wildner.It '8' 94f685c57dSSascha Wildner.Xr aac 4 95f93b9c36SSascha Wildner.It 'a' 96f93b9c36SSascha Wildner.Xr nata 4 97f685c57dSSascha Wildner.It 'B' 98f93b9c36SSascha Wildner.Xr bpf 4 99f685c57dSSascha Wildner.It 'C' 100f685c57dSSascha Wildner.Xr ciss 4 101f685c57dSSascha Wildner.It 'd' 102f685c57dSSascha Wildner.Xr disklabel 5 103f685c57dSSascha Wildner.It 'd' 104f685c57dSSascha Wildnerdiskslice 105f685c57dSSascha Wildner.It 'f' 106f685c57dSSascha Wildnergeneric file-descriptor 107f685c57dSSascha Wildner.It 'F' 108f685c57dSSascha Wildnerframe buffer 109f93b9c36SSascha Wildner.It 'h' 110f93b9c36SSascha Wildner.Xr HAMMER 5 111f685c57dSSascha Wildner.It 'i' 112f685c57dSSascha Wildner.Xr iic 4 113f685c57dSSascha Wildner.It 'i' 114f685c57dSSascha Wildner.Xr carp 4 115f685c57dSSascha Wildner.It 'i' 116f685c57dSSascha Wildner.Xr gre 4 117f685c57dSSascha Wildner.It 'k' 118f685c57dSSascha Wildner.Xr keyboard 4 119f685c57dSSascha Wildnerand 120f685c57dSSascha Wildner.Xr syscons 4 121f685c57dSSascha Wildner.It 'm' 122f685c57dSSascha Wildner.Xr mem 4 123f685c57dSSascha Wildner.It 'm' 124f685c57dSSascha Wildner.Pa /dev/midi 125f685c57dSSascha Wildner.It 'm' 126f685c57dSSascha Wildner.Xr mtio 4 127f685c57dSSascha Wildner.It 'n' 128f685c57dSSascha Wildner.Xr smb 4 129f685c57dSSascha Wildner.It 'n' 130f685c57dSSascha WildnerNetWare volume mount 131f685c57dSSascha Wildner.It 'p' 132f685c57dSSascha Wildner.Pa /dev/dsp 133f685c57dSSascha Wildnerand 134f685c57dSSascha Wildner.Pa /dev/audio 135f685c57dSSascha Wildner.It 'p' 136f685c57dSSascha Wildner.Xr pci 4 137f685c57dSSascha Wildner.It 'p' 138f685c57dSSascha Wildner.Xr ppbus 4 139f685c57dSSascha Wildner.It 'P' 140*2352f0a1SSascha Wildner.Nm apm (deprecated) 141f685c57dSSascha Wildner.It 'q' 142f685c57dSSascha Wildner.Pa /dev/sequencer 143f685c57dSSascha Wildner.It 'r' 144f685c57dSSascha Wildnerrandom number generator 145f93b9c36SSascha Wildner.It 't' 146f685c57dSSascha Wildner.Xr tty 4 147f685c57dSSascha Wildner.It 't' 148f685c57dSSascha Wildner.Xr ppp 4 149f685c57dSSascha Wildner.It 't' 150f685c57dSSascha Wildner.Xr tap 4 151f685c57dSSascha Wildner.It 't' 152f685c57dSSascha Wildner.Xr tun 4 153f685c57dSSascha Wildner.It 't' 154f685c57dSSascha WildnerSLIP ttys 155f685c57dSSascha Wildner.It 'T' 156f685c57dSSascha Wildner.Xr snp 4 157f685c57dSSascha Wildner.\".It 'V' 158f685c57dSSascha Wildner.\"VMware 159f93b9c36SSascha Wildner.El 160f93b9c36SSascha Wildner.It Fa n 161f93b9c36SSascha WildnerThis number uniquely identifies the ioctl within the group. 162f93b9c36SSascha WildnerThat said, two subsystems may share the same 163f93b9c36SSascha Wildner.Fa g , 164f93b9c36SSascha Wildnerbut there may be only one 165f93b9c36SSascha Wildner.Fa n 166f93b9c36SSascha Wildnerfor a given 167f93b9c36SSascha Wildner.Fa g . 168f93b9c36SSascha WildnerThis is an unsigned 8 bit number. 169f93b9c36SSascha Wildner.It Fa t 170f93b9c36SSascha WildnerThis specifies the type of the passed parameter. 171f93b9c36SSascha WildnerThis one gets internally transformed to the size of the parameter, so 172f93b9c36SSascha Wildnerfor example, if you want to pass a structure, then you have to specify that 173f93b9c36SSascha Wildnerstructure and not a pointer to it or sizeof(struct MYDEV). 174f93b9c36SSascha Wildner.El 175f93b9c36SSascha Wildner.Pp 176f93b9c36SSascha WildnerIn order for the new ioctl to be visible to the system, it is installed 177f93b9c36SSascha Wildnerin either 178f93b9c36SSascha Wildner.In sys/ioctl.h or one of the files that are reached from 179f93b9c36SSascha Wildner.In sys/ioctl.h . 180a68e0df0SSascha Wildner.Sh RETURN VALUES 181a68e0df0SSascha WildnerA distinction must be made at this point. 182a68e0df0SSascha WildnerAll 183a68e0df0SSascha Wildner.Fn *_ioctl 184a68e0df0SSascha Wildnerroutines from 185a68e0df0SSascha Wildner.Em within kernel 186a68e0df0SSascha Wildnershould return either 0 for success 187a68e0df0SSascha Wildneror a defined error code, as described in 188a68e0df0SSascha Wildner.In sys/errno.h . 189a68e0df0SSascha WildnerAt the libc level though a conversion takes place, so that eventually 190a68e0df0SSascha Wildner.Xr ioctl 2 191a68e0df0SSascha Wildnerreturns either 0 for success or -1 for failure, in which case the 192a68e0df0SSascha Wildner.Va errno 193a68e0df0SSascha Wildnervariable is set accordingly. 194a68e0df0SSascha Wildner.Pp 195a68e0df0SSascha WildnerThe use of magic numbers such as -1, to indicate that a given ioctl 196a68e0df0SSascha Wildnercode was not handled, is strongly discouraged. 197a68e0df0SSascha WildnerThe value -1 is bound to the 198a68e0df0SSascha Wildner.Er ERESTART 199a68e0df0SSascha Wildnerpseudo-error, which is returned inside kernel to modify return to process. 200f93b9c36SSascha Wildner.Sh EXAMPLES 201f93b9c36SSascha WildnerLet's suppose that we want to pass an integer value to the kernel. 202f93b9c36SSascha WildnerFrom the user point of view, this is like writing to the kernel. 203f93b9c36SSascha WildnerSo we define the ioctl as: 204f93b9c36SSascha Wildner.Bd -literal -offset indent 205f93b9c36SSascha Wildner#define MYDEVIOCTL _IOW('i', 25, int) 206f93b9c36SSascha Wildner.Ed 207f93b9c36SSascha Wildner.Pp 208f93b9c36SSascha WildnerWithin the 209f93b9c36SSascha Wildner.Fn *_ioctl 210f93b9c36SSascha Wildnerroutine of the driver, it can be then accessed like: 211f93b9c36SSascha Wildner.Bd -literal -offset indent 212f93b9c36SSascha Wildnerint 213f685c57dSSascha Wildnermydev_ioctl(struct dev_ioctl_args *ap) 214f93b9c36SSascha Wildner{ 215f93b9c36SSascha Wildner int error; 216f93b9c36SSascha Wildner int *a; 217f93b9c36SSascha Wildner 218f93b9c36SSascha Wildner switch (ap->a_cmd) { 219f93b9c36SSascha Wildner case MYDEVIOCTL: 220f93b9c36SSascha Wildner a = (int *)ap->data; 221f93b9c36SSascha Wildner kprintf("Value passed from userspace: %d\\n", *a); 222f93b9c36SSascha Wildner return (0); /* Success */ 223f93b9c36SSascha Wildner break; 224f93b9c36SSascha Wildner 225f93b9c36SSascha Wildner /* Handle other ioctls here */ 226f93b9c36SSascha Wildner 227f93b9c36SSascha Wildner default: 228f93b9c36SSascha Wildner /* Inappropriate ioctl for device */ 229f93b9c36SSascha Wildner error = ENOTTY; 230f93b9c36SSascha Wildner break; 231f93b9c36SSascha Wildner } 232f93b9c36SSascha Wildner 233f93b9c36SSascha Wildner return (error); 234f93b9c36SSascha Wildner} 235f93b9c36SSascha Wildner.Ed 236f93b9c36SSascha Wildner.Pp 237f93b9c36SSascha WildnerIn userspace: 238f93b9c36SSascha Wildner.Bd -literal -offset indent 239f93b9c36SSascha Wildnerint a = 101; 240f93b9c36SSascha Wildnerif (ioctl(fd, MYDEVIOCTL, \*[Am]a) == -1) { 241f93b9c36SSascha Wildner /* Handle failure */ 242f93b9c36SSascha Wildner} 243f93b9c36SSascha Wildner.Ed 244f93b9c36SSascha Wildner.Sh SEE ALSO 245f93b9c36SSascha Wildner.Xr ioctl 2 246