xref: /netbsd-src/lib/libc/sys/modctl.2 (revision 8d1dd427526e8341268addd75196a0e19a27ba30)
1.\"	$NetBSD: modctl.2,v 1.19 2020/04/26 18:56:49 pgoyette Exp $
2.\"
3.\" Copyright (c) 2009 The NetBSD Foundation, Inc.
4.\" All rights reserved.
5.\"
6.\" Redistribution and use in source and binary forms, with or without
7.\" modification, are permitted provided that the following conditions
8.\" are met:
9.\" 1. Redistributions of source code must retain the above copyright
10.\"    notice, this list of conditions and the following disclaimer.
11.\" 2. Redistributions in binary form must reproduce the above copyright
12.\"    notice, this list of conditions and the following disclaimer in the
13.\"    documentation and/or other materials provided with the distribution.
14.\"
15.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25.\" POSSIBILITY OF SUCH DAMAGE.
26.\"
27.Dd April 26, 2020
28.Dt MODCTL 2
29.Os
30.Sh NAME
31.Nm modctl
32.Nd module control
33.Sh LIBRARY
34.Lb libc
35.Sh SYNOPSIS
36.In sys/module.h
37.Ft int
38.Fn modctl "int operation" "void *argp"
39.Sh DESCRIPTION
40.Fn modctl
41provides control over loaded kernel modules.
42The argument
43.Fa operation
44is one of
45.Dv MODCTL_LOAD ,
46.Dv MODCTL_UNLOAD ,
47.Dv MODCTL_STAT ,
48or
49.Dv MODCTL_EXISTS .
50The argument
51.Fa argp
52depends on the
53.Fa operation
54to be performed.
55.Pp
56Operations are:
57.Bl -tag -width MODCTL_UNLOAD
58.It Dv MODCTL_LOAD
59Load a module.
60The
61.Fa argp
62argument should be a pointer to a
63.Em modctl_load_t
64structure, described below.
65.It Dv MODCTL_UNLOAD
66Unload a module.
67In this case,
68.Fa argp
69should be a string containing the name of the module to be unloaded.
70.It Dv MODCTL_STAT
71Return a list of loaded modules.
72In this case, the
73.Fa argp
74argument should be a
75.Em struct iovec
76pointing to a suitable block of memory.
77The kernel will fill this block with
78.Bl -bullet
79.It
80a count of the number of modules loaded,
81.It
82an array of
83.Em modstat_t
84structures, one per loaded module, and
85.It
86a series of NUL-terminated strings containing the modules'
87required modules lists.
88.El
89.Pp
90If the block is not large enough, the data returned will be truncated
91to fit.
92The kernel will then update the
93.Fa iov_len
94member of the
95.Em iovec
96to reflect the size of the complete report, regardless of whether this
97is larger or smaller than the size passed in.
98.It Dv MODCTL_EXISTS
99Test to see if the kernel was compiled with
100.Dq options MODULAR
101and whether or
102not modules may be loaded at the moment.
103In this case,
104.Fa argp
105should be an integer.
106It should be
107.Dq 0
108to test if a user can load a module via
109.Dv MODCTL_LOAD ,
110or it should be
111.Dq 1
112to test if the system can autoload modules.
113Note that this
114test does not consider the sysctl
115.Li kern.module.autoload .
116.El
117.Ss Data Types
118The
119.Em modctl_load_t
120structure used with
121.Dv MODCTL_LOAD
122contains the following elements, which should be filled in by the caller:
123.Bl -tag -width aaaaaaaa
124.It Fa "const char *ml_filename"
125The name/path of the module to load.
126.It Fa "int ml_flags"
127Zero or more of the following flag values:
128.Bl -tag -compact -width "MODCTL_LOAD_FORCE"
129.It Dv MODCTL_NO_PROP
130Don't load
131.Ao module Ac Ns Pa .plist .
132.It Dv MODCTL_LOAD_FORCE
133Ignore kernel version mismatch.
134.El
135.It Fa "const char *ml_props"
136Externalized proplib dictionary to pass to module.
137.It Fa "size_t ml_propslen"
138Size of the dictionary blob.
139.Fa ml_props
140may be
141.Dv NULL
142in which case
143.Fa ml_propslen
144must be
145.Dv 0 .
146An upper limit of 4096 bytes is imposed on the value of ml_propslen.
147Attempting to load a proplib dictionary larger than this size will return
148.Er ENOMEM .
149.El
150.Pp
151The
152.Em modstat_t
153structure used with
154.Dv MODCTL_STAT
155contains the following elements, which are filled in by the kernel:
156.Bl -tag -width aaaaaaaa
157.It Fa "char ms_name[MAXMODNAME]"
158The name of the module.
159.It Fa "modsrc_t ms_source"
160One of the following enumerated constants:
161.Bl -tag -compact -width "MODULE_SOURCE_FILESYS"
162.It Dv MODULE_SOURCE_KERNEL
163The module is compiled into the kernel.
164.It Dv MODULE_SOURCE_BOOT
165The module was provided by the bootstrap loader.
166.It Dv MODULE_SOURCE_FILESYS
167The module was loaded from the file system.
168.El
169.It Fa "modclass_t ms_class"
170One of the following enumerated constants:
171.Bl -tag -compact -width "MODULE_SOURCE_FILESYS"
172.It Dv MODULE_CLASS_SECMODEL
173Security model.
174.It Dv MODULE_CLASS_VFS
175File system.
176.It Dv MODULE_CLASS_DRIVER
177Device driver.
178.It Dv MODULE_CLASS_EXEC
179Executable file format.
180.It Dv MODULE_CLASS_MISC
181Miscellaneous.
182.El
183.It Fa "uint64_t ms_addr"
184The load address within the kernel of the module's text segment.
185(This value is available only for privileged users.)
186.It Fa "u_int ms_size"
187Loaded size of the module's text segment.
188(This value is available only for privileged users.)
189.It Fa "u_int ms_refcnt"
190Current number of live references to this module.
191.It Fa "u_int ms_flags"
192The module's flags:
193.Bl -tag -compact -width "MODFLAG_AUTO_LOADED"
194.It Dv MODFLAG_MUST_FORCE
195The "force" flag must be specified to reload this module.
196.It Dv MODFLAG_AUTO_LOADED
197The module was auto-loaded by the operating system.
198.El
199.It Fa "uint_ms_reqoffset"
200The offset (in bytes) from the beginning of the required-module data.
201.El
202.Sh RETURN VALUES
203Upon successful completion, the value returned is 0.
204.Pp
205Otherwise, a value of \-1 is returned and
206.Va errno
207is set to indicate the error.
208.Sh ERRORS
209.Fn modctl
210will fail if:
211.Bl -tag -width Er
212.It Bq Er EBUSY
213The argument
214.Fa operation
215is
216.Dv MODCTL_UNLOAD
217and the module is in use or the module is compiled into the kernel.
218.It Bq Er EDEADLK
219The argument
220.Fa operation
221is
222.Dv MODCTL_LOAD
223and there is a circular dependency in the module's dependency chain.
224.It Bq Er EEXIST
225The argument
226.Fa operation
227is
228.Dv MODCTL_LOAD
229and the module is already loaded.
230.It Bq Er EFAULT
231A bad address was given for
232.Fa argp .
233.It Bq Er EFBIG
234The argument
235.Fa operation
236is
237.Dv MODCTL_LOAD ,
238the specified module resides in the file system, and the module's default
239proplib file was too large.
240.It Bq Er EINVAL
241The argument
242.Fa operation
243is invalid.
244.Pp
245The argument
246.Fa operation
247is
248.Dv MODCTL_LOAD
249and ml_props is not
250.Dv NULL
251and
252.Dq ml_propslen
253is
254.Dv 0 ,
255or
256ml_props is
257.Dv NULL
258and
259.Dq ml_propslen
260is not
261.Dv 0 .
262The kernel is unable to internalize the plist.
263Or, there is a problem with the module or <module>.plist.
264.It Bq Er ENAMETOOLONG
265A module name/path is too long.
266.It Bq Er ENOENT
267The argument
268.Fa operation
269is
270.Dv MODCTL_LOAD
271and the module or a dependency can't be found.
272.Pp
273The argument
274.Fa operation
275is
276.Dv MODCTL_UNLOAD
277and no module by the name of
278.Fa argp
279is loaded.
280.It Bq Er ENOEXEC
281The argument
282.Fa operation
283is
284.Dv MODCTL_LOAD
285and the module is not a valid object for the system.
286Most likely, one or more undefined symbols could not be resolved by the
287in-kernel linker.
288.It Bq Er ENOMEM
289There was not enough memory to perform the
290.Fa operation .
291.It Bq Er ENOSYS
292The argument
293.Fa operation
294is
295.Dv MODLOAD_EXIST
296and the kernel does not include
297.Dq options MODULAR .
298.It Bq Er EPERM
299Not allowed to perform the
300.Fa operation .
301.It Bq Er EPROGMISMATCH
302The argument
303.Fa operation
304is
305.Dv MODCTL_LOAD ,
306the
307.Fa ml_flags
308field in the
309.Em modctl_load_t
310structure does not include
311.Dv MODCTL_LOAD_FORCE ,
312and the requested module does not match the current kernel's version
313information.
314.El
315.Sh SEE ALSO
316.Xr module 7 ,
317.Xr sysctl 7 ,
318.Xr module 9
319.Sh HISTORY
320The
321.Fn modctl
322function call first appeared in
323.Nx 5.0 .
324