1 1.173 pgoyette /* $NetBSD: kern_module.c,v 1.173 2025/05/05 00:31:48 pgoyette Exp $ */ 2 1.1 ad 3 1.1 ad /*- 4 1.1 ad * Copyright (c) 2008 The NetBSD Foundation, Inc. 5 1.1 ad * All rights reserved. 6 1.1 ad * 7 1.25 ad * This code is derived from software developed for The NetBSD Foundation 8 1.25 ad * by Andrew Doran. 9 1.25 ad * 10 1.1 ad * Redistribution and use in source and binary forms, with or without 11 1.1 ad * modification, are permitted provided that the following conditions 12 1.1 ad * are met: 13 1.1 ad * 1. Redistributions of source code must retain the above copyright 14 1.1 ad * notice, this list of conditions and the following disclaimer. 15 1.1 ad * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 ad * notice, this list of conditions and the following disclaimer in the 17 1.1 ad * documentation and/or other materials provided with the distribution. 18 1.1 ad * 19 1.1 ad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 ad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 ad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 ad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 ad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 ad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 ad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 ad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 ad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 ad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 ad * POSSIBILITY OF SUCH DAMAGE. 30 1.1 ad */ 31 1.1 ad 32 1.1 ad /* 33 1.2 ad * Kernel module support. 34 1.1 ad */ 35 1.1 ad 36 1.1 ad #include <sys/cdefs.h> 37 1.173 pgoyette __KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.173 2025/05/05 00:31:48 pgoyette Exp $"); 38 1.54 pooka 39 1.54 pooka #define _MODULE_INTERNAL 40 1.30 ad 41 1.30 ad #ifdef _KERNEL_OPT 42 1.30 ad #include "opt_ddb.h" 43 1.42 apb #include "opt_modular.h" 44 1.30 ad #endif 45 1.1 ad 46 1.1 ad #include <sys/param.h> 47 1.1 ad #include <sys/systm.h> 48 1.26 ad #include <sys/kernel.h> 49 1.1 ad #include <sys/proc.h> 50 1.146 pgoyette #include <sys/lwp.h> 51 1.1 ad #include <sys/kauth.h> 52 1.1 ad #include <sys/kobj.h> 53 1.1 ad #include <sys/kmem.h> 54 1.1 ad #include <sys/module.h> 55 1.140 pgoyette #include <sys/module_hook.h> 56 1.26 ad #include <sys/kthread.h> 57 1.34 ad #include <sys/sysctl.h> 58 1.46 jnemeth #include <sys/lock.h> 59 1.147 pgoyette #include <sys/evcnt.h> 60 1.1 ad 61 1.1 ad #include <uvm/uvm_extern.h> 62 1.1 ad 63 1.25 ad struct vm_map *module_map; 64 1.106 matt const char *module_machine; 65 1.54 pooka char module_base[MODULE_BASE_SIZE]; 66 1.2 ad 67 1.59 pooka struct modlist module_list = TAILQ_HEAD_INITIALIZER(module_list); 68 1.59 pooka struct modlist module_builtins = TAILQ_HEAD_INITIALIZER(module_builtins); 69 1.59 pooka static struct modlist module_bootlist = TAILQ_HEAD_INITIALIZER(module_bootlist); 70 1.59 pooka 71 1.131 chs struct module_callbacks { 72 1.131 chs TAILQ_ENTRY(module_callbacks) modcb_list; 73 1.131 chs void (*modcb_load)(struct module *); 74 1.131 chs void (*modcb_unload)(struct module *); 75 1.131 chs }; 76 1.131 chs TAILQ_HEAD(modcblist, module_callbacks); 77 1.131 chs static struct modcblist modcblist; 78 1.131 chs 79 1.131 chs static module_t *module_netbsd; 80 1.131 chs static const modinfo_t module_netbsd_modinfo = { 81 1.131 chs .mi_version = __NetBSD_Version__, 82 1.131 chs .mi_class = MODULE_CLASS_MISC, 83 1.131 chs .mi_name = "netbsd" 84 1.131 chs }; 85 1.131 chs 86 1.12 ad static module_t *module_active; 87 1.172 pgoyette 88 1.172 pgoyette __read_mostly 89 1.154 rin #ifdef MODULAR_DEFAULT_VERBOSE 90 1.154 rin bool module_verbose_on = true; 91 1.154 rin #else 92 1.154 rin bool module_verbose_on = false; 93 1.154 rin #endif 94 1.172 pgoyette 95 1.172 pgoyette __read_mostly 96 1.99 nonaka #ifdef MODULAR_DEFAULT_AUTOLOAD 97 1.114 pgoyette bool module_autoload_on = true; 98 1.98 jnemeth #else 99 1.114 pgoyette bool module_autoload_on = false; 100 1.98 jnemeth #endif 101 1.172 pgoyette 102 1.172 pgoyette __read_mostly 103 1.169 pgoyette #ifdef MODULAR_DEFAULT_AUTOUNLOAD_UNSAFE 104 1.169 pgoyette bool module_autounload_unsafe = true; 105 1.169 pgoyette #else 106 1.169 pgoyette bool module_autounload_unsafe = false; 107 1.169 pgoyette #endif 108 1.1 ad u_int module_count; 109 1.59 pooka u_int module_builtinlist; 110 1.157 riastrad u_int module_autotime = 10; 111 1.26 ad u_int module_gen = 1; 112 1.26 ad static kcondvar_t module_thread_cv; 113 1.26 ad static kmutex_t module_thread_lock; 114 1.26 ad static int module_thread_ticks; 115 1.68 pgoyette int (*module_load_vfs_vec)(const char *, int, bool, module_t *, 116 1.115 msaitoh prop_dictionary_t *) = (void *)eopnotsupp; 117 1.1 ad 118 1.51 elad static kauth_listener_t module_listener; 119 1.51 elad 120 1.131 chs static specificdata_domain_t module_specificdata_domain; 121 1.131 chs 122 1.1 ad /* Ensure that the kernel's link set isn't empty. */ 123 1.1 ad static modinfo_t module_dummy; 124 1.1 ad __link_set_add_rodata(modules, module_dummy); 125 1.1 ad 126 1.70 pgoyette static module_t *module_newmodule(modsrc_t); 127 1.131 chs static void module_free(module_t *); 128 1.70 pgoyette static void module_require_force(module_t *); 129 1.9 jmmv static int module_do_load(const char *, bool, int, prop_dictionary_t, 130 1.100 matt module_t **, modclass_t modclass, bool); 131 1.70 pgoyette static int module_do_unload(const char *, bool); 132 1.116 christos static int module_do_builtin(const module_t *, const char *, module_t **, 133 1.116 christos prop_dictionary_t); 134 1.11 ad static int module_fetch_info(module_t *); 135 1.26 ad static void module_thread(void *); 136 1.54 pooka 137 1.60 pooka static module_t *module_lookup(const char *); 138 1.60 pooka static void module_enqueue(module_t *); 139 1.60 pooka 140 1.47 jnemeth static bool module_merge_dicts(prop_dictionary_t, const prop_dictionary_t); 141 1.1 ad 142 1.69 pooka static void sysctl_module_setup(void); 143 1.94 pgoyette static int sysctl_module_autotime(SYSCTLFN_PROTO); 144 1.94 pgoyette 145 1.131 chs static void module_callback_load(struct module *); 146 1.131 chs static void module_callback_unload(struct module *); 147 1.131 chs 148 1.100 matt #define MODULE_CLASS_MATCH(mi, modclass) \ 149 1.100 matt ((modclass) == MODULE_CLASS_ANY || (modclass) == (mi)->mi_class) 150 1.88 christos 151 1.88 christos static void 152 1.100 matt module_incompat(const modinfo_t *mi, int modclass) 153 1.88 christos { 154 1.168 pgoyette module_error("Incompatible module class %d for `%s' (wanted %d)", 155 1.148 pgoyette mi->mi_class, mi->mi_name, modclass); 156 1.88 christos } 157 1.69 pooka 158 1.131 chs struct module * 159 1.131 chs module_kernel(void) 160 1.131 chs { 161 1.131 chs 162 1.131 chs return module_netbsd; 163 1.131 chs } 164 1.131 chs 165 1.1 ad /* 166 1.1 ad * module_error: 167 1.1 ad * 168 1.1 ad * Utility function: log an error. 169 1.1 ad */ 170 1.54 pooka void 171 1.1 ad module_error(const char *fmt, ...) 172 1.1 ad { 173 1.1 ad va_list ap; 174 1.1 ad 175 1.1 ad va_start(ap, fmt); 176 1.1 ad printf("WARNING: module error: "); 177 1.1 ad vprintf(fmt, ap); 178 1.1 ad printf("\n"); 179 1.1 ad va_end(ap); 180 1.1 ad } 181 1.1 ad 182 1.1 ad /* 183 1.34 ad * module_print: 184 1.34 ad * 185 1.34 ad * Utility function: log verbose output. 186 1.34 ad */ 187 1.54 pooka void 188 1.34 ad module_print(const char *fmt, ...) 189 1.34 ad { 190 1.34 ad va_list ap; 191 1.34 ad 192 1.34 ad if (module_verbose_on) { 193 1.34 ad va_start(ap, fmt); 194 1.34 ad printf("DEBUG: module: "); 195 1.34 ad vprintf(fmt, ap); 196 1.34 ad printf("\n"); 197 1.34 ad va_end(ap); 198 1.34 ad } 199 1.34 ad } 200 1.34 ad 201 1.131 chs /* 202 1.131 chs * module_name: 203 1.131 chs * 204 1.131 chs * Utility function: return the module's name. 205 1.131 chs */ 206 1.131 chs const char * 207 1.131 chs module_name(struct module *mod) 208 1.131 chs { 209 1.131 chs 210 1.131 chs return mod->mod_info->mi_name; 211 1.131 chs } 212 1.131 chs 213 1.131 chs /* 214 1.131 chs * module_source: 215 1.131 chs * 216 1.131 chs * Utility function: return the module's source. 217 1.131 chs */ 218 1.131 chs modsrc_t 219 1.131 chs module_source(struct module *mod) 220 1.131 chs { 221 1.131 chs 222 1.131 chs return mod->mod_source; 223 1.131 chs } 224 1.131 chs 225 1.55 elad static int 226 1.55 elad module_listener_cb(kauth_cred_t cred, kauth_action_t action, void *cookie, 227 1.55 elad void *arg0, void *arg1, void *arg2, void *arg3) 228 1.55 elad { 229 1.55 elad int result; 230 1.55 elad 231 1.55 elad result = KAUTH_RESULT_DEFER; 232 1.55 elad 233 1.55 elad if (action != KAUTH_SYSTEM_MODULE) 234 1.55 elad return result; 235 1.55 elad 236 1.55 elad if ((uintptr_t)arg2 != 0) /* autoload */ 237 1.55 elad result = KAUTH_RESULT_ALLOW; 238 1.55 elad 239 1.55 elad return result; 240 1.55 elad } 241 1.55 elad 242 1.34 ad /* 243 1.70 pgoyette * Allocate a new module_t 244 1.70 pgoyette */ 245 1.70 pgoyette static module_t * 246 1.70 pgoyette module_newmodule(modsrc_t source) 247 1.70 pgoyette { 248 1.70 pgoyette module_t *mod; 249 1.70 pgoyette 250 1.70 pgoyette mod = kmem_zalloc(sizeof(*mod), KM_SLEEP); 251 1.125 chs mod->mod_source = source; 252 1.131 chs specificdata_init(module_specificdata_domain, &mod->mod_sdref); 253 1.70 pgoyette return mod; 254 1.70 pgoyette } 255 1.70 pgoyette 256 1.70 pgoyette /* 257 1.131 chs * Free a module_t 258 1.131 chs */ 259 1.131 chs static void 260 1.131 chs module_free(module_t *mod) 261 1.131 chs { 262 1.131 chs 263 1.131 chs specificdata_fini(module_specificdata_domain, &mod->mod_sdref); 264 1.133 pgoyette if (mod->mod_required) 265 1.133 pgoyette kmem_free(mod->mod_required, mod->mod_arequired * 266 1.133 pgoyette sizeof(module_t *)); 267 1.131 chs kmem_free(mod, sizeof(*mod)); 268 1.131 chs } 269 1.131 chs 270 1.131 chs /* 271 1.70 pgoyette * Require the -f (force) flag to load a module 272 1.70 pgoyette */ 273 1.70 pgoyette static void 274 1.70 pgoyette module_require_force(struct module *mod) 275 1.70 pgoyette { 276 1.133 pgoyette SET(mod->mod_flags, MODFLG_MUST_FORCE); 277 1.70 pgoyette } 278 1.70 pgoyette 279 1.70 pgoyette /* 280 1.59 pooka * Add modules to the builtin list. This can done at boottime or 281 1.59 pooka * at runtime if the module is linked into the kernel with an 282 1.59 pooka * external linker. All or none of the input will be handled. 283 1.59 pooka * Optionally, the modules can be initialized. If they are not 284 1.59 pooka * initialized, module_init_class() or module_load() can be used 285 1.59 pooka * later, but these are not guaranteed to give atomic results. 286 1.59 pooka */ 287 1.59 pooka int 288 1.59 pooka module_builtin_add(modinfo_t *const *mip, size_t nmodinfo, bool init) 289 1.59 pooka { 290 1.59 pooka struct module **modp = NULL, *mod_iter; 291 1.59 pooka int rv = 0, i, mipskip; 292 1.59 pooka 293 1.59 pooka if (init) { 294 1.59 pooka rv = kauth_authorize_system(kauth_cred_get(), 295 1.59 pooka KAUTH_SYSTEM_MODULE, 0, (void *)(uintptr_t)MODCTL_LOAD, 296 1.59 pooka (void *)(uintptr_t)1, NULL); 297 1.59 pooka if (rv) { 298 1.59 pooka return rv; 299 1.59 pooka } 300 1.59 pooka } 301 1.59 pooka 302 1.59 pooka for (i = 0, mipskip = 0; i < nmodinfo; i++) { 303 1.59 pooka if (mip[i] == &module_dummy) { 304 1.59 pooka KASSERT(nmodinfo > 0); 305 1.59 pooka nmodinfo--; 306 1.59 pooka } 307 1.59 pooka } 308 1.59 pooka if (nmodinfo == 0) 309 1.59 pooka return 0; 310 1.59 pooka 311 1.59 pooka modp = kmem_zalloc(sizeof(*modp) * nmodinfo, KM_SLEEP); 312 1.59 pooka for (i = 0, mipskip = 0; i < nmodinfo; i++) { 313 1.59 pooka if (mip[i+mipskip] == &module_dummy) { 314 1.59 pooka mipskip++; 315 1.59 pooka continue; 316 1.59 pooka } 317 1.70 pgoyette modp[i] = module_newmodule(MODULE_SOURCE_KERNEL); 318 1.59 pooka modp[i]->mod_info = mip[i+mipskip]; 319 1.59 pooka } 320 1.72 pgoyette kernconfig_lock(); 321 1.59 pooka 322 1.59 pooka /* do this in three stages for error recovery and atomicity */ 323 1.59 pooka 324 1.59 pooka /* first check for presence */ 325 1.59 pooka for (i = 0; i < nmodinfo; i++) { 326 1.59 pooka TAILQ_FOREACH(mod_iter, &module_builtins, mod_chain) { 327 1.59 pooka if (strcmp(mod_iter->mod_info->mi_name, 328 1.59 pooka modp[i]->mod_info->mi_name) == 0) 329 1.59 pooka break; 330 1.59 pooka } 331 1.59 pooka if (mod_iter) { 332 1.59 pooka rv = EEXIST; 333 1.59 pooka goto out; 334 1.59 pooka } 335 1.59 pooka 336 1.59 pooka if (module_lookup(modp[i]->mod_info->mi_name) != NULL) { 337 1.59 pooka rv = EEXIST; 338 1.59 pooka goto out; 339 1.59 pooka } 340 1.59 pooka } 341 1.59 pooka 342 1.59 pooka /* then add to list */ 343 1.59 pooka for (i = 0; i < nmodinfo; i++) { 344 1.59 pooka TAILQ_INSERT_TAIL(&module_builtins, modp[i], mod_chain); 345 1.59 pooka module_builtinlist++; 346 1.59 pooka } 347 1.59 pooka 348 1.59 pooka /* finally, init (if required) */ 349 1.59 pooka if (init) { 350 1.59 pooka for (i = 0; i < nmodinfo; i++) { 351 1.116 christos rv = module_do_builtin(modp[i], 352 1.116 christos modp[i]->mod_info->mi_name, NULL, NULL); 353 1.59 pooka /* throw in the towel, recovery hard & not worth it */ 354 1.59 pooka if (rv) 355 1.117 christos panic("%s: builtin module \"%s\" init failed:" 356 1.117 christos " %d", __func__, 357 1.59 pooka modp[i]->mod_info->mi_name, rv); 358 1.59 pooka } 359 1.59 pooka } 360 1.59 pooka 361 1.59 pooka out: 362 1.72 pgoyette kernconfig_unlock(); 363 1.59 pooka if (rv != 0) { 364 1.59 pooka for (i = 0; i < nmodinfo; i++) { 365 1.59 pooka if (modp[i]) 366 1.131 chs module_free(modp[i]); 367 1.59 pooka } 368 1.59 pooka } 369 1.59 pooka kmem_free(modp, sizeof(*modp) * nmodinfo); 370 1.59 pooka return rv; 371 1.59 pooka } 372 1.59 pooka 373 1.59 pooka /* 374 1.59 pooka * Optionally fini and remove builtin module from the kernel. 375 1.59 pooka * Note: the module will now be unreachable except via mi && builtin_add. 376 1.59 pooka */ 377 1.59 pooka int 378 1.59 pooka module_builtin_remove(modinfo_t *mi, bool fini) 379 1.59 pooka { 380 1.59 pooka struct module *mod; 381 1.59 pooka int rv = 0; 382 1.59 pooka 383 1.59 pooka if (fini) { 384 1.59 pooka rv = kauth_authorize_system(kauth_cred_get(), 385 1.59 pooka KAUTH_SYSTEM_MODULE, 0, (void *)(uintptr_t)MODCTL_UNLOAD, 386 1.59 pooka NULL, NULL); 387 1.59 pooka if (rv) 388 1.59 pooka return rv; 389 1.59 pooka 390 1.72 pgoyette kernconfig_lock(); 391 1.70 pgoyette rv = module_do_unload(mi->mi_name, true); 392 1.59 pooka if (rv) { 393 1.59 pooka goto out; 394 1.59 pooka } 395 1.59 pooka } else { 396 1.72 pgoyette kernconfig_lock(); 397 1.59 pooka } 398 1.59 pooka TAILQ_FOREACH(mod, &module_builtins, mod_chain) { 399 1.59 pooka if (strcmp(mod->mod_info->mi_name, mi->mi_name) == 0) 400 1.59 pooka break; 401 1.59 pooka } 402 1.59 pooka if (mod) { 403 1.59 pooka TAILQ_REMOVE(&module_builtins, mod, mod_chain); 404 1.59 pooka module_builtinlist--; 405 1.59 pooka } else { 406 1.59 pooka KASSERT(fini == false); 407 1.59 pooka rv = ENOENT; 408 1.59 pooka } 409 1.59 pooka 410 1.59 pooka out: 411 1.72 pgoyette kernconfig_unlock(); 412 1.59 pooka return rv; 413 1.59 pooka } 414 1.59 pooka 415 1.173 pgoyette #if __NetBSD_Version__ / 1000000 % 100 == 99 /* -current */ 416 1.173 pgoyette #define LEGACY_MODULE_PATH \ 417 1.173 pgoyette snprintf(module_base, sizeof(module_base), \ 418 1.173 pgoyette "/stand/%s/%s/modules", module_machine, osrelease); 419 1.173 pgoyette #else /* release */ 420 1.173 pgoyette #define LEGACY_MODULE_PATH \ 421 1.173 pgoyette snprintf(module_base, sizeof(module_base), \ 422 1.173 pgoyette "/stand/%s/%d.%d/modules", module_machine, \ 423 1.173 pgoyette __NetBSD_Version__ / 100000000, \ 424 1.173 pgoyette __NetBSD_Version__ / 1000000 % 100); 425 1.173 pgoyette #endif /* if __NetBSD_Version__ */ 426 1.173 pgoyette 427 1.59 pooka /* 428 1.1 ad * module_init: 429 1.1 ad * 430 1.1 ad * Initialize the module subsystem. 431 1.1 ad */ 432 1.1 ad void 433 1.1 ad module_init(void) 434 1.1 ad { 435 1.59 pooka __link_set_decl(modules, modinfo_t); 436 1.59 pooka modinfo_t *const *mip; 437 1.59 pooka int rv; 438 1.1 ad 439 1.25 ad if (module_map == NULL) { 440 1.25 ad module_map = kernel_map; 441 1.25 ad } 442 1.71 pgoyette cv_init(&module_thread_cv, "mod_unld"); 443 1.26 ad mutex_init(&module_thread_lock, MUTEX_DEFAULT, IPL_NONE); 444 1.131 chs TAILQ_INIT(&modcblist); 445 1.66 pgoyette 446 1.13 ad #ifdef MODULAR /* XXX */ 447 1.11 ad module_init_md(); 448 1.12 ad #endif 449 1.16 ad 450 1.149 christos #ifdef KERNEL_DIR 451 1.149 christos const char *booted_kernel = get_booted_kernel(); 452 1.149 christos if (booted_kernel) { 453 1.173 pgoyette while (*booted_kernel == '/') /* ignore leading slashes */ 454 1.173 pgoyette booted_kernel++; /* boot lookup always at root */ 455 1.149 christos char *ptr = strrchr(booted_kernel, '/'); 456 1.173 pgoyette if (ptr == NULL) { 457 1.173 pgoyette /* no dir name, use legacy module path */ 458 1.173 pgoyette if (!module_machine) 459 1.173 pgoyette module_machine = machine; 460 1.173 pgoyette LEGACY_MODULE_PATH; 461 1.173 pgoyette } else { 462 1.173 pgoyette snprintf(module_base, sizeof(module_base), 463 1.173 pgoyette "/%.*s/modules", 464 1.173 pgoyette (int)(ptr - booted_kernel), booted_kernel); 465 1.173 pgoyette } 466 1.149 christos } else { 467 1.149 christos strlcpy(module_base, "/netbsd/modules", sizeof(module_base)); 468 1.149 christos printf("Cannot find kernel name, loading modules from \"%s\"\n", 469 1.149 christos module_base); 470 1.149 christos } 471 1.173 pgoyette #else /* ifdef KERNEL_DIR */ 472 1.78 mrg if (!module_machine) 473 1.78 mrg module_machine = machine; 474 1.173 pgoyette LEGACY_MODULE_PATH; 475 1.149 christos #endif 476 1.50 elad 477 1.55 elad module_listener = kauth_listen_scope(KAUTH_SCOPE_SYSTEM, 478 1.55 elad module_listener_cb, NULL); 479 1.59 pooka 480 1.59 pooka __link_set_foreach(mip, modules) { 481 1.77 mbalmer if ((rv = module_builtin_add(mip, 1, false)) != 0) 482 1.170 gutterid module_error("Built-in `%s' failed: %d\n", 483 1.59 pooka (*mip)->mi_name, rv); 484 1.59 pooka } 485 1.69 pooka 486 1.69 pooka sysctl_module_setup(); 487 1.131 chs module_specificdata_domain = specificdata_domain_create(); 488 1.131 chs 489 1.131 chs module_netbsd = module_newmodule(MODULE_SOURCE_KERNEL); 490 1.131 chs module_netbsd->mod_refcnt = 1; 491 1.131 chs module_netbsd->mod_info = &module_netbsd_modinfo; 492 1.51 elad } 493 1.51 elad 494 1.50 elad /* 495 1.70 pgoyette * module_start_unload_thread: 496 1.50 elad * 497 1.50 elad * Start the auto unload kthread. 498 1.50 elad */ 499 1.50 elad void 500 1.70 pgoyette module_start_unload_thread(void) 501 1.50 elad { 502 1.50 elad int error; 503 1.26 ad 504 1.26 ad error = kthread_create(PRI_VM, KTHREAD_MPSAFE, NULL, module_thread, 505 1.26 ad NULL, NULL, "modunload"); 506 1.26 ad if (error != 0) 507 1.117 christos panic("%s: %d", __func__, error); 508 1.1 ad } 509 1.1 ad 510 1.70 pgoyette /* 511 1.70 pgoyette * module_builtin_require_force 512 1.70 pgoyette * 513 1.70 pgoyette * Require MODCTL_MUST_FORCE to load any built-in modules that have 514 1.70 pgoyette * not yet been initialized 515 1.70 pgoyette */ 516 1.70 pgoyette void 517 1.70 pgoyette module_builtin_require_force(void) 518 1.70 pgoyette { 519 1.70 pgoyette module_t *mod; 520 1.70 pgoyette 521 1.72 pgoyette kernconfig_lock(); 522 1.70 pgoyette TAILQ_FOREACH(mod, &module_builtins, mod_chain) { 523 1.70 pgoyette module_require_force(mod); 524 1.70 pgoyette } 525 1.72 pgoyette kernconfig_unlock(); 526 1.70 pgoyette } 527 1.70 pgoyette 528 1.69 pooka static struct sysctllog *module_sysctllog; 529 1.69 pooka 530 1.94 pgoyette static int 531 1.94 pgoyette sysctl_module_autotime(SYSCTLFN_ARGS) 532 1.94 pgoyette { 533 1.94 pgoyette struct sysctlnode node; 534 1.94 pgoyette int t, error; 535 1.94 pgoyette 536 1.94 pgoyette t = *(int *)rnode->sysctl_data; 537 1.94 pgoyette 538 1.94 pgoyette node = *rnode; 539 1.94 pgoyette node.sysctl_data = &t; 540 1.94 pgoyette error = sysctl_lookup(SYSCTLFN_CALL(&node)); 541 1.94 pgoyette if (error || newp == NULL) 542 1.94 pgoyette return (error); 543 1.94 pgoyette 544 1.94 pgoyette if (t < 0) 545 1.94 pgoyette return (EINVAL); 546 1.94 pgoyette 547 1.94 pgoyette *(int *)rnode->sysctl_data = t; 548 1.94 pgoyette return (0); 549 1.94 pgoyette } 550 1.94 pgoyette 551 1.69 pooka static void 552 1.69 pooka sysctl_module_setup(void) 553 1.34 ad { 554 1.34 ad const struct sysctlnode *node = NULL; 555 1.34 ad 556 1.69 pooka sysctl_createv(&module_sysctllog, 0, NULL, &node, 557 1.34 ad CTLFLAG_PERMANENT, 558 1.34 ad CTLTYPE_NODE, "module", 559 1.34 ad SYSCTL_DESCR("Module options"), 560 1.34 ad NULL, 0, NULL, 0, 561 1.34 ad CTL_KERN, CTL_CREATE, CTL_EOL); 562 1.34 ad 563 1.34 ad if (node == NULL) 564 1.34 ad return; 565 1.34 ad 566 1.69 pooka sysctl_createv(&module_sysctllog, 0, &node, NULL, 567 1.34 ad CTLFLAG_PERMANENT | CTLFLAG_READWRITE, 568 1.64 jruoho CTLTYPE_BOOL, "autoload", 569 1.34 ad SYSCTL_DESCR("Enable automatic load of modules"), 570 1.34 ad NULL, 0, &module_autoload_on, 0, 571 1.34 ad CTL_CREATE, CTL_EOL); 572 1.69 pooka sysctl_createv(&module_sysctllog, 0, &node, NULL, 573 1.34 ad CTLFLAG_PERMANENT | CTLFLAG_READWRITE, 574 1.158 riastrad CTLTYPE_BOOL, "autounload_unsafe", 575 1.158 riastrad SYSCTL_DESCR("Enable automatic unload of unaudited modules"), 576 1.158 riastrad NULL, 0, &module_autounload_unsafe, 0, 577 1.158 riastrad CTL_CREATE, CTL_EOL); 578 1.158 riastrad sysctl_createv(&module_sysctllog, 0, &node, NULL, 579 1.158 riastrad CTLFLAG_PERMANENT | CTLFLAG_READWRITE, 580 1.64 jruoho CTLTYPE_BOOL, "verbose", 581 1.34 ad SYSCTL_DESCR("Enable verbose output"), 582 1.34 ad NULL, 0, &module_verbose_on, 0, 583 1.34 ad CTL_CREATE, CTL_EOL); 584 1.94 pgoyette sysctl_createv(&module_sysctllog, 0, &node, NULL, 585 1.97 jnemeth CTLFLAG_PERMANENT | CTLFLAG_READONLY, 586 1.97 jnemeth CTLTYPE_STRING, "path", 587 1.97 jnemeth SYSCTL_DESCR("Default module load path"), 588 1.97 jnemeth NULL, 0, module_base, 0, 589 1.97 jnemeth CTL_CREATE, CTL_EOL); 590 1.97 jnemeth sysctl_createv(&module_sysctllog, 0, &node, NULL, 591 1.94 pgoyette CTLFLAG_PERMANENT | CTLFLAG_READWRITE, 592 1.94 pgoyette CTLTYPE_INT, "autotime", 593 1.94 pgoyette SYSCTL_DESCR("Auto-unload delay"), 594 1.94 pgoyette sysctl_module_autotime, 0, &module_autotime, 0, 595 1.94 pgoyette CTL_CREATE, CTL_EOL); 596 1.34 ad } 597 1.34 ad 598 1.1 ad /* 599 1.1 ad * module_init_class: 600 1.1 ad * 601 1.1 ad * Initialize all built-in and pre-loaded modules of the 602 1.1 ad * specified class. 603 1.1 ad */ 604 1.1 ad void 605 1.100 matt module_init_class(modclass_t modclass) 606 1.1 ad { 607 1.63 pooka TAILQ_HEAD(, module) bi_fail = TAILQ_HEAD_INITIALIZER(bi_fail); 608 1.59 pooka module_t *mod; 609 1.59 pooka modinfo_t *mi; 610 1.1 ad 611 1.72 pgoyette kernconfig_lock(); 612 1.1 ad /* 613 1.59 pooka * Builtins first. These will not depend on pre-loaded modules 614 1.59 pooka * (because the kernel would not link). 615 1.1 ad */ 616 1.59 pooka do { 617 1.59 pooka TAILQ_FOREACH(mod, &module_builtins, mod_chain) { 618 1.59 pooka mi = mod->mod_info; 619 1.100 matt if (!MODULE_CLASS_MATCH(mi, modclass)) 620 1.59 pooka continue; 621 1.63 pooka /* 622 1.63 pooka * If initializing a builtin module fails, don't try 623 1.63 pooka * to load it again. But keep it around and queue it 624 1.70 pgoyette * on the builtins list after we're done with module 625 1.70 pgoyette * init. Don't set it to MODFLG_MUST_FORCE in case a 626 1.70 pgoyette * future attempt to initialize can be successful. 627 1.70 pgoyette * (If the module has previously been set to 628 1.70 pgoyette * MODFLG_MUST_FORCE, don't try to override that!) 629 1.63 pooka */ 630 1.133 pgoyette if (ISSET(mod->mod_flags, MODFLG_MUST_FORCE) || 631 1.116 christos module_do_builtin(mod, mi->mi_name, NULL, 632 1.116 christos NULL) != 0) { 633 1.63 pooka TAILQ_REMOVE(&module_builtins, mod, mod_chain); 634 1.63 pooka TAILQ_INSERT_TAIL(&bi_fail, mod, mod_chain); 635 1.63 pooka } 636 1.59 pooka break; 637 1.1 ad } 638 1.59 pooka } while (mod != NULL); 639 1.59 pooka 640 1.1 ad /* 641 1.1 ad * Now preloaded modules. These will be pulled off the 642 1.1 ad * list as we call module_do_load(); 643 1.1 ad */ 644 1.11 ad do { 645 1.59 pooka TAILQ_FOREACH(mod, &module_bootlist, mod_chain) { 646 1.11 ad mi = mod->mod_info; 647 1.100 matt if (!MODULE_CLASS_MATCH(mi, modclass)) 648 1.11 ad continue; 649 1.18 ad module_do_load(mi->mi_name, false, 0, NULL, NULL, 650 1.100 matt modclass, false); 651 1.11 ad break; 652 1.11 ad } 653 1.11 ad } while (mod != NULL); 654 1.63 pooka 655 1.70 pgoyette /* return failed builtin modules to builtin list */ 656 1.63 pooka while ((mod = TAILQ_FIRST(&bi_fail)) != NULL) { 657 1.63 pooka TAILQ_REMOVE(&bi_fail, mod, mod_chain); 658 1.63 pooka TAILQ_INSERT_TAIL(&module_builtins, mod, mod_chain); 659 1.63 pooka } 660 1.63 pooka 661 1.72 pgoyette kernconfig_unlock(); 662 1.1 ad } 663 1.1 ad 664 1.1 ad /* 665 1.21 ad * module_compatible: 666 1.1 ad * 667 1.21 ad * Return true if the two supplied kernel versions are said to 668 1.21 ad * have the same binary interface for kernel code. The entire 669 1.162 msaitoh * version is significant for the development tree (-current), 670 1.21 ad * major and minor versions are significant for official 671 1.21 ad * releases of the system. 672 1.1 ad */ 673 1.22 pooka bool 674 1.21 ad module_compatible(int v1, int v2) 675 1.1 ad { 676 1.1 ad 677 1.21 ad #if __NetBSD_Version__ / 1000000 % 100 == 99 /* -current */ 678 1.21 ad return v1 == v2; 679 1.21 ad #else /* release */ 680 1.21 ad return abs(v1 - v2) < 10000; 681 1.21 ad #endif 682 1.1 ad } 683 1.1 ad 684 1.1 ad /* 685 1.1 ad * module_load: 686 1.1 ad * 687 1.9 jmmv * Load a single module from the file system. 688 1.1 ad */ 689 1.1 ad int 690 1.18 ad module_load(const char *filename, int flags, prop_dictionary_t props, 691 1.100 matt modclass_t modclass) 692 1.1 ad { 693 1.120 maya module_t *mod; 694 1.1 ad int error; 695 1.1 ad 696 1.120 maya /* Test if we already have the module loaded before 697 1.120 maya * authorizing so we have the opportunity to return EEXIST. */ 698 1.120 maya kernconfig_lock(); 699 1.120 maya mod = module_lookup(filename); 700 1.120 maya if (mod != NULL) { 701 1.120 maya module_print("%s module `%s' already loaded", 702 1.168 pgoyette "Requested", filename); 703 1.120 maya error = EEXIST; 704 1.120 maya goto out; 705 1.120 maya } 706 1.120 maya 707 1.18 ad /* Authorize. */ 708 1.18 ad error = kauth_authorize_system(kauth_cred_get(), KAUTH_SYSTEM_MODULE, 709 1.18 ad 0, (void *)(uintptr_t)MODCTL_LOAD, NULL, NULL); 710 1.120 maya if (error != 0) 711 1.120 maya goto out; 712 1.18 ad 713 1.100 matt error = module_do_load(filename, false, flags, props, NULL, modclass, 714 1.23 ad false); 715 1.120 maya 716 1.120 maya out: 717 1.119 maya kernconfig_unlock(); 718 1.1 ad return error; 719 1.1 ad } 720 1.1 ad 721 1.1 ad /* 722 1.23 ad * module_autoload: 723 1.23 ad * 724 1.23 ad * Load a single module from the file system, system initiated. 725 1.23 ad */ 726 1.23 ad int 727 1.100 matt module_autoload(const char *filename, modclass_t modclass) 728 1.23 ad { 729 1.23 ad int error; 730 1.146 pgoyette struct proc *p = curlwp->l_proc; 731 1.23 ad 732 1.72 pgoyette kernconfig_lock(); 733 1.23 ad 734 1.163 pgoyette module_print("Autoload for `%s' requested by pid %d (%s)", 735 1.163 pgoyette filename, p->p_pid, p->p_comm); 736 1.163 pgoyette 737 1.34 ad /* Nothing if the user has disabled it. */ 738 1.34 ad if (!module_autoload_on) { 739 1.163 pgoyette module_print("Autoload disabled for `%s' ", filename); 740 1.72 pgoyette kernconfig_unlock(); 741 1.34 ad return EPERM; 742 1.34 ad } 743 1.34 ad 744 1.56 dholland /* Disallow path separators and magic symlinks. */ 745 1.29 ad if (strchr(filename, '/') != NULL || strchr(filename, '@') != NULL || 746 1.29 ad strchr(filename, '.') != NULL) { 747 1.163 pgoyette module_print("Autoload illegal path for `%s' ", filename); 748 1.72 pgoyette kernconfig_unlock(); 749 1.29 ad return EPERM; 750 1.29 ad } 751 1.29 ad 752 1.23 ad /* Authorize. */ 753 1.23 ad error = kauth_authorize_system(kauth_cred_get(), KAUTH_SYSTEM_MODULE, 754 1.23 ad 0, (void *)(uintptr_t)MODCTL_LOAD, (void *)(uintptr_t)1, NULL); 755 1.23 ad 756 1.163 pgoyette if (error != 0) { 757 1.163 pgoyette module_print("Autoload not authorized for `%s' ", filename); 758 1.163 pgoyette kernconfig_unlock(); 759 1.163 pgoyette return error; 760 1.163 pgoyette } 761 1.163 pgoyette error = module_do_load(filename, false, 0, NULL, NULL, modclass, true); 762 1.72 pgoyette 763 1.163 pgoyette module_print("Autoload for `%s' status %d", filename, error); 764 1.72 pgoyette kernconfig_unlock(); 765 1.72 pgoyette return error; 766 1.23 ad } 767 1.23 ad 768 1.23 ad /* 769 1.1 ad * module_unload: 770 1.1 ad * 771 1.1 ad * Find and unload a module by name. 772 1.1 ad */ 773 1.1 ad int 774 1.1 ad module_unload(const char *name) 775 1.1 ad { 776 1.1 ad int error; 777 1.1 ad 778 1.18 ad /* Authorize. */ 779 1.18 ad error = kauth_authorize_system(kauth_cred_get(), KAUTH_SYSTEM_MODULE, 780 1.18 ad 0, (void *)(uintptr_t)MODCTL_UNLOAD, NULL, NULL); 781 1.18 ad if (error != 0) { 782 1.18 ad return error; 783 1.18 ad } 784 1.18 ad 785 1.72 pgoyette kernconfig_lock(); 786 1.70 pgoyette error = module_do_unload(name, true); 787 1.72 pgoyette kernconfig_unlock(); 788 1.1 ad 789 1.1 ad return error; 790 1.1 ad } 791 1.1 ad 792 1.1 ad /* 793 1.1 ad * module_lookup: 794 1.1 ad * 795 1.1 ad * Look up a module by name. 796 1.1 ad */ 797 1.1 ad module_t * 798 1.1 ad module_lookup(const char *name) 799 1.1 ad { 800 1.1 ad module_t *mod; 801 1.1 ad 802 1.72 pgoyette KASSERT(kernconfig_is_held()); 803 1.1 ad 804 1.1 ad TAILQ_FOREACH(mod, &module_list, mod_chain) { 805 1.133 pgoyette if (strcmp(mod->mod_info->mi_name, name) == 0) 806 1.1 ad break; 807 1.1 ad } 808 1.1 ad 809 1.1 ad return mod; 810 1.1 ad } 811 1.1 ad 812 1.1 ad /* 813 1.1 ad * module_hold: 814 1.1 ad * 815 1.1 ad * Add a single reference to a module. It's the caller's 816 1.1 ad * responsibility to ensure that the reference is dropped 817 1.1 ad * later. 818 1.1 ad */ 819 1.131 chs void 820 1.131 chs module_hold(module_t *mod) 821 1.1 ad { 822 1.1 ad 823 1.72 pgoyette kernconfig_lock(); 824 1.1 ad mod->mod_refcnt++; 825 1.72 pgoyette kernconfig_unlock(); 826 1.1 ad } 827 1.1 ad 828 1.1 ad /* 829 1.1 ad * module_rele: 830 1.1 ad * 831 1.1 ad * Release a reference acquired with module_hold(). 832 1.1 ad */ 833 1.1 ad void 834 1.131 chs module_rele(module_t *mod) 835 1.1 ad { 836 1.1 ad 837 1.72 pgoyette kernconfig_lock(); 838 1.131 chs KASSERT(mod->mod_refcnt > 0); 839 1.1 ad mod->mod_refcnt--; 840 1.72 pgoyette kernconfig_unlock(); 841 1.1 ad } 842 1.1 ad 843 1.1 ad /* 844 1.27 ad * module_enqueue: 845 1.27 ad * 846 1.27 ad * Put a module onto the global list and update counters. 847 1.27 ad */ 848 1.53 pooka void 849 1.27 ad module_enqueue(module_t *mod) 850 1.27 ad { 851 1.27 ad int i; 852 1.27 ad 853 1.72 pgoyette KASSERT(kernconfig_is_held()); 854 1.53 pooka 855 1.27 ad /* 856 1.113 pgoyette * Put new entry at the head of the queue so autounload can unload 857 1.113 pgoyette * requisite modules with only one pass through the queue. 858 1.27 ad */ 859 1.113 pgoyette TAILQ_INSERT_HEAD(&module_list, mod, mod_chain); 860 1.27 ad if (mod->mod_nrequired) { 861 1.27 ad 862 1.27 ad /* Add references to the requisite modules. */ 863 1.27 ad for (i = 0; i < mod->mod_nrequired; i++) { 864 1.133 pgoyette KASSERT((*mod->mod_required)[i] != NULL); 865 1.133 pgoyette (*mod->mod_required)[i]->mod_refcnt++; 866 1.27 ad } 867 1.27 ad } 868 1.27 ad module_count++; 869 1.27 ad module_gen++; 870 1.27 ad } 871 1.27 ad 872 1.27 ad /* 873 1.133 pgoyette * Our array of required module pointers starts with zero entries. If we 874 1.133 pgoyette * need to add a new entry, and the list is already full, we reallocate a 875 1.133 pgoyette * larger array, adding MAXMODDEPS entries. 876 1.133 pgoyette */ 877 1.133 pgoyette static void 878 1.133 pgoyette alloc_required(module_t *mod) 879 1.133 pgoyette { 880 1.133 pgoyette module_t *(*new)[], *(*old)[]; 881 1.133 pgoyette int areq; 882 1.133 pgoyette int i; 883 1.133 pgoyette 884 1.133 pgoyette if (mod->mod_nrequired >= mod->mod_arequired) { 885 1.133 pgoyette areq = mod->mod_arequired + MAXMODDEPS; 886 1.133 pgoyette old = mod->mod_required; 887 1.133 pgoyette new = kmem_zalloc(areq * sizeof(module_t *), KM_SLEEP); 888 1.133 pgoyette for (i = 0; i < mod->mod_arequired; i++) 889 1.133 pgoyette (*new)[i] = (*old)[i]; 890 1.133 pgoyette mod->mod_required = new; 891 1.133 pgoyette if (old) 892 1.133 pgoyette kmem_free(old, mod->mod_arequired * sizeof(module_t *)); 893 1.133 pgoyette mod->mod_arequired = areq; 894 1.133 pgoyette } 895 1.133 pgoyette } 896 1.133 pgoyette 897 1.133 pgoyette /* 898 1.1 ad * module_do_builtin: 899 1.1 ad * 900 1.59 pooka * Initialize a module from the list of modules that are 901 1.59 pooka * already linked into the kernel. 902 1.1 ad */ 903 1.1 ad static int 904 1.116 christos module_do_builtin(const module_t *pmod, const char *name, module_t **modp, 905 1.116 christos prop_dictionary_t props) 906 1.1 ad { 907 1.1 ad const char *p, *s; 908 1.1 ad char buf[MAXMODNAME]; 909 1.59 pooka modinfo_t *mi = NULL; 910 1.72 pgoyette module_t *mod, *mod2, *mod_loaded, *prev_active; 911 1.1 ad size_t len; 912 1.27 ad int error; 913 1.1 ad 914 1.72 pgoyette KASSERT(kernconfig_is_held()); 915 1.1 ad 916 1.1 ad /* 917 1.59 pooka * Search the list to see if we have a module by this name. 918 1.1 ad */ 919 1.59 pooka TAILQ_FOREACH(mod, &module_builtins, mod_chain) { 920 1.59 pooka if (strcmp(mod->mod_info->mi_name, name) == 0) { 921 1.59 pooka mi = mod->mod_info; 922 1.59 pooka break; 923 1.1 ad } 924 1.1 ad } 925 1.1 ad 926 1.1 ad /* 927 1.59 pooka * Check to see if already loaded. This might happen if we 928 1.59 pooka * were already loaded as a dependency. 929 1.1 ad */ 930 1.59 pooka if ((mod_loaded = module_lookup(name)) != NULL) { 931 1.59 pooka KASSERT(mod == NULL); 932 1.59 pooka if (modp) 933 1.59 pooka *modp = mod_loaded; 934 1.59 pooka return 0; 935 1.1 ad } 936 1.59 pooka 937 1.59 pooka /* Note! This is from TAILQ, not immediate above */ 938 1.65 pooka if (mi == NULL) { 939 1.65 pooka /* 940 1.65 pooka * XXX: We'd like to panic here, but currently in some 941 1.65 pooka * cases (such as nfsserver + nfs), the dependee can be 942 1.153 andvar * successfully linked without the dependencies. 943 1.65 pooka */ 944 1.170 gutterid module_error("Built-in module `%s' can't find built-in " 945 1.133 pgoyette "dependency `%s'", pmod->mod_info->mi_name, name); 946 1.65 pooka return ENOENT; 947 1.65 pooka } 948 1.1 ad 949 1.1 ad /* 950 1.1 ad * Initialize pre-requisites. 951 1.1 ad */ 952 1.133 pgoyette KASSERT(mod->mod_required == NULL); 953 1.133 pgoyette KASSERT(mod->mod_arequired == 0); 954 1.133 pgoyette KASSERT(mod->mod_nrequired == 0); 955 1.1 ad if (mi->mi_required != NULL) { 956 1.1 ad for (s = mi->mi_required; *s != '\0'; s = p) { 957 1.1 ad if (*s == ',') 958 1.1 ad s++; 959 1.1 ad p = s; 960 1.1 ad while (*p != '\0' && *p != ',') 961 1.1 ad p++; 962 1.132 riastrad len = uimin(p - s + 1, sizeof(buf)); 963 1.1 ad strlcpy(buf, s, len); 964 1.1 ad if (buf[0] == '\0') 965 1.1 ad break; 966 1.133 pgoyette alloc_required(mod); 967 1.116 christos error = module_do_builtin(mod, buf, &mod2, NULL); 968 1.1 ad if (error != 0) { 969 1.168 pgoyette module_error("Built-in module `%s' prerequisite " 970 1.164 pgoyette "`%s' failed, error %d", name, buf, error); 971 1.133 pgoyette goto fail; 972 1.1 ad } 973 1.133 pgoyette (*mod->mod_required)[mod->mod_nrequired++] = mod2; 974 1.1 ad } 975 1.1 ad } 976 1.1 ad 977 1.1 ad /* 978 1.1 ad * Try to initialize the module. 979 1.1 ad */ 980 1.72 pgoyette prev_active = module_active; 981 1.12 ad module_active = mod; 982 1.74 pooka error = (*mi->mi_modcmd)(MODULE_CMD_INIT, props); 983 1.72 pgoyette module_active = prev_active; 984 1.1 ad if (error != 0) { 985 1.168 pgoyette module_error("Built-in module `%s' failed its MODULE_CMD_INIT, " 986 1.133 pgoyette "error %d", mi->mi_name, error); 987 1.133 pgoyette goto fail; 988 1.1 ad } 989 1.59 pooka 990 1.59 pooka /* load always succeeds after this point */ 991 1.59 pooka 992 1.59 pooka TAILQ_REMOVE(&module_builtins, mod, mod_chain); 993 1.59 pooka module_builtinlist--; 994 1.59 pooka if (modp != NULL) { 995 1.59 pooka *modp = mod; 996 1.59 pooka } 997 1.27 ad module_enqueue(mod); 998 1.1 ad return 0; 999 1.133 pgoyette 1000 1.133 pgoyette fail: 1001 1.133 pgoyette if (mod->mod_required) 1002 1.133 pgoyette kmem_free(mod->mod_required, mod->mod_arequired * 1003 1.133 pgoyette sizeof(module_t *)); 1004 1.133 pgoyette mod->mod_arequired = 0; 1005 1.133 pgoyette mod->mod_nrequired = 0; 1006 1.133 pgoyette mod->mod_required = NULL; 1007 1.133 pgoyette return error; 1008 1.1 ad } 1009 1.1 ad 1010 1.1 ad /* 1011 1.137 pgoyette * module_load_sysctl 1012 1.137 pgoyette * 1013 1.138 pgoyette * Check to see if a non-builtin module has any SYSCTL_SETUP() routine(s) 1014 1.137 pgoyette * registered. If so, call it (them). 1015 1.137 pgoyette */ 1016 1.137 pgoyette 1017 1.137 pgoyette static void 1018 1.137 pgoyette module_load_sysctl(module_t *mod) 1019 1.137 pgoyette { 1020 1.137 pgoyette void (**ls_funcp)(struct sysctllog **); 1021 1.137 pgoyette void *ls_start; 1022 1.137 pgoyette size_t ls_size, count; 1023 1.137 pgoyette int error; 1024 1.137 pgoyette 1025 1.138 pgoyette /* 1026 1.138 pgoyette * Built-in modules don't have a mod_kobj so we cannot search 1027 1.138 pgoyette * for their link_set_sysctl_funcs 1028 1.138 pgoyette */ 1029 1.138 pgoyette if (mod->mod_source == MODULE_SOURCE_KERNEL) 1030 1.138 pgoyette return; 1031 1.138 pgoyette 1032 1.137 pgoyette error = kobj_find_section(mod->mod_kobj, "link_set_sysctl_funcs", 1033 1.137 pgoyette &ls_start, &ls_size); 1034 1.137 pgoyette if (error == 0) { 1035 1.137 pgoyette count = ls_size / sizeof(ls_start); 1036 1.137 pgoyette ls_funcp = ls_start; 1037 1.137 pgoyette while (count--) { 1038 1.137 pgoyette (**ls_funcp)(&mod->mod_sysctllog); 1039 1.137 pgoyette ls_funcp++; 1040 1.137 pgoyette } 1041 1.137 pgoyette } 1042 1.147 pgoyette } 1043 1.147 pgoyette 1044 1.147 pgoyette /* 1045 1.147 pgoyette * module_load_evcnt 1046 1.147 pgoyette * 1047 1.147 pgoyette * Check to see if a non-builtin module has any static evcnt's defined; 1048 1.147 pgoyette * if so, attach them. 1049 1.147 pgoyette */ 1050 1.147 pgoyette 1051 1.147 pgoyette static void 1052 1.147 pgoyette module_load_evcnt(module_t *mod) 1053 1.147 pgoyette { 1054 1.147 pgoyette struct evcnt * const *ls_evp; 1055 1.147 pgoyette void *ls_start; 1056 1.147 pgoyette size_t ls_size, count; 1057 1.147 pgoyette int error; 1058 1.147 pgoyette 1059 1.147 pgoyette /* 1060 1.147 pgoyette * Built-in modules' static evcnt stuff will be handled 1061 1.147 pgoyette * automatically as part of general kernel initialization 1062 1.147 pgoyette */ 1063 1.147 pgoyette if (mod->mod_source == MODULE_SOURCE_KERNEL) 1064 1.147 pgoyette return; 1065 1.147 pgoyette 1066 1.147 pgoyette error = kobj_find_section(mod->mod_kobj, "link_set_evcnts", 1067 1.147 pgoyette &ls_start, &ls_size); 1068 1.147 pgoyette if (error == 0) { 1069 1.147 pgoyette count = ls_size / sizeof(*ls_evp); 1070 1.147 pgoyette ls_evp = ls_start; 1071 1.147 pgoyette while (count--) { 1072 1.147 pgoyette evcnt_attach_static(*ls_evp++); 1073 1.147 pgoyette } 1074 1.147 pgoyette } 1075 1.147 pgoyette } 1076 1.147 pgoyette 1077 1.147 pgoyette /* 1078 1.147 pgoyette * module_unload_evcnt 1079 1.147 pgoyette * 1080 1.147 pgoyette * Check to see if a non-builtin module has any static evcnt's defined; 1081 1.147 pgoyette * if so, detach them. 1082 1.147 pgoyette */ 1083 1.147 pgoyette 1084 1.147 pgoyette static void 1085 1.147 pgoyette module_unload_evcnt(module_t *mod) 1086 1.147 pgoyette { 1087 1.147 pgoyette struct evcnt * const *ls_evp; 1088 1.147 pgoyette void *ls_start; 1089 1.147 pgoyette size_t ls_size, count; 1090 1.147 pgoyette int error; 1091 1.147 pgoyette 1092 1.147 pgoyette /* 1093 1.147 pgoyette * Built-in modules' static evcnt stuff will be handled 1094 1.147 pgoyette * automatically as part of general kernel initialization 1095 1.147 pgoyette */ 1096 1.147 pgoyette if (mod->mod_source == MODULE_SOURCE_KERNEL) 1097 1.147 pgoyette return; 1098 1.147 pgoyette 1099 1.147 pgoyette error = kobj_find_section(mod->mod_kobj, "link_set_evcnts", 1100 1.147 pgoyette &ls_start, &ls_size); 1101 1.147 pgoyette if (error == 0) { 1102 1.147 pgoyette count = ls_size / sizeof(*ls_evp); 1103 1.147 pgoyette ls_evp = (void *)((char *)ls_start + ls_size); 1104 1.147 pgoyette while (count--) { 1105 1.147 pgoyette evcnt_detach(*--ls_evp); 1106 1.147 pgoyette } 1107 1.147 pgoyette } 1108 1.137 pgoyette } 1109 1.137 pgoyette 1110 1.137 pgoyette /* 1111 1.1 ad * module_do_load: 1112 1.1 ad * 1113 1.1 ad * Helper routine: load a module from the file system, or one 1114 1.1 ad * pushed by the boot loader. 1115 1.1 ad */ 1116 1.1 ad static int 1117 1.27 ad module_do_load(const char *name, bool isdep, int flags, 1118 1.100 matt prop_dictionary_t props, module_t **modp, modclass_t modclass, 1119 1.20 ad bool autoload) 1120 1.1 ad { 1121 1.133 pgoyette /* The pending list for this level of recursion */ 1122 1.72 pgoyette TAILQ_HEAD(pending_t, module); 1123 1.72 pgoyette struct pending_t *pending; 1124 1.72 pgoyette struct pending_t new_pending = TAILQ_HEAD_INITIALIZER(new_pending); 1125 1.133 pgoyette 1126 1.133 pgoyette /* The stack of pending lists */ 1127 1.133 pgoyette static SLIST_HEAD(pend_head, pend_entry) pend_stack = 1128 1.133 pgoyette SLIST_HEAD_INITIALIZER(pend_stack); 1129 1.133 pgoyette struct pend_entry { 1130 1.133 pgoyette SLIST_ENTRY(pend_entry) pe_entry; 1131 1.133 pgoyette struct pending_t *pe_pending; 1132 1.133 pgoyette } my_pend_entry; 1133 1.133 pgoyette 1134 1.1 ad modinfo_t *mi; 1135 1.72 pgoyette module_t *mod, *mod2, *prev_active; 1136 1.46 jnemeth prop_dictionary_t filedict; 1137 1.54 pooka char buf[MAXMODNAME]; 1138 1.1 ad const char *s, *p; 1139 1.1 ad int error; 1140 1.54 pooka size_t len; 1141 1.1 ad 1142 1.72 pgoyette KASSERT(kernconfig_is_held()); 1143 1.1 ad 1144 1.46 jnemeth filedict = NULL; 1145 1.1 ad error = 0; 1146 1.1 ad 1147 1.1 ad /* 1148 1.133 pgoyette * Set up the pending list for this entry. If this is an 1149 1.133 pgoyette * internal entry (for a dependency), then use the same list 1150 1.133 pgoyette * as for the outer call; otherwise, it's an external entry 1151 1.133 pgoyette * (possibly recursive, ie a module's xxx_modcmd(init, ...) 1152 1.133 pgoyette * routine called us), so use the locally allocated list. In 1153 1.133 pgoyette * either case, add it to our stack. 1154 1.72 pgoyette */ 1155 1.72 pgoyette if (isdep) { 1156 1.133 pgoyette KASSERT(SLIST_FIRST(&pend_stack) != NULL); 1157 1.133 pgoyette pending = SLIST_FIRST(&pend_stack)->pe_pending; 1158 1.72 pgoyette } else 1159 1.72 pgoyette pending = &new_pending; 1160 1.133 pgoyette my_pend_entry.pe_pending = pending; 1161 1.133 pgoyette SLIST_INSERT_HEAD(&pend_stack, &my_pend_entry, pe_entry); 1162 1.72 pgoyette 1163 1.72 pgoyette /* 1164 1.59 pooka * Search the list of disabled builtins first. 1165 1.59 pooka */ 1166 1.59 pooka TAILQ_FOREACH(mod, &module_builtins, mod_chain) { 1167 1.59 pooka if (strcmp(mod->mod_info->mi_name, name) == 0) { 1168 1.59 pooka break; 1169 1.59 pooka } 1170 1.59 pooka } 1171 1.59 pooka if (mod) { 1172 1.133 pgoyette if (ISSET(mod->mod_flags, MODFLG_MUST_FORCE) && 1173 1.133 pgoyette !ISSET(flags, MODCTL_LOAD_FORCE)) { 1174 1.62 pooka if (!autoload) { 1175 1.168 pgoyette module_error("Use -f to reinstate " 1176 1.90 christos "builtin module `%s'", name); 1177 1.62 pooka } 1178 1.133 pgoyette SLIST_REMOVE_HEAD(&pend_stack, pe_entry); 1179 1.59 pooka return EPERM; 1180 1.59 pooka } else { 1181 1.133 pgoyette SLIST_REMOVE_HEAD(&pend_stack, pe_entry); 1182 1.116 christos error = module_do_builtin(mod, name, modp, props); 1183 1.171 pgoyette module_print("module_do_builtin() returned %d", error); 1184 1.59 pooka return error; 1185 1.59 pooka } 1186 1.59 pooka } 1187 1.59 pooka 1188 1.59 pooka /* 1189 1.1 ad * Load the module and link. Before going to the file system, 1190 1.57 pooka * scan the list of modules loaded by the boot loader. 1191 1.1 ad */ 1192 1.1 ad TAILQ_FOREACH(mod, &module_bootlist, mod_chain) { 1193 1.27 ad if (strcmp(mod->mod_info->mi_name, name) == 0) { 1194 1.1 ad TAILQ_REMOVE(&module_bootlist, mod, mod_chain); 1195 1.1 ad break; 1196 1.1 ad } 1197 1.1 ad } 1198 1.14 rumble if (mod != NULL) { 1199 1.72 pgoyette TAILQ_INSERT_TAIL(pending, mod, mod_chain); 1200 1.14 rumble } else { 1201 1.27 ad /* 1202 1.110 pgoyette * Check to see if module is already present. 1203 1.27 ad */ 1204 1.110 pgoyette mod = module_lookup(name); 1205 1.110 pgoyette if (mod != NULL) { 1206 1.110 pgoyette if (modp != NULL) { 1207 1.110 pgoyette *modp = mod; 1208 1.27 ad } 1209 1.110 pgoyette module_print("%s module `%s' already loaded", 1210 1.168 pgoyette isdep ? "Dependent" : "Requested", name); 1211 1.133 pgoyette SLIST_REMOVE_HEAD(&pend_stack, pe_entry); 1212 1.110 pgoyette return EEXIST; 1213 1.109 maxv } 1214 1.110 pgoyette 1215 1.70 pgoyette mod = module_newmodule(MODULE_SOURCE_FILESYS); 1216 1.1 ad if (mod == NULL) { 1217 1.168 pgoyette module_error("Out of memory for `%s'", name); 1218 1.133 pgoyette SLIST_REMOVE_HEAD(&pend_stack, pe_entry); 1219 1.1 ad return ENOMEM; 1220 1.1 ad } 1221 1.54 pooka 1222 1.67 pgoyette error = module_load_vfs_vec(name, flags, autoload, mod, 1223 1.67 pgoyette &filedict); 1224 1.1 ad if (error != 0) { 1225 1.91 christos #ifdef DEBUG 1226 1.92 christos /* 1227 1.92 christos * The exec class of modules contains a list of 1228 1.92 christos * modules that is the union of all the modules 1229 1.92 christos * available for each architecture, so we don't 1230 1.92 christos * print an error if they are missing. 1231 1.92 christos */ 1232 1.104 christos if ((modclass != MODULE_CLASS_EXEC || error != ENOENT) 1233 1.105 christos && root_device != NULL) 1234 1.171 pgoyette module_error("module_load_vfs_vec() failed " 1235 1.171 pgoyette "for `%s', error %d", name, error); 1236 1.171 pgoyette else 1237 1.91 christos #endif 1238 1.171 pgoyette module_print("module_load_vfs_vec() failed " 1239 1.171 pgoyette "for `%s', error %d", name, error); 1240 1.133 pgoyette SLIST_REMOVE_HEAD(&pend_stack, pe_entry); 1241 1.131 chs module_free(mod); 1242 1.8 rumble return error; 1243 1.7 rumble } 1244 1.72 pgoyette TAILQ_INSERT_TAIL(pending, mod, mod_chain); 1245 1.54 pooka 1246 1.11 ad error = module_fetch_info(mod); 1247 1.11 ad if (error != 0) { 1248 1.168 pgoyette module_error("Cannot fetch info for `%s', error %d", 1249 1.90 christos name, error); 1250 1.11 ad goto fail; 1251 1.11 ad } 1252 1.1 ad } 1253 1.1 ad 1254 1.1 ad /* 1255 1.11 ad * Check compatibility. 1256 1.1 ad */ 1257 1.1 ad mi = mod->mod_info; 1258 1.134 pgoyette if (strnlen(mi->mi_name, MAXMODNAME) >= MAXMODNAME) { 1259 1.3 rumble error = EINVAL; 1260 1.168 pgoyette module_error("Module name `%s' longer than %d", mi->mi_name, 1261 1.90 christos MAXMODNAME); 1262 1.3 rumble goto fail; 1263 1.3 rumble } 1264 1.134 pgoyette if (mi->mi_class <= MODULE_CLASS_ANY || 1265 1.134 pgoyette mi->mi_class >= MODULE_CLASS_MAX) { 1266 1.134 pgoyette error = EINVAL; 1267 1.168 pgoyette module_error("Module `%s' has invalid class %d", 1268 1.134 pgoyette mi->mi_name, mi->mi_class); 1269 1.134 pgoyette goto fail; 1270 1.134 pgoyette } 1271 1.21 ad if (!module_compatible(mi->mi_version, __NetBSD_Version__)) { 1272 1.168 pgoyette module_error("Module `%s' built for `%d', system `%d'", 1273 1.87 christos mi->mi_name, mi->mi_version, __NetBSD_Version__); 1274 1.133 pgoyette if (ISSET(flags, MODCTL_LOAD_FORCE)) { 1275 1.168 pgoyette module_error("Forced load, system may be unstable"); 1276 1.24 ad } else { 1277 1.24 ad error = EPROGMISMATCH; 1278 1.24 ad goto fail; 1279 1.24 ad } 1280 1.21 ad } 1281 1.3 rumble 1282 1.1 ad /* 1283 1.18 ad * If a specific kind of module was requested, ensure that we have 1284 1.18 ad * a match. 1285 1.18 ad */ 1286 1.100 matt if (!MODULE_CLASS_MATCH(mi, modclass)) { 1287 1.100 matt module_incompat(mi, modclass); 1288 1.18 ad error = ENOENT; 1289 1.18 ad goto fail; 1290 1.18 ad } 1291 1.18 ad 1292 1.18 ad /* 1293 1.27 ad * If loading a dependency, `name' is a plain module name. 1294 1.1 ad * The name must match. 1295 1.1 ad */ 1296 1.27 ad if (isdep && strcmp(mi->mi_name, name) != 0) { 1297 1.168 pgoyette module_error("Dependency name mismatch (`%s' != `%s')", 1298 1.32 christos name, mi->mi_name); 1299 1.1 ad error = ENOENT; 1300 1.1 ad goto fail; 1301 1.1 ad } 1302 1.1 ad 1303 1.1 ad /* 1304 1.126 pgoyette * If we loaded a module from the filesystem, check the actual 1305 1.126 pgoyette * module name (from the modinfo_t) to ensure another module 1306 1.126 pgoyette * with the same name doesn't already exist. (There's no 1307 1.126 pgoyette * guarantee the filename will match the module name, and the 1308 1.126 pgoyette * dup-symbols check may not be sufficient.) 1309 1.126 pgoyette */ 1310 1.126 pgoyette if (mod->mod_source == MODULE_SOURCE_FILESYS) { 1311 1.126 pgoyette mod2 = module_lookup(mod->mod_info->mi_name); 1312 1.130 pgoyette if ( mod2 && mod2 != mod) { 1313 1.168 pgoyette module_error("Module with name `%s' already loaded", 1314 1.126 pgoyette mod2->mod_info->mi_name); 1315 1.126 pgoyette error = EEXIST; 1316 1.133 pgoyette if (modp != NULL) 1317 1.133 pgoyette *modp = mod2; 1318 1.126 pgoyette goto fail; 1319 1.126 pgoyette } 1320 1.126 pgoyette } 1321 1.126 pgoyette 1322 1.126 pgoyette /* 1323 1.3 rumble * Block circular dependencies. 1324 1.3 rumble */ 1325 1.72 pgoyette TAILQ_FOREACH(mod2, pending, mod_chain) { 1326 1.1 ad if (mod == mod2) { 1327 1.1 ad continue; 1328 1.1 ad } 1329 1.1 ad if (strcmp(mod2->mod_info->mi_name, mi->mi_name) == 0) { 1330 1.109 maxv error = EDEADLK; 1331 1.168 pgoyette module_error("Circular dependency detected for `%s'", 1332 1.32 christos mi->mi_name); 1333 1.109 maxv goto fail; 1334 1.1 ad } 1335 1.1 ad } 1336 1.1 ad 1337 1.1 ad /* 1338 1.1 ad * Now try to load any requisite modules. 1339 1.1 ad */ 1340 1.1 ad if (mi->mi_required != NULL) { 1341 1.133 pgoyette mod->mod_arequired = 0; 1342 1.1 ad for (s = mi->mi_required; *s != '\0'; s = p) { 1343 1.1 ad if (*s == ',') 1344 1.1 ad s++; 1345 1.1 ad p = s; 1346 1.1 ad while (*p != '\0' && *p != ',') 1347 1.1 ad p++; 1348 1.3 rumble len = p - s + 1; 1349 1.3 rumble if (len >= MAXMODNAME) { 1350 1.3 rumble error = EINVAL; 1351 1.168 pgoyette module_error("Required module name `%s' " 1352 1.90 christos "longer than %d", mi->mi_required, 1353 1.90 christos MAXMODNAME); 1354 1.3 rumble goto fail; 1355 1.3 rumble } 1356 1.1 ad strlcpy(buf, s, len); 1357 1.1 ad if (buf[0] == '\0') 1358 1.1 ad break; 1359 1.133 pgoyette alloc_required(mod); 1360 1.6 rumble if (strcmp(buf, mi->mi_name) == 0) { 1361 1.6 rumble error = EDEADLK; 1362 1.168 pgoyette module_error("Self-dependency detected for " 1363 1.32 christos "`%s'", mi->mi_name); 1364 1.6 rumble goto fail; 1365 1.6 rumble } 1366 1.9 jmmv error = module_do_load(buf, true, flags, NULL, 1367 1.81 christos &mod2, MODULE_CLASS_ANY, true); 1368 1.110 pgoyette if (error != 0 && error != EEXIST) { 1369 1.168 pgoyette module_error("Recursive load failed for `%s' " 1370 1.96 maxv "(`%s' required), error %d", mi->mi_name, 1371 1.96 maxv buf, error); 1372 1.1 ad goto fail; 1373 1.88 christos } 1374 1.133 pgoyette (*mod->mod_required)[mod->mod_nrequired++] = mod2; 1375 1.1 ad } 1376 1.1 ad } 1377 1.1 ad 1378 1.1 ad /* 1379 1.15 ad * We loaded all needed modules successfully: perform global 1380 1.15 ad * relocations and initialize. 1381 1.1 ad */ 1382 1.136 pgoyette { 1383 1.136 pgoyette char xname[MAXMODNAME]; 1384 1.136 pgoyette 1385 1.136 pgoyette /* 1386 1.136 pgoyette * In case of error the entire module is gone, so we 1387 1.136 pgoyette * need to save its name for possible error report. 1388 1.136 pgoyette */ 1389 1.136 pgoyette 1390 1.136 pgoyette strlcpy(xname, mi->mi_name, MAXMODNAME); 1391 1.136 pgoyette error = kobj_affix(mod->mod_kobj, mi->mi_name); 1392 1.136 pgoyette if (error != 0) { 1393 1.168 pgoyette module_error("Unable to affix module `%s', error %d", 1394 1.136 pgoyette xname, error); 1395 1.136 pgoyette goto fail2; 1396 1.136 pgoyette } 1397 1.15 ad } 1398 1.15 ad 1399 1.54 pooka if (filedict) { 1400 1.54 pooka if (!module_merge_dicts(filedict, props)) { 1401 1.168 pgoyette module_error("Module properties failed for %s", name); 1402 1.54 pooka error = EINVAL; 1403 1.46 jnemeth goto fail; 1404 1.46 jnemeth } 1405 1.46 jnemeth } 1406 1.133 pgoyette 1407 1.72 pgoyette prev_active = module_active; 1408 1.12 ad module_active = mod; 1409 1.159 pgoyette 1410 1.159 pgoyette /* 1411 1.159 pgoyette * Note that we handle sysctl and evcnt setup _before_ we 1412 1.159 pgoyette * initialize the module itself. This maintains a consistent 1413 1.159 pgoyette * order between built-in and run-time-loaded modules. If 1414 1.159 pgoyette * initialization then fails, we'll need to undo these, too. 1415 1.159 pgoyette */ 1416 1.159 pgoyette module_load_sysctl(mod); /* Set-up module's sysctl if any */ 1417 1.159 pgoyette module_load_evcnt(mod); /* Attach any static evcnt needed */ 1418 1.159 pgoyette 1419 1.159 pgoyette 1420 1.54 pooka error = (*mi->mi_modcmd)(MODULE_CMD_INIT, filedict ? filedict : props); 1421 1.72 pgoyette module_active = prev_active; 1422 1.54 pooka if (filedict) { 1423 1.46 jnemeth prop_object_release(filedict); 1424 1.54 pooka filedict = NULL; 1425 1.46 jnemeth } 1426 1.1 ad if (error != 0) { 1427 1.135 pgoyette module_error("modcmd(CMD_INIT) failed for `%s', error %d", 1428 1.90 christos mi->mi_name, error); 1429 1.159 pgoyette goto fail3; 1430 1.1 ad } 1431 1.54 pooka 1432 1.1 ad /* 1433 1.130 pgoyette * If a recursive load already added a module with the same 1434 1.130 pgoyette * name, abort. 1435 1.130 pgoyette */ 1436 1.130 pgoyette mod2 = module_lookup(mi->mi_name); 1437 1.130 pgoyette if (mod2 && mod2 != mod) { 1438 1.168 pgoyette module_error("Recursive load causes duplicate module `%s'", 1439 1.130 pgoyette mi->mi_name); 1440 1.130 pgoyette error = EEXIST; 1441 1.130 pgoyette goto fail1; 1442 1.130 pgoyette } 1443 1.130 pgoyette 1444 1.130 pgoyette /* 1445 1.1 ad * Good, the module loaded successfully. Put it onto the 1446 1.1 ad * list and add references to its requisite modules. 1447 1.1 ad */ 1448 1.72 pgoyette TAILQ_REMOVE(pending, mod, mod_chain); 1449 1.27 ad module_enqueue(mod); 1450 1.1 ad if (modp != NULL) { 1451 1.1 ad *modp = mod; 1452 1.1 ad } 1453 1.94 pgoyette if (autoload && module_autotime > 0) { 1454 1.26 ad /* 1455 1.26 ad * Arrange to try unloading the module after 1456 1.94 pgoyette * a short delay unless auto-unload is disabled. 1457 1.26 ad */ 1458 1.26 ad mod->mod_autotime = time_second + module_autotime; 1459 1.133 pgoyette SET(mod->mod_flags, MODFLG_AUTO_LOADED); 1460 1.26 ad module_thread_kick(); 1461 1.26 ad } 1462 1.133 pgoyette SLIST_REMOVE_HEAD(&pend_stack, pe_entry); 1463 1.168 pgoyette module_print("Module `%s' loaded successfully", mi->mi_name); 1464 1.131 chs module_callback_load(mod); 1465 1.1 ad return 0; 1466 1.7 rumble 1467 1.130 pgoyette fail1: 1468 1.130 pgoyette (*mi->mi_modcmd)(MODULE_CMD_FINI, NULL); 1469 1.159 pgoyette fail3: 1470 1.159 pgoyette /* 1471 1.159 pgoyette * If there were any registered SYSCTL_SETUP funcs, make sure 1472 1.159 pgoyette * we release the sysctl entries 1473 1.159 pgoyette */ 1474 1.159 pgoyette if (mod->mod_sysctllog) { 1475 1.159 pgoyette sysctl_teardown(&mod->mod_sysctllog); 1476 1.159 pgoyette } 1477 1.159 pgoyette /* Also detach any static evcnt's */ 1478 1.159 pgoyette module_unload_evcnt(mod); 1479 1.1 ad fail: 1480 1.15 ad kobj_unload(mod->mod_kobj); 1481 1.15 ad fail2: 1482 1.54 pooka if (filedict != NULL) { 1483 1.54 pooka prop_object_release(filedict); 1484 1.54 pooka filedict = NULL; 1485 1.54 pooka } 1486 1.72 pgoyette TAILQ_REMOVE(pending, mod, mod_chain); 1487 1.133 pgoyette SLIST_REMOVE_HEAD(&pend_stack, pe_entry); 1488 1.131 chs module_free(mod); 1489 1.171 pgoyette module_print("Load failed, error %d", error); 1490 1.1 ad return error; 1491 1.1 ad } 1492 1.1 ad 1493 1.1 ad /* 1494 1.1 ad * module_do_unload: 1495 1.1 ad * 1496 1.1 ad * Helper routine: do the dirty work of unloading a module. 1497 1.1 ad */ 1498 1.1 ad static int 1499 1.70 pgoyette module_do_unload(const char *name, bool load_requires_force) 1500 1.1 ad { 1501 1.72 pgoyette module_t *mod, *prev_active; 1502 1.1 ad int error; 1503 1.1 ad u_int i; 1504 1.1 ad 1505 1.72 pgoyette KASSERT(kernconfig_is_held()); 1506 1.85 jnemeth KASSERT(name != NULL); 1507 1.1 ad 1508 1.168 pgoyette module_print("Unload requested for `%s' (requires_force %s)", name, 1509 1.117 christos load_requires_force ? "TRUE" : "FALSE"); 1510 1.1 ad mod = module_lookup(name); 1511 1.1 ad if (mod == NULL) { 1512 1.168 pgoyette module_error("Module `%s' not found", name); 1513 1.1 ad return ENOENT; 1514 1.1 ad } 1515 1.59 pooka if (mod->mod_refcnt != 0) { 1516 1.168 pgoyette module_print("Module `%s' busy (%d refs)", name, 1517 1.108 pgoyette mod->mod_refcnt); 1518 1.1 ad return EBUSY; 1519 1.1 ad } 1520 1.76 pooka 1521 1.76 pooka /* 1522 1.76 pooka * Builtin secmodels are there to stay. 1523 1.76 pooka */ 1524 1.76 pooka if (mod->mod_source == MODULE_SOURCE_KERNEL && 1525 1.76 pooka mod->mod_info->mi_class == MODULE_CLASS_SECMODEL) { 1526 1.168 pgoyette module_print("Cannot unload built-in secmodel module `%s'", 1527 1.107 pgoyette name); 1528 1.76 pooka return EPERM; 1529 1.76 pooka } 1530 1.76 pooka 1531 1.72 pgoyette prev_active = module_active; 1532 1.12 ad module_active = mod; 1533 1.131 chs module_callback_unload(mod); 1534 1.137 pgoyette 1535 1.159 pgoyette /* let the module clean up after itself */ 1536 1.159 pgoyette error = (*mod->mod_info->mi_modcmd)(MODULE_CMD_FINI, NULL); 1537 1.159 pgoyette 1538 1.137 pgoyette /* 1539 1.137 pgoyette * If there were any registered SYSCTL_SETUP funcs, make sure 1540 1.159 pgoyette * we release the sysctl entries. Same for static evcnt. 1541 1.137 pgoyette */ 1542 1.159 pgoyette if (error == 0) { 1543 1.159 pgoyette if (mod->mod_sysctllog) { 1544 1.159 pgoyette sysctl_teardown(&mod->mod_sysctllog); 1545 1.159 pgoyette } 1546 1.159 pgoyette module_unload_evcnt(mod); 1547 1.137 pgoyette } 1548 1.72 pgoyette module_active = prev_active; 1549 1.1 ad if (error != 0) { 1550 1.168 pgoyette module_print("Could not unload module `%s' error=%d", name, 1551 1.33 ad error); 1552 1.1 ad return error; 1553 1.1 ad } 1554 1.1 ad module_count--; 1555 1.1 ad TAILQ_REMOVE(&module_list, mod, mod_chain); 1556 1.1 ad for (i = 0; i < mod->mod_nrequired; i++) { 1557 1.133 pgoyette (*mod->mod_required)[i]->mod_refcnt--; 1558 1.1 ad } 1559 1.168 pgoyette module_print("Unloaded module `%s'", name); 1560 1.1 ad if (mod->mod_kobj != NULL) { 1561 1.1 ad kobj_unload(mod->mod_kobj); 1562 1.1 ad } 1563 1.59 pooka if (mod->mod_source == MODULE_SOURCE_KERNEL) { 1564 1.133 pgoyette if (mod->mod_required != NULL) { 1565 1.133 pgoyette /* 1566 1.133 pgoyette * release "required" resources - will be re-parsed 1567 1.133 pgoyette * if the module is re-enabled 1568 1.133 pgoyette */ 1569 1.133 pgoyette kmem_free(mod->mod_required, 1570 1.133 pgoyette mod->mod_arequired * sizeof(module_t *)); 1571 1.133 pgoyette mod->mod_nrequired = 0; 1572 1.133 pgoyette mod->mod_arequired = 0; 1573 1.133 pgoyette mod->mod_required = NULL; 1574 1.133 pgoyette } 1575 1.70 pgoyette if (load_requires_force) 1576 1.70 pgoyette module_require_force(mod); 1577 1.59 pooka TAILQ_INSERT_TAIL(&module_builtins, mod, mod_chain); 1578 1.59 pooka module_builtinlist++; 1579 1.59 pooka } else { 1580 1.131 chs module_free(mod); 1581 1.59 pooka } 1582 1.26 ad module_gen++; 1583 1.1 ad 1584 1.1 ad return 0; 1585 1.1 ad } 1586 1.1 ad 1587 1.1 ad /* 1588 1.1 ad * module_prime: 1589 1.1 ad * 1590 1.1 ad * Push a module loaded by the bootloader onto our internal 1591 1.1 ad * list. 1592 1.1 ad */ 1593 1.1 ad int 1594 1.80 christos module_prime(const char *name, void *base, size_t size) 1595 1.1 ad { 1596 1.111 pgoyette __link_set_decl(modules, modinfo_t); 1597 1.111 pgoyette modinfo_t *const *mip; 1598 1.1 ad module_t *mod; 1599 1.1 ad int error; 1600 1.1 ad 1601 1.112 pgoyette /* Check for module name same as a built-in module */ 1602 1.111 pgoyette 1603 1.111 pgoyette __link_set_foreach(mip, modules) { 1604 1.111 pgoyette if (*mip == &module_dummy) 1605 1.111 pgoyette continue; 1606 1.111 pgoyette if (strcmp((*mip)->mi_name, name) == 0) { 1607 1.168 pgoyette module_error("Module `%s' pushed by boot loader " 1608 1.111 pgoyette "already exists", name); 1609 1.111 pgoyette return EEXIST; 1610 1.111 pgoyette } 1611 1.111 pgoyette } 1612 1.112 pgoyette 1613 1.112 pgoyette /* Also eliminate duplicate boolist entries */ 1614 1.112 pgoyette 1615 1.112 pgoyette TAILQ_FOREACH(mod, &module_bootlist, mod_chain) { 1616 1.112 pgoyette if (strcmp(mod->mod_info->mi_name, name) == 0) { 1617 1.168 pgoyette module_error("Duplicate bootlist entry for module " 1618 1.112 pgoyette "`%s'", name); 1619 1.112 pgoyette return EEXIST; 1620 1.112 pgoyette } 1621 1.112 pgoyette } 1622 1.112 pgoyette 1623 1.112 pgoyette mod = module_newmodule(MODULE_SOURCE_BOOT); 1624 1.112 pgoyette if (mod == NULL) { 1625 1.112 pgoyette return ENOMEM; 1626 1.112 pgoyette } 1627 1.112 pgoyette 1628 1.80 christos error = kobj_load_mem(&mod->mod_kobj, name, base, size); 1629 1.1 ad if (error != 0) { 1630 1.131 chs module_free(mod); 1631 1.168 pgoyette module_error("Unable to load `%s' pushed by boot loader, " 1632 1.90 christos "error %d", name, error); 1633 1.11 ad return error; 1634 1.11 ad } 1635 1.11 ad error = module_fetch_info(mod); 1636 1.11 ad if (error != 0) { 1637 1.11 ad kobj_unload(mod->mod_kobj); 1638 1.131 chs module_free(mod); 1639 1.168 pgoyette module_error("Unable to fetch_info for `%s' pushed by boot " 1640 1.111 pgoyette "loader, error %d", name, error); 1641 1.1 ad return error; 1642 1.1 ad } 1643 1.11 ad 1644 1.1 ad TAILQ_INSERT_TAIL(&module_bootlist, mod, mod_chain); 1645 1.1 ad 1646 1.1 ad return 0; 1647 1.1 ad } 1648 1.11 ad 1649 1.11 ad /* 1650 1.11 ad * module_fetch_into: 1651 1.11 ad * 1652 1.11 ad * Fetch modinfo record from a loaded module. 1653 1.11 ad */ 1654 1.11 ad static int 1655 1.11 ad module_fetch_info(module_t *mod) 1656 1.11 ad { 1657 1.11 ad int error; 1658 1.11 ad void *addr; 1659 1.11 ad size_t size; 1660 1.11 ad 1661 1.11 ad /* 1662 1.11 ad * Find module info record and check compatibility. 1663 1.11 ad */ 1664 1.11 ad error = kobj_find_section(mod->mod_kobj, "link_set_modules", 1665 1.11 ad &addr, &size); 1666 1.11 ad if (error != 0) { 1667 1.90 christos module_error("`link_set_modules' section not present, " 1668 1.90 christos "error %d", error); 1669 1.11 ad return error; 1670 1.11 ad } 1671 1.11 ad if (size != sizeof(modinfo_t **)) { 1672 1.161 riastrad if (size > sizeof(modinfo_t **) && 1673 1.161 riastrad (size % sizeof(modinfo_t **)) == 0) { 1674 1.161 riastrad module_error("`link_set_modules' section wrong size " 1675 1.161 riastrad "(%zu different MODULE declarations?)", 1676 1.161 riastrad size / sizeof(modinfo_t **)); 1677 1.161 riastrad } else { 1678 1.161 riastrad module_error("`link_set_modules' section wrong size " 1679 1.161 riastrad "(got %zu, wanted %zu)", 1680 1.161 riastrad size, sizeof(modinfo_t **)); 1681 1.161 riastrad } 1682 1.84 tron return ENOEXEC; 1683 1.11 ad } 1684 1.11 ad mod->mod_info = *(modinfo_t **)addr; 1685 1.11 ad 1686 1.11 ad return 0; 1687 1.11 ad } 1688 1.12 ad 1689 1.12 ad /* 1690 1.12 ad * module_find_section: 1691 1.12 ad * 1692 1.12 ad * Allows a module that is being initialized to look up a section 1693 1.12 ad * within its ELF object. 1694 1.12 ad */ 1695 1.12 ad int 1696 1.12 ad module_find_section(const char *name, void **addr, size_t *size) 1697 1.12 ad { 1698 1.12 ad 1699 1.72 pgoyette KASSERT(kernconfig_is_held()); 1700 1.12 ad KASSERT(module_active != NULL); 1701 1.12 ad 1702 1.12 ad return kobj_find_section(module_active->mod_kobj, name, addr, size); 1703 1.12 ad } 1704 1.26 ad 1705 1.26 ad /* 1706 1.26 ad * module_thread: 1707 1.26 ad * 1708 1.26 ad * Automatically unload modules. We try once to unload autoloaded 1709 1.26 ad * modules after module_autotime seconds. If the system is under 1710 1.94 pgoyette * severe memory pressure, we'll try unloading all modules, else if 1711 1.94 pgoyette * module_autotime is zero, we don't try to unload, even if the 1712 1.94 pgoyette * module was previously scheduled for unload. 1713 1.26 ad */ 1714 1.26 ad static void 1715 1.26 ad module_thread(void *cookie) 1716 1.26 ad { 1717 1.26 ad module_t *mod, *next; 1718 1.28 ad modinfo_t *mi; 1719 1.28 ad int error; 1720 1.26 ad 1721 1.26 ad for (;;) { 1722 1.72 pgoyette kernconfig_lock(); 1723 1.26 ad for (mod = TAILQ_FIRST(&module_list); mod != NULL; mod = next) { 1724 1.26 ad next = TAILQ_NEXT(mod, mod_chain); 1725 1.83 jmcneill 1726 1.83 jmcneill /* skip built-in modules */ 1727 1.61 pooka if (mod->mod_source == MODULE_SOURCE_KERNEL) 1728 1.61 pooka continue; 1729 1.83 jmcneill /* skip modules that weren't auto-loaded */ 1730 1.133 pgoyette if (!ISSET(mod->mod_flags, MODFLG_AUTO_LOADED)) 1731 1.83 jmcneill continue; 1732 1.83 jmcneill 1733 1.151 ad if (uvm_availmem(false) < uvmexp.freemin) { 1734 1.26 ad module_thread_ticks = hz; 1735 1.94 pgoyette } else if (module_autotime == 0 || 1736 1.94 pgoyette mod->mod_autotime == 0) { 1737 1.26 ad continue; 1738 1.26 ad } else if (time_second < mod->mod_autotime) { 1739 1.26 ad module_thread_ticks = hz; 1740 1.26 ad continue; 1741 1.37 ad } else { 1742 1.26 ad mod->mod_autotime = 0; 1743 1.37 ad } 1744 1.83 jmcneill 1745 1.28 ad /* 1746 1.158 riastrad * Ask the module if it can be safely unloaded. 1747 1.158 riastrad * 1748 1.158 riastrad * - Modules which have been audited to be OK 1749 1.158 riastrad * with that will return 0. 1750 1.158 riastrad * 1751 1.158 riastrad * - Modules which have not been audited for 1752 1.158 riastrad * safe autounload will return ENOTTY. 1753 1.158 riastrad * 1754 1.158 riastrad * => With kern.module.autounload_unsafe=1, 1755 1.158 riastrad * we treat ENOTTY as acceptance. 1756 1.158 riastrad * 1757 1.158 riastrad * - Some modules would ping-ping in and out 1758 1.158 riastrad * because their use is transient but often. 1759 1.158 riastrad * Example: exec_script. Other modules may 1760 1.158 riastrad * still be in use. These modules can 1761 1.158 riastrad * prevent autounload in all cases by 1762 1.158 riastrad * returning EBUSY or some other error code. 1763 1.28 ad */ 1764 1.28 ad mi = mod->mod_info; 1765 1.28 ad error = (*mi->mi_modcmd)(MODULE_CMD_AUTOUNLOAD, NULL); 1766 1.158 riastrad if (error == 0 || 1767 1.158 riastrad (error == ENOTTY && module_autounload_unsafe)) { 1768 1.168 pgoyette module_print("Requesting autounload for" 1769 1.167 pgoyette "`%s'", mi->mi_name); 1770 1.70 pgoyette (void)module_do_unload(mi->mi_name, false); 1771 1.107 pgoyette } else 1772 1.168 pgoyette module_print("Module `%s' declined to be " 1773 1.107 pgoyette "auto-unloaded error=%d", mi->mi_name, 1774 1.107 pgoyette error); 1775 1.26 ad } 1776 1.72 pgoyette kernconfig_unlock(); 1777 1.26 ad 1778 1.26 ad mutex_enter(&module_thread_lock); 1779 1.26 ad (void)cv_timedwait(&module_thread_cv, &module_thread_lock, 1780 1.26 ad module_thread_ticks); 1781 1.26 ad module_thread_ticks = 0; 1782 1.26 ad mutex_exit(&module_thread_lock); 1783 1.26 ad } 1784 1.26 ad } 1785 1.26 ad 1786 1.26 ad /* 1787 1.26 ad * module_thread: 1788 1.26 ad * 1789 1.26 ad * Kick the module thread into action, perhaps because the 1790 1.26 ad * system is low on memory. 1791 1.26 ad */ 1792 1.26 ad void 1793 1.26 ad module_thread_kick(void) 1794 1.26 ad { 1795 1.26 ad 1796 1.26 ad mutex_enter(&module_thread_lock); 1797 1.26 ad module_thread_ticks = hz; 1798 1.26 ad cv_broadcast(&module_thread_cv); 1799 1.26 ad mutex_exit(&module_thread_lock); 1800 1.26 ad } 1801 1.30 ad 1802 1.30 ad #ifdef DDB 1803 1.30 ad /* 1804 1.30 ad * module_whatis: 1805 1.30 ad * 1806 1.30 ad * Helper routine for DDB. 1807 1.30 ad */ 1808 1.30 ad void 1809 1.30 ad module_whatis(uintptr_t addr, void (*pr)(const char *, ...)) 1810 1.30 ad { 1811 1.30 ad module_t *mod; 1812 1.30 ad size_t msize; 1813 1.30 ad vaddr_t maddr; 1814 1.30 ad 1815 1.30 ad TAILQ_FOREACH(mod, &module_list, mod_chain) { 1816 1.43 ad if (mod->mod_kobj == NULL) { 1817 1.43 ad continue; 1818 1.43 ad } 1819 1.49 dyoung if (kobj_stat(mod->mod_kobj, &maddr, &msize) != 0) 1820 1.49 dyoung continue; 1821 1.30 ad if (addr < maddr || addr >= maddr + msize) { 1822 1.30 ad continue; 1823 1.30 ad } 1824 1.30 ad (*pr)("%p is %p+%zu, in kernel module `%s'\n", 1825 1.30 ad (void *)addr, (void *)maddr, 1826 1.30 ad (size_t)(addr - maddr), mod->mod_info->mi_name); 1827 1.30 ad } 1828 1.30 ad } 1829 1.30 ad 1830 1.30 ad /* 1831 1.30 ad * module_print_list: 1832 1.30 ad * 1833 1.30 ad * Helper routine for DDB. 1834 1.30 ad */ 1835 1.30 ad void 1836 1.30 ad module_print_list(void (*pr)(const char *, ...)) 1837 1.30 ad { 1838 1.30 ad const char *src; 1839 1.30 ad module_t *mod; 1840 1.30 ad size_t msize; 1841 1.30 ad vaddr_t maddr; 1842 1.30 ad 1843 1.30 ad (*pr)("%16s %16s %8s %8s\n", "NAME", "TEXT/DATA", "SIZE", "SOURCE"); 1844 1.30 ad 1845 1.30 ad TAILQ_FOREACH(mod, &module_list, mod_chain) { 1846 1.30 ad switch (mod->mod_source) { 1847 1.30 ad case MODULE_SOURCE_KERNEL: 1848 1.30 ad src = "builtin"; 1849 1.30 ad break; 1850 1.30 ad case MODULE_SOURCE_FILESYS: 1851 1.30 ad src = "filesys"; 1852 1.30 ad break; 1853 1.30 ad case MODULE_SOURCE_BOOT: 1854 1.30 ad src = "boot"; 1855 1.30 ad break; 1856 1.30 ad default: 1857 1.30 ad src = "unknown"; 1858 1.30 ad break; 1859 1.30 ad } 1860 1.49 dyoung if (mod->mod_kobj == NULL) { 1861 1.43 ad maddr = 0; 1862 1.43 ad msize = 0; 1863 1.49 dyoung } else if (kobj_stat(mod->mod_kobj, &maddr, &msize) != 0) 1864 1.49 dyoung continue; 1865 1.31 ad (*pr)("%16s %16lx %8ld %8s\n", mod->mod_info->mi_name, 1866 1.30 ad (long)maddr, (long)msize, src); 1867 1.30 ad } 1868 1.30 ad } 1869 1.30 ad #endif /* DDB */ 1870 1.46 jnemeth 1871 1.47 jnemeth static bool 1872 1.47 jnemeth module_merge_dicts(prop_dictionary_t existing_dict, 1873 1.47 jnemeth const prop_dictionary_t new_dict) 1874 1.47 jnemeth { 1875 1.47 jnemeth prop_dictionary_keysym_t props_keysym; 1876 1.47 jnemeth prop_object_iterator_t props_iter; 1877 1.47 jnemeth prop_object_t props_obj; 1878 1.47 jnemeth const char *props_key; 1879 1.47 jnemeth bool error; 1880 1.47 jnemeth 1881 1.52 jnemeth if (new_dict == NULL) { /* nothing to merge */ 1882 1.52 jnemeth return true; 1883 1.52 jnemeth } 1884 1.52 jnemeth 1885 1.47 jnemeth error = false; 1886 1.47 jnemeth props_iter = prop_dictionary_iterator(new_dict); 1887 1.47 jnemeth if (props_iter == NULL) { 1888 1.47 jnemeth return false; 1889 1.47 jnemeth } 1890 1.47 jnemeth 1891 1.47 jnemeth while ((props_obj = prop_object_iterator_next(props_iter)) != NULL) { 1892 1.47 jnemeth props_keysym = (prop_dictionary_keysym_t)props_obj; 1893 1.150 thorpej props_key = prop_dictionary_keysym_value(props_keysym); 1894 1.47 jnemeth props_obj = prop_dictionary_get_keysym(new_dict, props_keysym); 1895 1.47 jnemeth if ((props_obj == NULL) || !prop_dictionary_set(existing_dict, 1896 1.47 jnemeth props_key, props_obj)) { 1897 1.47 jnemeth error = true; 1898 1.47 jnemeth goto out; 1899 1.47 jnemeth } 1900 1.47 jnemeth } 1901 1.47 jnemeth error = false; 1902 1.47 jnemeth 1903 1.47 jnemeth out: 1904 1.47 jnemeth prop_object_iterator_release(props_iter); 1905 1.47 jnemeth 1906 1.47 jnemeth return !error; 1907 1.47 jnemeth } 1908 1.131 chs 1909 1.131 chs /* 1910 1.131 chs * module_specific_key_create: 1911 1.131 chs * 1912 1.131 chs * Create a key for subsystem module-specific data. 1913 1.131 chs */ 1914 1.131 chs specificdata_key_t 1915 1.131 chs module_specific_key_create(specificdata_key_t *keyp, specificdata_dtor_t dtor) 1916 1.131 chs { 1917 1.131 chs 1918 1.131 chs return specificdata_key_create(module_specificdata_domain, keyp, dtor); 1919 1.131 chs } 1920 1.131 chs 1921 1.131 chs /* 1922 1.131 chs * module_specific_key_delete: 1923 1.131 chs * 1924 1.131 chs * Delete a key for subsystem module-specific data. 1925 1.131 chs */ 1926 1.131 chs void 1927 1.131 chs module_specific_key_delete(specificdata_key_t key) 1928 1.131 chs { 1929 1.131 chs 1930 1.131 chs return specificdata_key_delete(module_specificdata_domain, key); 1931 1.131 chs } 1932 1.131 chs 1933 1.131 chs /* 1934 1.131 chs * module_getspecific: 1935 1.131 chs * 1936 1.131 chs * Return module-specific data corresponding to the specified key. 1937 1.131 chs */ 1938 1.131 chs void * 1939 1.131 chs module_getspecific(module_t *mod, specificdata_key_t key) 1940 1.131 chs { 1941 1.131 chs 1942 1.131 chs return specificdata_getspecific(module_specificdata_domain, 1943 1.131 chs &mod->mod_sdref, key); 1944 1.131 chs } 1945 1.131 chs 1946 1.131 chs /* 1947 1.131 chs * module_setspecific: 1948 1.131 chs * 1949 1.131 chs * Set module-specific data corresponding to the specified key. 1950 1.131 chs */ 1951 1.131 chs void 1952 1.131 chs module_setspecific(module_t *mod, specificdata_key_t key, void *data) 1953 1.131 chs { 1954 1.131 chs 1955 1.131 chs specificdata_setspecific(module_specificdata_domain, 1956 1.131 chs &mod->mod_sdref, key, data); 1957 1.131 chs } 1958 1.131 chs 1959 1.131 chs /* 1960 1.131 chs * module_register_callbacks: 1961 1.131 chs * 1962 1.131 chs * Register a new set of callbacks to be called on module load/unload. 1963 1.131 chs * Call the load callback on each existing module. 1964 1.131 chs * Return an opaque handle for unregistering these later. 1965 1.131 chs */ 1966 1.131 chs void * 1967 1.131 chs module_register_callbacks(void (*load)(struct module *), 1968 1.131 chs void (*unload)(struct module *)) 1969 1.131 chs { 1970 1.131 chs struct module_callbacks *modcb; 1971 1.131 chs struct module *mod; 1972 1.131 chs 1973 1.131 chs modcb = kmem_alloc(sizeof(*modcb), KM_SLEEP); 1974 1.131 chs modcb->modcb_load = load; 1975 1.131 chs modcb->modcb_unload = unload; 1976 1.131 chs 1977 1.131 chs kernconfig_lock(); 1978 1.131 chs TAILQ_INSERT_TAIL(&modcblist, modcb, modcb_list); 1979 1.155 riastrad TAILQ_FOREACH_REVERSE(mod, &module_list, modlist, mod_chain) 1980 1.131 chs load(mod); 1981 1.131 chs kernconfig_unlock(); 1982 1.131 chs 1983 1.131 chs return modcb; 1984 1.131 chs } 1985 1.131 chs 1986 1.131 chs /* 1987 1.131 chs * module_unregister_callbacks: 1988 1.131 chs * 1989 1.131 chs * Unregister a previously-registered set of module load/unload callbacks. 1990 1.131 chs * Call the unload callback on each existing module. 1991 1.131 chs */ 1992 1.131 chs void 1993 1.131 chs module_unregister_callbacks(void *opaque) 1994 1.131 chs { 1995 1.131 chs struct module_callbacks *modcb; 1996 1.131 chs struct module *mod; 1997 1.131 chs 1998 1.131 chs modcb = opaque; 1999 1.131 chs kernconfig_lock(); 2000 1.131 chs TAILQ_FOREACH(mod, &module_list, mod_chain) 2001 1.131 chs modcb->modcb_unload(mod); 2002 1.131 chs TAILQ_REMOVE(&modcblist, modcb, modcb_list); 2003 1.131 chs kernconfig_unlock(); 2004 1.131 chs kmem_free(modcb, sizeof(*modcb)); 2005 1.131 chs } 2006 1.131 chs 2007 1.131 chs /* 2008 1.131 chs * module_callback_load: 2009 1.131 chs * 2010 1.131 chs * Helper routine: call all load callbacks on a module being loaded. 2011 1.131 chs */ 2012 1.131 chs static void 2013 1.131 chs module_callback_load(struct module *mod) 2014 1.131 chs { 2015 1.131 chs struct module_callbacks *modcb; 2016 1.131 chs 2017 1.131 chs TAILQ_FOREACH(modcb, &modcblist, modcb_list) { 2018 1.131 chs modcb->modcb_load(mod); 2019 1.131 chs } 2020 1.131 chs } 2021 1.131 chs 2022 1.131 chs /* 2023 1.131 chs * module_callback_unload: 2024 1.131 chs * 2025 1.131 chs * Helper routine: call all unload callbacks on a module being unloaded. 2026 1.131 chs */ 2027 1.131 chs static void 2028 1.131 chs module_callback_unload(struct module *mod) 2029 1.131 chs { 2030 1.131 chs struct module_callbacks *modcb; 2031 1.131 chs 2032 1.131 chs TAILQ_FOREACH(modcb, &modcblist, modcb_list) { 2033 1.131 chs modcb->modcb_unload(mod); 2034 1.131 chs } 2035 1.131 chs } 2036