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.\" 308970d9e9SSascha Wildner.Dd August 10, 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 1058970d9e9SSascha Wildner.It 'd' 1068970d9e9SSascha Wildner.Xr drm 4 107f685c57dSSascha Wildner.It 'f' 108f685c57dSSascha Wildnergeneric file-descriptor 109f685c57dSSascha Wildner.It 'F' 110f685c57dSSascha Wildnerframe buffer 111f93b9c36SSascha Wildner.It 'h' 112f93b9c36SSascha Wildner.Xr HAMMER 5 113f685c57dSSascha Wildner.It 'i' 114f685c57dSSascha Wildner.Xr iic 4 115f685c57dSSascha Wildner.It 'i' 116f685c57dSSascha Wildner.Xr carp 4 117f685c57dSSascha Wildner.It 'i' 118f685c57dSSascha Wildner.Xr gre 4 119f685c57dSSascha Wildner.It 'k' 120f685c57dSSascha Wildner.Xr keyboard 4 121f685c57dSSascha Wildnerand 122f685c57dSSascha Wildner.Xr syscons 4 123f685c57dSSascha Wildner.It 'm' 124f685c57dSSascha Wildner.Xr mem 4 125f685c57dSSascha Wildner.It 'm' 126f685c57dSSascha Wildner.Pa /dev/midi 127f685c57dSSascha Wildner.It 'm' 128f685c57dSSascha Wildner.Xr mtio 4 1298970d9e9SSascha Wildner.It 'M' 1308970d9e9SSascha Wildner.Xr sound 4 1318970d9e9SSascha Wildnermixer 132f685c57dSSascha Wildner.It 'n' 133f685c57dSSascha Wildner.Xr smb 4 134f685c57dSSascha Wildner.It 'n' 135f685c57dSSascha WildnerNetWare volume mount 136f685c57dSSascha Wildner.It 'p' 137f685c57dSSascha Wildner.Pa /dev/dsp 138f685c57dSSascha Wildnerand 139f685c57dSSascha Wildner.Pa /dev/audio 140f685c57dSSascha Wildner.It 'p' 141f685c57dSSascha Wildner.Xr pci 4 142f685c57dSSascha Wildner.It 'p' 143f685c57dSSascha Wildner.Xr ppbus 4 144*d0981ce5SSascha Wildner.It 'p' 145*d0981ce5SSascha Wildner.Xr procfs 5 146f685c57dSSascha Wildner.It 'P' 1472352f0a1SSascha Wildner.Nm apm (deprecated) 148f685c57dSSascha Wildner.It 'q' 149f685c57dSSascha Wildner.Pa /dev/sequencer 150f685c57dSSascha Wildner.It 'r' 151f685c57dSSascha Wildnerrandom number generator 152f93b9c36SSascha Wildner.It 't' 153f685c57dSSascha Wildner.Xr tty 4 154f685c57dSSascha Wildner.It 't' 155f685c57dSSascha Wildner.Xr ppp 4 156f685c57dSSascha Wildner.It 't' 157f685c57dSSascha Wildner.Xr tap 4 158f685c57dSSascha Wildner.It 't' 159f685c57dSSascha Wildner.Xr tun 4 160f685c57dSSascha Wildner.It 't' 161f685c57dSSascha WildnerSLIP ttys 162f685c57dSSascha Wildner.It 'T' 163f685c57dSSascha Wildner.Xr snp 4 164f685c57dSSascha Wildner.\".It 'V' 165f685c57dSSascha Wildner.\"VMware 166f93b9c36SSascha Wildner.El 167f93b9c36SSascha Wildner.It Fa n 168f93b9c36SSascha WildnerThis number uniquely identifies the ioctl within the group. 169f93b9c36SSascha WildnerThat said, two subsystems may share the same 170f93b9c36SSascha Wildner.Fa g , 171f93b9c36SSascha Wildnerbut there may be only one 172f93b9c36SSascha Wildner.Fa n 173f93b9c36SSascha Wildnerfor a given 174f93b9c36SSascha Wildner.Fa g . 175f93b9c36SSascha WildnerThis is an unsigned 8 bit number. 176f93b9c36SSascha Wildner.It Fa t 177f93b9c36SSascha WildnerThis specifies the type of the passed parameter. 178f93b9c36SSascha WildnerThis one gets internally transformed to the size of the parameter, so 179f93b9c36SSascha Wildnerfor example, if you want to pass a structure, then you have to specify that 180f93b9c36SSascha Wildnerstructure and not a pointer to it or sizeof(struct MYDEV). 181f93b9c36SSascha Wildner.El 182f93b9c36SSascha Wildner.Pp 183f93b9c36SSascha WildnerIn order for the new ioctl to be visible to the system, it is installed 184f93b9c36SSascha Wildnerin either 185f93b9c36SSascha Wildner.In sys/ioctl.h or one of the files that are reached from 186f93b9c36SSascha Wildner.In sys/ioctl.h . 187a68e0df0SSascha Wildner.Sh RETURN VALUES 188a68e0df0SSascha WildnerA distinction must be made at this point. 189a68e0df0SSascha WildnerAll 190a68e0df0SSascha Wildner.Fn *_ioctl 191a68e0df0SSascha Wildnerroutines from 192a68e0df0SSascha Wildner.Em within kernel 193a68e0df0SSascha Wildnershould return either 0 for success 194a68e0df0SSascha Wildneror a defined error code, as described in 195a68e0df0SSascha Wildner.In sys/errno.h . 196a68e0df0SSascha WildnerAt the libc level though a conversion takes place, so that eventually 197a68e0df0SSascha Wildner.Xr ioctl 2 198a68e0df0SSascha Wildnerreturns either 0 for success or -1 for failure, in which case the 199a68e0df0SSascha Wildner.Va errno 200a68e0df0SSascha Wildnervariable is set accordingly. 201a68e0df0SSascha Wildner.Pp 202a68e0df0SSascha WildnerThe use of magic numbers such as -1, to indicate that a given ioctl 203a68e0df0SSascha Wildnercode was not handled, is strongly discouraged. 204a68e0df0SSascha WildnerThe value -1 is bound to the 205a68e0df0SSascha Wildner.Er ERESTART 206a68e0df0SSascha Wildnerpseudo-error, which is returned inside kernel to modify return to process. 207f93b9c36SSascha Wildner.Sh EXAMPLES 208f93b9c36SSascha WildnerLet's suppose that we want to pass an integer value to the kernel. 209f93b9c36SSascha WildnerFrom the user point of view, this is like writing to the kernel. 210f93b9c36SSascha WildnerSo we define the ioctl as: 211f93b9c36SSascha Wildner.Bd -literal -offset indent 212f93b9c36SSascha Wildner#define MYDEVIOCTL _IOW('i', 25, int) 213f93b9c36SSascha Wildner.Ed 214f93b9c36SSascha Wildner.Pp 215f93b9c36SSascha WildnerWithin the 216f93b9c36SSascha Wildner.Fn *_ioctl 217f93b9c36SSascha Wildnerroutine of the driver, it can be then accessed like: 218f93b9c36SSascha Wildner.Bd -literal -offset indent 219f93b9c36SSascha Wildnerint 220f685c57dSSascha Wildnermydev_ioctl(struct dev_ioctl_args *ap) 221f93b9c36SSascha Wildner{ 222f93b9c36SSascha Wildner int error; 223f93b9c36SSascha Wildner int *a; 224f93b9c36SSascha Wildner 225f93b9c36SSascha Wildner switch (ap->a_cmd) { 226f93b9c36SSascha Wildner case MYDEVIOCTL: 227f93b9c36SSascha Wildner a = (int *)ap->data; 228f93b9c36SSascha Wildner kprintf("Value passed from userspace: %d\\n", *a); 229f93b9c36SSascha Wildner return (0); /* Success */ 230f93b9c36SSascha Wildner break; 231f93b9c36SSascha Wildner 232f93b9c36SSascha Wildner /* Handle other ioctls here */ 233f93b9c36SSascha Wildner 234f93b9c36SSascha Wildner default: 235f93b9c36SSascha Wildner /* Inappropriate ioctl for device */ 236f93b9c36SSascha Wildner error = ENOTTY; 237f93b9c36SSascha Wildner break; 238f93b9c36SSascha Wildner } 239f93b9c36SSascha Wildner 240f93b9c36SSascha Wildner return (error); 241f93b9c36SSascha Wildner} 242f93b9c36SSascha Wildner.Ed 243f93b9c36SSascha Wildner.Pp 244f93b9c36SSascha WildnerIn userspace: 245f93b9c36SSascha Wildner.Bd -literal -offset indent 246f93b9c36SSascha Wildnerint a = 101; 247f93b9c36SSascha Wildnerif (ioctl(fd, MYDEVIOCTL, \*[Am]a) == -1) { 248f93b9c36SSascha Wildner /* Handle failure */ 249f93b9c36SSascha Wildner} 250f93b9c36SSascha Wildner.Ed 251f93b9c36SSascha Wildner.Sh SEE ALSO 252f93b9c36SSascha Wildner.Xr ioctl 2 253