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*82b0523aSSascha Wildner.Dd October 4, 2018 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/ioccom.h 42f93b9c36SSascha Wildner.Fn _IO "g" "t" 43f93b9c36SSascha Wildner.Fn _IOR "g" "n" "t" 44f93b9c36SSascha Wildner.Fn _IOW "g" "n" "t" 45f93b9c36SSascha Wildner.Fn _IOWR "g" "n" "t" 46f93b9c36SSascha Wildner.Sh DESCRIPTION 47f93b9c36SSascha WildnerWhenever an 48f93b9c36SSascha Wildner.Xr ioctl 2 49f93b9c36SSascha Wildnercall is made, the kernel dispatches it to the device driver 50f93b9c36SSascha Wildnerwhich can then interpret the request number and data in a specialized 51f93b9c36SSascha Wildnermanner. 52f93b9c36SSascha WildnerIoctls are defined as: 53f93b9c36SSascha Wildner.Bd -literal 54f93b9c36SSascha Wildner#define MYDEVIOCTL fun(g, n, t) 55f93b9c36SSascha Wildner.Ed 56f93b9c36SSascha Wildner.Pp 57f93b9c36SSascha Wildnerwhere the different symbols correspond to: 58f93b9c36SSascha Wildner.Bl -tag -width ".Dv MYDEVIOCTL" 59f93b9c36SSascha Wildner.It Dv MYDEVIOCTL 60f93b9c36SSascha WildnerThe name which will later be given in the 61f93b9c36SSascha Wildner.Xr ioctl 2 62f93b9c36SSascha Wildnersystem call as second argument, e.g., 63f93b9c36SSascha Wildner.Bd -literal 64f93b9c36SSascha Wildnerioctl(fd, MYDEVIOCTL, ...) 65f93b9c36SSascha Wildner.Ed 66f93b9c36SSascha Wildner.It Fn fun 67f93b9c36SSascha WildnerA macro which can be one of: 68f93b9c36SSascha Wildner.Bl -tag -width ".Fn _IOWR" 69f93b9c36SSascha Wildner.It Fn _IO 70f93b9c36SSascha WildnerThe call is a simple message to the kernel by itself. 71f93b9c36SSascha WildnerIt does not copy anything into the kernel, nor does it want anything back. 72f93b9c36SSascha Wildner.It Fn _IOR 73f93b9c36SSascha WildnerThe call only reads parameters from the kernel and does not 74f93b9c36SSascha Wildnerpass any to it. 75f93b9c36SSascha Wildner.It Fn _IOW 76f93b9c36SSascha WildnerThe call only writes parameters to the kernel, but does not want anything 77f93b9c36SSascha Wildnerback. 78f93b9c36SSascha Wildner.It Fn _IOWR 79f93b9c36SSascha WildnerThe call writes data to the kernel and wants information back. 80f93b9c36SSascha Wildner.El 81f93b9c36SSascha Wildner.Pp 82f93b9c36SSascha WildnerWe always consider reading or writing to the kernel, from the user perspective. 83f93b9c36SSascha Wildner.It Fa g 84f93b9c36SSascha WildnerThis integer describes to which subsystem the ioctl applies. 85f93b9c36SSascha WildnerHere are some examples: 86f93b9c36SSascha Wildner.Pp 87f93b9c36SSascha Wildner.Bl -tag -width xxxxx -compact 88f685c57dSSascha Wildner.It '8' 89f685c57dSSascha Wildner.Xr aac 4 90f93b9c36SSascha Wildner.It 'a' 91f93b9c36SSascha Wildner.Xr nata 4 92f685c57dSSascha Wildner.It 'B' 93f93b9c36SSascha Wildner.Xr bpf 4 94f685c57dSSascha Wildner.It 'C' 951501e71cSSascha Wildner.Xr cam 4 961501e71cSSascha Wildner.It 'C' 97f685c57dSSascha Wildner.Xr ciss 4 98f685c57dSSascha Wildner.It 'd' 99f685c57dSSascha Wildner.Xr disklabel 5 100f685c57dSSascha Wildner.It 'd' 101f685c57dSSascha Wildnerdiskslice 1028970d9e9SSascha Wildner.It 'd' 1038970d9e9SSascha Wildner.Xr drm 4 104f685c57dSSascha Wildner.It 'f' 105f685c57dSSascha Wildnergeneric file-descriptor 106f685c57dSSascha Wildner.It 'F' 107f685c57dSSascha Wildnerframe buffer 108f93b9c36SSascha Wildner.It 'h' 109f93b9c36SSascha Wildner.Xr HAMMER 5 110f685c57dSSascha Wildner.It 'i' 111f685c57dSSascha Wildner.Xr iic 4 112f685c57dSSascha Wildner.It 'i' 113f685c57dSSascha Wildner.Xr carp 4 114f685c57dSSascha Wildner.It 'i' 115f685c57dSSascha Wildner.Xr gre 4 116f685c57dSSascha Wildner.It 'k' 117f685c57dSSascha Wildner.Xr keyboard 4 118f685c57dSSascha Wildnerand 119f685c57dSSascha Wildner.Xr syscons 4 120f685c57dSSascha Wildner.It 'm' 121f685c57dSSascha Wildner.Xr mem 4 122f685c57dSSascha Wildner.It 'm' 123f685c57dSSascha Wildner.Pa /dev/midi 124f685c57dSSascha Wildner.It 'm' 125f685c57dSSascha Wildner.Xr mtio 4 1268970d9e9SSascha Wildner.It 'M' 1278970d9e9SSascha Wildner.Xr sound 4 1288970d9e9SSascha Wildnermixer 129f685c57dSSascha Wildner.It 'n' 130f685c57dSSascha Wildner.Xr smb 4 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 139d0981ce5SSascha Wildner.It 'p' 140d0981ce5SSascha Wildner.Xr procfs 5 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 tap 4 149f685c57dSSascha Wildner.It 't' 150f685c57dSSascha Wildner.Xr tun 4 151f685c57dSSascha Wildner.It 't' 152f685c57dSSascha WildnerSLIP ttys 153f685c57dSSascha Wildner.It 'T' 154f685c57dSSascha Wildner.Xr snp 4 155f93b9c36SSascha Wildner.El 156f93b9c36SSascha Wildner.It Fa n 157f93b9c36SSascha WildnerThis number uniquely identifies the ioctl within the group. 158f93b9c36SSascha WildnerThat said, two subsystems may share the same 159f93b9c36SSascha Wildner.Fa g , 160f93b9c36SSascha Wildnerbut there may be only one 161f93b9c36SSascha Wildner.Fa n 162f93b9c36SSascha Wildnerfor a given 163f93b9c36SSascha Wildner.Fa g . 164f93b9c36SSascha WildnerThis is an unsigned 8 bit number. 165f93b9c36SSascha Wildner.It Fa t 166f93b9c36SSascha WildnerThis specifies the type of the passed parameter. 167f93b9c36SSascha WildnerThis one gets internally transformed to the size of the parameter, so 168f93b9c36SSascha Wildnerfor example, if you want to pass a structure, then you have to specify that 169f93b9c36SSascha Wildnerstructure and not a pointer to it or sizeof(struct MYDEV). 170f93b9c36SSascha Wildner.El 171f93b9c36SSascha Wildner.Pp 172f93b9c36SSascha WildnerIn order for the new ioctl to be visible to the system, it is installed 173f93b9c36SSascha Wildnerin either 174f93b9c36SSascha Wildner.In sys/ioctl.h or one of the files that are reached from 175f93b9c36SSascha Wildner.In sys/ioctl.h . 176a68e0df0SSascha Wildner.Sh RETURN VALUES 177a68e0df0SSascha WildnerA distinction must be made at this point. 178a68e0df0SSascha WildnerAll 179a68e0df0SSascha Wildner.Fn *_ioctl 180a68e0df0SSascha Wildnerroutines from 181a68e0df0SSascha Wildner.Em within kernel 182a68e0df0SSascha Wildnershould return either 0 for success 183a68e0df0SSascha Wildneror a defined error code, as described in 184a68e0df0SSascha Wildner.In sys/errno.h . 185a68e0df0SSascha WildnerAt the libc level though a conversion takes place, so that eventually 186a68e0df0SSascha Wildner.Xr ioctl 2 187a68e0df0SSascha Wildnerreturns either 0 for success or -1 for failure, in which case the 188a68e0df0SSascha Wildner.Va errno 189a68e0df0SSascha Wildnervariable is set accordingly. 190a68e0df0SSascha Wildner.Pp 191a68e0df0SSascha WildnerThe use of magic numbers such as -1, to indicate that a given ioctl 192a68e0df0SSascha Wildnercode was not handled, is strongly discouraged. 193a68e0df0SSascha WildnerThe value -1 is bound to the 194a68e0df0SSascha Wildner.Er ERESTART 195a68e0df0SSascha Wildnerpseudo-error, which is returned inside kernel to modify return to process. 196f93b9c36SSascha Wildner.Sh EXAMPLES 197f93b9c36SSascha WildnerLet's suppose that we want to pass an integer value to the kernel. 198f93b9c36SSascha WildnerFrom the user point of view, this is like writing to the kernel. 199f93b9c36SSascha WildnerSo we define the ioctl as: 200f93b9c36SSascha Wildner.Bd -literal -offset indent 201f93b9c36SSascha Wildner#define MYDEVIOCTL _IOW('i', 25, int) 202f93b9c36SSascha Wildner.Ed 203f93b9c36SSascha Wildner.Pp 204f93b9c36SSascha WildnerWithin the 205f93b9c36SSascha Wildner.Fn *_ioctl 206f93b9c36SSascha Wildnerroutine of the driver, it can be then accessed like: 207f93b9c36SSascha Wildner.Bd -literal -offset indent 208f93b9c36SSascha Wildnerint 209f685c57dSSascha Wildnermydev_ioctl(struct dev_ioctl_args *ap) 210f93b9c36SSascha Wildner{ 211f93b9c36SSascha Wildner int error; 212f93b9c36SSascha Wildner int *a; 213f93b9c36SSascha Wildner 214f93b9c36SSascha Wildner switch (ap->a_cmd) { 215f93b9c36SSascha Wildner case MYDEVIOCTL: 216f93b9c36SSascha Wildner a = (int *)ap->data; 217f93b9c36SSascha Wildner kprintf("Value passed from userspace: %d\\n", *a); 218f93b9c36SSascha Wildner return (0); /* Success */ 219f93b9c36SSascha Wildner break; 220f93b9c36SSascha Wildner 221f93b9c36SSascha Wildner /* Handle other ioctls here */ 222f93b9c36SSascha Wildner 223f93b9c36SSascha Wildner default: 224f93b9c36SSascha Wildner /* Inappropriate ioctl for device */ 225f93b9c36SSascha Wildner error = ENOTTY; 226f93b9c36SSascha Wildner break; 227f93b9c36SSascha Wildner } 228f93b9c36SSascha Wildner 229f93b9c36SSascha Wildner return (error); 230f93b9c36SSascha Wildner} 231f93b9c36SSascha Wildner.Ed 232f93b9c36SSascha Wildner.Pp 233f93b9c36SSascha WildnerIn userspace: 234f93b9c36SSascha Wildner.Bd -literal -offset indent 235f93b9c36SSascha Wildnerint a = 101; 236f93b9c36SSascha Wildnerif (ioctl(fd, MYDEVIOCTL, \*[Am]a) == -1) { 237f93b9c36SSascha Wildner /* Handle failure */ 238f93b9c36SSascha Wildner} 239f93b9c36SSascha Wildner.Ed 240f93b9c36SSascha Wildner.Sh SEE ALSO 241f93b9c36SSascha Wildner.Xr ioctl 2 242