The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kern/kern_linker.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 1997-2000 Doug Rabson
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  */
   26 
   27 #include <sys/cdefs.h>
   28 __FBSDID("$FreeBSD: releng/9.0/sys/kern/kern_linker.c 225617 2011-09-16 13:58:51Z kmacy $");
   29 
   30 #include "opt_ddb.h"
   31 #include "opt_hwpmc_hooks.h"
   32 
   33 #include <sys/param.h>
   34 #include <sys/kernel.h>
   35 #include <sys/systm.h>
   36 #include <sys/malloc.h>
   37 #include <sys/sysproto.h>
   38 #include <sys/sysent.h>
   39 #include <sys/priv.h>
   40 #include <sys/proc.h>
   41 #include <sys/lock.h>
   42 #include <sys/mutex.h>
   43 #include <sys/sx.h>
   44 #include <sys/module.h>
   45 #include <sys/mount.h>
   46 #include <sys/linker.h>
   47 #include <sys/fcntl.h>
   48 #include <sys/jail.h>
   49 #include <sys/libkern.h>
   50 #include <sys/namei.h>
   51 #include <sys/vnode.h>
   52 #include <sys/syscallsubr.h>
   53 #include <sys/sysctl.h>
   54 
   55 #include <net/vnet.h>
   56 
   57 #include <security/mac/mac_framework.h>
   58 
   59 #include "linker_if.h"
   60 
   61 #ifdef HWPMC_HOOKS
   62 #include <sys/pmckern.h>
   63 #endif
   64 
   65 #ifdef KLD_DEBUG
   66 int kld_debug = 0;
   67 SYSCTL_INT(_debug, OID_AUTO, kld_debug, CTLFLAG_RW,
   68         &kld_debug, 0, "Set various levels of KLD debug");
   69 #endif
   70 
   71 #define KLD_LOCK()              sx_xlock(&kld_sx)
   72 #define KLD_UNLOCK()            sx_xunlock(&kld_sx)
   73 #define KLD_DOWNGRADE()         sx_downgrade(&kld_sx)
   74 #define KLD_LOCK_READ()         sx_slock(&kld_sx)
   75 #define KLD_UNLOCK_READ()       sx_sunlock(&kld_sx)
   76 #define KLD_LOCKED()            sx_xlocked(&kld_sx)
   77 #define KLD_LOCK_ASSERT() do {                                          \
   78         if (!cold)                                                      \
   79                 sx_assert(&kld_sx, SX_XLOCKED);                         \
   80 } while (0)
   81 
   82 /*
   83  * static char *linker_search_path(const char *name, struct mod_depend
   84  * *verinfo);
   85  */
   86 static const char       *linker_basename(const char *path);
   87 
   88 /*
   89  * Find a currently loaded file given its filename.
   90  */
   91 static linker_file_t linker_find_file_by_name(const char* _filename);
   92 
   93 /*
   94  * Find a currently loaded file given its file id.
   95  */
   96 static linker_file_t linker_find_file_by_id(int _fileid);
   97 
   98 /* Metadata from the static kernel */
   99 SET_DECLARE(modmetadata_set, struct mod_metadata);
  100 
  101 MALLOC_DEFINE(M_LINKER, "linker", "kernel linker");
  102 
  103 linker_file_t linker_kernel_file;
  104 
  105 static struct sx kld_sx;        /* kernel linker lock */
  106 
  107 /*
  108  * Load counter used by clients to determine if a linker file has been
  109  * re-loaded. This counter is incremented for each file load.
  110  */
  111 static int loadcnt;
  112 
  113 static linker_class_list_t classes;
  114 static linker_file_list_t linker_files;
  115 static int next_file_id = 1;
  116 static int linker_no_more_classes = 0;
  117 
  118 #define LINKER_GET_NEXT_FILE_ID(a) do {                                 \
  119         linker_file_t lftmp;                                            \
  120                                                                         \
  121         KLD_LOCK_ASSERT();                                              \
  122 retry:                                                                  \
  123         TAILQ_FOREACH(lftmp, &linker_files, link) {                     \
  124                 if (next_file_id == lftmp->id) {                        \
  125                         next_file_id++;                                 \
  126                         goto retry;                                     \
  127                 }                                                       \
  128         }                                                               \
  129         (a) = next_file_id;                                             \
  130 } while(0)
  131 
  132 
  133 /* XXX wrong name; we're looking at version provision tags here, not modules */
  134 typedef TAILQ_HEAD(, modlist) modlisthead_t;
  135 struct modlist {
  136         TAILQ_ENTRY(modlist) link;      /* chain together all modules */
  137         linker_file_t   container;
  138         const char      *name;
  139         int             version;
  140 };
  141 typedef struct modlist *modlist_t;
  142 static modlisthead_t found_modules;
  143 
  144 static int      linker_file_add_dependency(linker_file_t file,
  145                     linker_file_t dep);
  146 static caddr_t  linker_file_lookup_symbol_internal(linker_file_t file,
  147                     const char* name, int deps);
  148 static int      linker_load_module(const char *kldname,
  149                     const char *modname, struct linker_file *parent,
  150                     struct mod_depend *verinfo, struct linker_file **lfpp);
  151 static modlist_t modlist_lookup2(const char *name, struct mod_depend *verinfo);
  152 
  153 static char *
  154 linker_strdup(const char *str)
  155 {
  156         char *result;
  157 
  158         if ((result = malloc((strlen(str) + 1), M_LINKER, M_WAITOK)) != NULL)
  159                 strcpy(result, str);
  160         return (result);
  161 }
  162 
  163 static void
  164 linker_init(void *arg)
  165 {
  166 
  167         sx_init(&kld_sx, "kernel linker");
  168         TAILQ_INIT(&classes);
  169         TAILQ_INIT(&linker_files);
  170 }
  171 
  172 SYSINIT(linker, SI_SUB_KLD, SI_ORDER_FIRST, linker_init, 0);
  173 
  174 static void
  175 linker_stop_class_add(void *arg)
  176 {
  177 
  178         linker_no_more_classes = 1;
  179 }
  180 
  181 SYSINIT(linker_class, SI_SUB_KLD, SI_ORDER_ANY, linker_stop_class_add, NULL);
  182 
  183 int
  184 linker_add_class(linker_class_t lc)
  185 {
  186 
  187         /*
  188          * We disallow any class registration past SI_ORDER_ANY
  189          * of SI_SUB_KLD.  We bump the reference count to keep the
  190          * ops from being freed.
  191          */
  192         if (linker_no_more_classes == 1)
  193                 return (EPERM);
  194         kobj_class_compile((kobj_class_t) lc);
  195         ((kobj_class_t)lc)->refs++;     /* XXX: kobj_mtx */
  196         TAILQ_INSERT_TAIL(&classes, lc, link);
  197         return (0);
  198 }
  199 
  200 static void
  201 linker_file_sysinit(linker_file_t lf)
  202 {
  203         struct sysinit **start, **stop, **sipp, **xipp, *save;
  204 
  205         KLD_DPF(FILE, ("linker_file_sysinit: calling SYSINITs for %s\n",
  206             lf->filename));
  207 
  208         if (linker_file_lookup_set(lf, "sysinit_set", &start, &stop, NULL) != 0)
  209                 return;
  210         /*
  211          * Perform a bubble sort of the system initialization objects by
  212          * their subsystem (primary key) and order (secondary key).
  213          *
  214          * Since some things care about execution order, this is the operation
  215          * which ensures continued function.
  216          */
  217         for (sipp = start; sipp < stop; sipp++) {
  218                 for (xipp = sipp + 1; xipp < stop; xipp++) {
  219                         if ((*sipp)->subsystem < (*xipp)->subsystem ||
  220                             ((*sipp)->subsystem == (*xipp)->subsystem &&
  221                             (*sipp)->order <= (*xipp)->order))
  222                                 continue;       /* skip */
  223                         save = *sipp;
  224                         *sipp = *xipp;
  225                         *xipp = save;
  226                 }
  227         }
  228 
  229         /*
  230          * Traverse the (now) ordered list of system initialization tasks.
  231          * Perform each task, and continue on to the next task.
  232          */
  233         mtx_lock(&Giant);
  234         for (sipp = start; sipp < stop; sipp++) {
  235                 if ((*sipp)->subsystem == SI_SUB_DUMMY)
  236                         continue;       /* skip dummy task(s) */
  237 
  238                 /* Call function */
  239                 (*((*sipp)->func)) ((*sipp)->udata);
  240         }
  241         mtx_unlock(&Giant);
  242 }
  243 
  244 static void
  245 linker_file_sysuninit(linker_file_t lf)
  246 {
  247         struct sysinit **start, **stop, **sipp, **xipp, *save;
  248 
  249         KLD_DPF(FILE, ("linker_file_sysuninit: calling SYSUNINITs for %s\n",
  250             lf->filename));
  251 
  252         if (linker_file_lookup_set(lf, "sysuninit_set", &start, &stop,
  253             NULL) != 0)
  254                 return;
  255 
  256         /*
  257          * Perform a reverse bubble sort of the system initialization objects
  258          * by their subsystem (primary key) and order (secondary key).
  259          *
  260          * Since some things care about execution order, this is the operation
  261          * which ensures continued function.
  262          */
  263         for (sipp = start; sipp < stop; sipp++) {
  264                 for (xipp = sipp + 1; xipp < stop; xipp++) {
  265                         if ((*sipp)->subsystem > (*xipp)->subsystem ||
  266                             ((*sipp)->subsystem == (*xipp)->subsystem &&
  267                             (*sipp)->order >= (*xipp)->order))
  268                                 continue;       /* skip */
  269                         save = *sipp;
  270                         *sipp = *xipp;
  271                         *xipp = save;
  272                 }
  273         }
  274 
  275         /*
  276          * Traverse the (now) ordered list of system initialization tasks.
  277          * Perform each task, and continue on to the next task.
  278          */
  279         mtx_lock(&Giant);
  280         for (sipp = start; sipp < stop; sipp++) {
  281                 if ((*sipp)->subsystem == SI_SUB_DUMMY)
  282                         continue;       /* skip dummy task(s) */
  283 
  284                 /* Call function */
  285                 (*((*sipp)->func)) ((*sipp)->udata);
  286         }
  287         mtx_unlock(&Giant);
  288 }
  289 
  290 static void
  291 linker_file_register_sysctls(linker_file_t lf)
  292 {
  293         struct sysctl_oid **start, **stop, **oidp;
  294 
  295         KLD_DPF(FILE,
  296             ("linker_file_register_sysctls: registering SYSCTLs for %s\n",
  297             lf->filename));
  298 
  299         if (linker_file_lookup_set(lf, "sysctl_set", &start, &stop, NULL) != 0)
  300                 return;
  301 
  302         sysctl_lock();
  303         for (oidp = start; oidp < stop; oidp++)
  304                 sysctl_register_oid(*oidp);
  305         sysctl_unlock();
  306 }
  307 
  308 static void
  309 linker_file_unregister_sysctls(linker_file_t lf)
  310 {
  311         struct sysctl_oid **start, **stop, **oidp;
  312 
  313         KLD_DPF(FILE, ("linker_file_unregister_sysctls: registering SYSCTLs"
  314             " for %s\n", lf->filename));
  315 
  316         if (linker_file_lookup_set(lf, "sysctl_set", &start, &stop, NULL) != 0)
  317                 return;
  318 
  319         sysctl_lock();
  320         for (oidp = start; oidp < stop; oidp++)
  321                 sysctl_unregister_oid(*oidp);
  322         sysctl_unlock();
  323 }
  324 
  325 static int
  326 linker_file_register_modules(linker_file_t lf)
  327 {
  328         struct mod_metadata **start, **stop, **mdp;
  329         const moduledata_t *moddata;
  330         int first_error, error;
  331 
  332         KLD_DPF(FILE, ("linker_file_register_modules: registering modules"
  333             " in %s\n", lf->filename));
  334 
  335         if (linker_file_lookup_set(lf, "modmetadata_set", &start,
  336             &stop, NULL) != 0) {
  337                 /*
  338                  * This fallback should be unnecessary, but if we get booted
  339                  * from boot2 instead of loader and we are missing our
  340                  * metadata then we have to try the best we can.
  341                  */
  342                 if (lf == linker_kernel_file) {
  343                         start = SET_BEGIN(modmetadata_set);
  344                         stop = SET_LIMIT(modmetadata_set);
  345                 } else
  346                         return (0);
  347         }
  348         first_error = 0;
  349         for (mdp = start; mdp < stop; mdp++) {
  350                 if ((*mdp)->md_type != MDT_MODULE)
  351                         continue;
  352                 moddata = (*mdp)->md_data;
  353                 KLD_DPF(FILE, ("Registering module %s in %s\n",
  354                     moddata->name, lf->filename));
  355                 error = module_register(moddata, lf);
  356                 if (error) {
  357                         printf("Module %s failed to register: %d\n",
  358                             moddata->name, error);
  359                         if (first_error == 0)
  360                                 first_error = error;
  361                 }
  362         }
  363         return (first_error);
  364 }
  365 
  366 static void
  367 linker_init_kernel_modules(void)
  368 {
  369 
  370         linker_file_register_modules(linker_kernel_file);
  371 }
  372 
  373 SYSINIT(linker_kernel, SI_SUB_KLD, SI_ORDER_ANY, linker_init_kernel_modules,
  374     0);
  375 
  376 static int
  377 linker_load_file(const char *filename, linker_file_t *result)
  378 {
  379         linker_class_t lc;
  380         linker_file_t lf;
  381         int foundfile, error;
  382 
  383         /* Refuse to load modules if securelevel raised */
  384         if (prison0.pr_securelevel > 0)
  385                 return (EPERM);
  386 
  387         KLD_LOCK_ASSERT();
  388         lf = linker_find_file_by_name(filename);
  389         if (lf) {
  390                 KLD_DPF(FILE, ("linker_load_file: file %s is already loaded,"
  391                     " incrementing refs\n", filename));
  392                 *result = lf;
  393                 lf->refs++;
  394                 return (0);
  395         }
  396         foundfile = 0;
  397         error = 0;
  398 
  399         /*
  400          * We do not need to protect (lock) classes here because there is
  401          * no class registration past startup (SI_SUB_KLD, SI_ORDER_ANY)
  402          * and there is no class deregistration mechanism at this time.
  403          */
  404         TAILQ_FOREACH(lc, &classes, link) {
  405                 KLD_DPF(FILE, ("linker_load_file: trying to load %s\n",
  406                     filename));
  407                 error = LINKER_LOAD_FILE(lc, filename, &lf);
  408                 /*
  409                  * If we got something other than ENOENT, then it exists but
  410                  * we cannot load it for some other reason.
  411                  */
  412                 if (error != ENOENT)
  413                         foundfile = 1;
  414                 if (lf) {
  415                         error = linker_file_register_modules(lf);
  416                         if (error == EEXIST) {
  417                                 linker_file_unload(lf, LINKER_UNLOAD_FORCE);
  418                                 return (error);
  419                         }
  420                         KLD_UNLOCK();
  421                         linker_file_register_sysctls(lf);
  422                         linker_file_sysinit(lf);
  423                         KLD_LOCK();
  424                         lf->flags |= LINKER_FILE_LINKED;
  425                         *result = lf;
  426                         return (0);
  427                 }
  428         }
  429         /*
  430          * Less than ideal, but tells the user whether it failed to load or
  431          * the module was not found.
  432          */
  433         if (foundfile) {
  434 
  435                 /*
  436                  * If the file type has not been recognized by the last try
  437                  * printout a message before to fail.
  438                  */
  439                 if (error == ENOSYS)
  440                         printf("linker_load_file: Unsupported file type\n");
  441 
  442                 /*
  443                  * Format not recognized or otherwise unloadable.
  444                  * When loading a module that is statically built into
  445                  * the kernel EEXIST percolates back up as the return
  446                  * value.  Preserve this so that apps like sysinstall
  447                  * can recognize this special case and not post bogus
  448                  * dialog boxes.
  449                  */
  450                 if (error != EEXIST)
  451                         error = ENOEXEC;
  452         } else
  453                 error = ENOENT;         /* Nothing found */
  454         return (error);
  455 }
  456 
  457 int
  458 linker_reference_module(const char *modname, struct mod_depend *verinfo,
  459     linker_file_t *result)
  460 {
  461         modlist_t mod;
  462         int error;
  463 
  464         KLD_LOCK();
  465         if ((mod = modlist_lookup2(modname, verinfo)) != NULL) {
  466                 *result = mod->container;
  467                 (*result)->refs++;
  468                 KLD_UNLOCK();
  469                 return (0);
  470         }
  471 
  472         error = linker_load_module(NULL, modname, NULL, verinfo, result);
  473         KLD_UNLOCK();
  474         return (error);
  475 }
  476 
  477 int
  478 linker_release_module(const char *modname, struct mod_depend *verinfo,
  479     linker_file_t lf)
  480 {
  481         modlist_t mod;
  482         int error;
  483 
  484         KLD_LOCK();
  485         if (lf == NULL) {
  486                 KASSERT(modname != NULL,
  487                     ("linker_release_module: no file or name"));
  488                 mod = modlist_lookup2(modname, verinfo);
  489                 if (mod == NULL) {
  490                         KLD_UNLOCK();
  491                         return (ESRCH);
  492                 }
  493                 lf = mod->container;
  494         } else
  495                 KASSERT(modname == NULL && verinfo == NULL,
  496                     ("linker_release_module: both file and name"));
  497         error = linker_file_unload(lf, LINKER_UNLOAD_NORMAL);
  498         KLD_UNLOCK();
  499         return (error);
  500 }
  501 
  502 static linker_file_t
  503 linker_find_file_by_name(const char *filename)
  504 {
  505         linker_file_t lf;
  506         char *koname;
  507 
  508         koname = malloc(strlen(filename) + 4, M_LINKER, M_WAITOK);
  509         sprintf(koname, "%s.ko", filename);
  510 
  511         KLD_LOCK_ASSERT();
  512         TAILQ_FOREACH(lf, &linker_files, link) {
  513                 if (strcmp(lf->filename, koname) == 0)
  514                         break;
  515                 if (strcmp(lf->filename, filename) == 0)
  516                         break;
  517         }
  518         free(koname, M_LINKER);
  519         return (lf);
  520 }
  521 
  522 static linker_file_t
  523 linker_find_file_by_id(int fileid)
  524 {
  525         linker_file_t lf;
  526 
  527         KLD_LOCK_ASSERT();
  528         TAILQ_FOREACH(lf, &linker_files, link)
  529                 if (lf->id == fileid && lf->flags & LINKER_FILE_LINKED)
  530                         break;
  531         return (lf);
  532 }
  533 
  534 int
  535 linker_file_foreach(linker_predicate_t *predicate, void *context)
  536 {
  537         linker_file_t lf;
  538         int retval = 0;
  539 
  540         KLD_LOCK();
  541         TAILQ_FOREACH(lf, &linker_files, link) {
  542                 retval = predicate(lf, context);
  543                 if (retval != 0)
  544                         break;
  545         }
  546         KLD_UNLOCK();
  547         return (retval);
  548 }
  549 
  550 linker_file_t
  551 linker_make_file(const char *pathname, linker_class_t lc)
  552 {
  553         linker_file_t lf;
  554         const char *filename;
  555 
  556         KLD_LOCK_ASSERT();
  557         filename = linker_basename(pathname);
  558 
  559         KLD_DPF(FILE, ("linker_make_file: new file, filename='%s' for pathname='%s'\n", filename, pathname));
  560         lf = (linker_file_t)kobj_create((kobj_class_t)lc, M_LINKER, M_WAITOK);
  561         if (lf == NULL)
  562                 return (NULL);
  563         lf->refs = 1;
  564         lf->userrefs = 0;
  565         lf->flags = 0;
  566         lf->filename = linker_strdup(filename);
  567         lf->pathname = linker_strdup(pathname);
  568         LINKER_GET_NEXT_FILE_ID(lf->id);
  569         lf->ndeps = 0;
  570         lf->deps = NULL;
  571         lf->loadcnt = ++loadcnt;
  572         lf->sdt_probes = NULL;
  573         lf->sdt_nprobes = 0;
  574         STAILQ_INIT(&lf->common);
  575         TAILQ_INIT(&lf->modules);
  576         TAILQ_INSERT_TAIL(&linker_files, lf, link);
  577         return (lf);
  578 }
  579 
  580 int
  581 linker_file_unload(linker_file_t file, int flags)
  582 {
  583         module_t mod, next;
  584         modlist_t ml, nextml;
  585         struct common_symbol *cp;
  586         int error, i;
  587 
  588         /* Refuse to unload modules if securelevel raised. */
  589         if (prison0.pr_securelevel > 0)
  590                 return (EPERM);
  591 
  592         KLD_LOCK_ASSERT();
  593         KLD_DPF(FILE, ("linker_file_unload: lf->refs=%d\n", file->refs));
  594 
  595         /* Easy case of just dropping a reference. */
  596         if (file->refs > 1) {
  597                 file->refs--;
  598                 return (0);
  599         }
  600 
  601         KLD_DPF(FILE, ("linker_file_unload: file is unloading,"
  602             " informing modules\n"));
  603 
  604         /*
  605          * Quiesce all the modules to give them a chance to veto the unload.
  606          */
  607         MOD_SLOCK;
  608         for (mod = TAILQ_FIRST(&file->modules); mod;
  609              mod = module_getfnext(mod)) {
  610 
  611                 error = module_quiesce(mod);
  612                 if (error != 0 && flags != LINKER_UNLOAD_FORCE) {
  613                         KLD_DPF(FILE, ("linker_file_unload: module %s"
  614                             " vetoed unload\n", module_getname(mod)));
  615                         /*
  616                          * XXX: Do we need to tell all the quiesced modules
  617                          * that they can resume work now via a new module
  618                          * event?
  619                          */
  620                         MOD_SUNLOCK;
  621                         return (error);
  622                 }
  623         }
  624         MOD_SUNLOCK;
  625 
  626         /*
  627          * Inform any modules associated with this file that they are
  628          * being be unloaded.
  629          */
  630         MOD_XLOCK;
  631         for (mod = TAILQ_FIRST(&file->modules); mod; mod = next) {
  632                 next = module_getfnext(mod);
  633                 MOD_XUNLOCK;
  634 
  635                 /*
  636                  * Give the module a chance to veto the unload.
  637                  */
  638                 if ((error = module_unload(mod)) != 0) {
  639                         KLD_DPF(FILE, ("linker_file_unload: module %s"
  640                             " failed unload\n", module_getname(mod)));
  641                         return (error);
  642                 }
  643                 MOD_XLOCK;
  644                 module_release(mod);
  645         }
  646         MOD_XUNLOCK;
  647 
  648         TAILQ_FOREACH_SAFE(ml, &found_modules, link, nextml) {
  649                 if (ml->container == file) {
  650                         TAILQ_REMOVE(&found_modules, ml, link);
  651                         free(ml, M_LINKER);
  652                 }
  653         }
  654 
  655         /*
  656          * Don't try to run SYSUNINITs if we are unloaded due to a
  657          * link error.
  658          */
  659         if (file->flags & LINKER_FILE_LINKED) {
  660                 file->flags &= ~LINKER_FILE_LINKED;
  661                 KLD_UNLOCK();
  662                 linker_file_sysuninit(file);
  663                 linker_file_unregister_sysctls(file);
  664                 KLD_LOCK();
  665         }
  666         TAILQ_REMOVE(&linker_files, file, link);
  667 
  668         if (file->deps) {
  669                 for (i = 0; i < file->ndeps; i++)
  670                         linker_file_unload(file->deps[i], flags);
  671                 free(file->deps, M_LINKER);
  672                 file->deps = NULL;
  673         }
  674         while ((cp = STAILQ_FIRST(&file->common)) != NULL) {
  675                 STAILQ_REMOVE_HEAD(&file->common, link);
  676                 free(cp, M_LINKER);
  677         }
  678 
  679         LINKER_UNLOAD(file);
  680         if (file->filename) {
  681                 free(file->filename, M_LINKER);
  682                 file->filename = NULL;
  683         }
  684         if (file->pathname) {
  685                 free(file->pathname, M_LINKER);
  686                 file->pathname = NULL;
  687         }
  688         kobj_delete((kobj_t) file, M_LINKER);
  689         return (0);
  690 }
  691 
  692 int
  693 linker_ctf_get(linker_file_t file, linker_ctf_t *lc)
  694 {
  695         return (LINKER_CTF_GET(file, lc));
  696 }
  697 
  698 static int
  699 linker_file_add_dependency(linker_file_t file, linker_file_t dep)
  700 {
  701         linker_file_t *newdeps;
  702 
  703         KLD_LOCK_ASSERT();
  704         newdeps = malloc((file->ndeps + 1) * sizeof(linker_file_t *),
  705             M_LINKER, M_WAITOK | M_ZERO);
  706         if (newdeps == NULL)
  707                 return (ENOMEM);
  708 
  709         if (file->deps) {
  710                 bcopy(file->deps, newdeps,
  711                     file->ndeps * sizeof(linker_file_t *));
  712                 free(file->deps, M_LINKER);
  713         }
  714         file->deps = newdeps;
  715         file->deps[file->ndeps] = dep;
  716         file->ndeps++;
  717         KLD_DPF(FILE, ("linker_file_add_dependency:"
  718             " adding %s as dependency for %s\n", 
  719             dep->filename, file->filename));
  720         return (0);
  721 }
  722 
  723 /*
  724  * Locate a linker set and its contents.  This is a helper function to avoid
  725  * linker_if.h exposure elsewhere.  Note: firstp and lastp are really void **.
  726  * This function is used in this file so we can avoid having lots of (void **)
  727  * casts.
  728  */
  729 int
  730 linker_file_lookup_set(linker_file_t file, const char *name,
  731     void *firstp, void *lastp, int *countp)
  732 {
  733         int error, locked;
  734 
  735         locked = KLD_LOCKED();
  736         if (!locked)
  737                 KLD_LOCK();
  738         error = LINKER_LOOKUP_SET(file, name, firstp, lastp, countp);
  739         if (!locked)
  740                 KLD_UNLOCK();
  741         return (error);
  742 }
  743 
  744 /*
  745  * List all functions in a file.
  746  */
  747 int
  748 linker_file_function_listall(linker_file_t lf,
  749     linker_function_nameval_callback_t callback_func, void *arg)
  750 {
  751         return (LINKER_EACH_FUNCTION_NAMEVAL(lf, callback_func, arg));
  752 }
  753 
  754 caddr_t
  755 linker_file_lookup_symbol(linker_file_t file, const char *name, int deps)
  756 {
  757         caddr_t sym;
  758         int locked;
  759 
  760         locked = KLD_LOCKED();
  761         if (!locked)
  762                 KLD_LOCK();
  763         sym = linker_file_lookup_symbol_internal(file, name, deps);
  764         if (!locked)
  765                 KLD_UNLOCK();
  766         return (sym);
  767 }
  768 
  769 static caddr_t
  770 linker_file_lookup_symbol_internal(linker_file_t file, const char *name,
  771     int deps)
  772 {
  773         c_linker_sym_t sym;
  774         linker_symval_t symval;
  775         caddr_t address;
  776         size_t common_size = 0;
  777         int i;
  778 
  779         KLD_LOCK_ASSERT();
  780         KLD_DPF(SYM, ("linker_file_lookup_symbol: file=%p, name=%s, deps=%d\n",
  781             file, name, deps));
  782 
  783         if (LINKER_LOOKUP_SYMBOL(file, name, &sym) == 0) {
  784                 LINKER_SYMBOL_VALUES(file, sym, &symval);
  785                 if (symval.value == 0)
  786                         /*
  787                          * For commons, first look them up in the
  788                          * dependencies and only allocate space if not found
  789                          * there.
  790                          */
  791                         common_size = symval.size;
  792                 else {
  793                         KLD_DPF(SYM, ("linker_file_lookup_symbol: symbol"
  794                             ".value=%p\n", symval.value));
  795                         return (symval.value);
  796                 }
  797         }
  798         if (deps) {
  799                 for (i = 0; i < file->ndeps; i++) {
  800                         address = linker_file_lookup_symbol_internal(
  801                             file->deps[i], name, 0);
  802                         if (address) {
  803                                 KLD_DPF(SYM, ("linker_file_lookup_symbol:"
  804                                     " deps value=%p\n", address));
  805                                 return (address);
  806                         }
  807                 }
  808         }
  809         if (common_size > 0) {
  810                 /*
  811                  * This is a common symbol which was not found in the
  812                  * dependencies.  We maintain a simple common symbol table in
  813                  * the file object.
  814                  */
  815                 struct common_symbol *cp;
  816 
  817                 STAILQ_FOREACH(cp, &file->common, link) {
  818                         if (strcmp(cp->name, name) == 0) {
  819                                 KLD_DPF(SYM, ("linker_file_lookup_symbol:"
  820                                     " old common value=%p\n", cp->address));
  821                                 return (cp->address);
  822                         }
  823                 }
  824                 /*
  825                  * Round the symbol size up to align.
  826                  */
  827                 common_size = (common_size + sizeof(int) - 1) & -sizeof(int);
  828                 cp = malloc(sizeof(struct common_symbol)
  829                     + common_size + strlen(name) + 1, M_LINKER,
  830                     M_WAITOK | M_ZERO);
  831                 cp->address = (caddr_t)(cp + 1);
  832                 cp->name = cp->address + common_size;
  833                 strcpy(cp->name, name);
  834                 bzero(cp->address, common_size);
  835                 STAILQ_INSERT_TAIL(&file->common, cp, link);
  836 
  837                 KLD_DPF(SYM, ("linker_file_lookup_symbol: new common"
  838                     " value=%p\n", cp->address));
  839                 return (cp->address);
  840         }
  841         KLD_DPF(SYM, ("linker_file_lookup_symbol: fail\n"));
  842         return (0);
  843 }
  844 
  845 /*
  846  * Both DDB and stack(9) rely on the kernel linker to provide forward and
  847  * backward lookup of symbols.  However, DDB and sometimes stack(9) need to
  848  * do this in a lockfree manner.  We provide a set of internal helper
  849  * routines to perform these operations without locks, and then wrappers that
  850  * optionally lock.
  851  *
  852  * linker_debug_lookup() is ifdef DDB as currently it's only used by DDB.
  853  */
  854 #ifdef DDB
  855 static int
  856 linker_debug_lookup(const char *symstr, c_linker_sym_t *sym)
  857 {
  858         linker_file_t lf;
  859 
  860         TAILQ_FOREACH(lf, &linker_files, link) {
  861                 if (LINKER_LOOKUP_SYMBOL(lf, symstr, sym) == 0)
  862                         return (0);
  863         }
  864         return (ENOENT);
  865 }
  866 #endif
  867 
  868 static int
  869 linker_debug_search_symbol(caddr_t value, c_linker_sym_t *sym, long *diffp)
  870 {
  871         linker_file_t lf;
  872         c_linker_sym_t best, es;
  873         u_long diff, bestdiff, off;
  874 
  875         best = 0;
  876         off = (uintptr_t)value;
  877         bestdiff = off;
  878         TAILQ_FOREACH(lf, &linker_files, link) {
  879                 if (LINKER_SEARCH_SYMBOL(lf, value, &es, &diff) != 0)
  880                         continue;
  881                 if (es != 0 && diff < bestdiff) {
  882                         best = es;
  883                         bestdiff = diff;
  884                 }
  885                 if (bestdiff == 0)
  886                         break;
  887         }
  888         if (best) {
  889                 *sym = best;
  890                 *diffp = bestdiff;
  891                 return (0);
  892         } else {
  893                 *sym = 0;
  894                 *diffp = off;
  895                 return (ENOENT);
  896         }
  897 }
  898 
  899 static int
  900 linker_debug_symbol_values(c_linker_sym_t sym, linker_symval_t *symval)
  901 {
  902         linker_file_t lf;
  903 
  904         TAILQ_FOREACH(lf, &linker_files, link) {
  905                 if (LINKER_SYMBOL_VALUES(lf, sym, symval) == 0)
  906                         return (0);
  907         }
  908         return (ENOENT);
  909 }
  910 
  911 static int
  912 linker_debug_search_symbol_name(caddr_t value, char *buf, u_int buflen,
  913     long *offset)
  914 {
  915         linker_symval_t symval;
  916         c_linker_sym_t sym;
  917         int error;
  918 
  919         *offset = 0;
  920         error = linker_debug_search_symbol(value, &sym, offset);
  921         if (error)
  922                 return (error);
  923         error = linker_debug_symbol_values(sym, &symval);
  924         if (error)
  925                 return (error);
  926         strlcpy(buf, symval.name, buflen);
  927         return (0);
  928 }
  929 
  930 /*
  931  * DDB Helpers.  DDB has to look across multiple files with their own symbol
  932  * tables and string tables.
  933  *
  934  * Note that we do not obey list locking protocols here.  We really don't need
  935  * DDB to hang because somebody's got the lock held.  We'll take the chance
  936  * that the files list is inconsistant instead.
  937  */
  938 #ifdef DDB
  939 int
  940 linker_ddb_lookup(const char *symstr, c_linker_sym_t *sym)
  941 {
  942 
  943         return (linker_debug_lookup(symstr, sym));
  944 }
  945 #endif
  946 
  947 int
  948 linker_ddb_search_symbol(caddr_t value, c_linker_sym_t *sym, long *diffp)
  949 {
  950 
  951         return (linker_debug_search_symbol(value, sym, diffp));
  952 }
  953 
  954 int
  955 linker_ddb_symbol_values(c_linker_sym_t sym, linker_symval_t *symval)
  956 {
  957 
  958         return (linker_debug_symbol_values(sym, symval));
  959 }
  960 
  961 int
  962 linker_ddb_search_symbol_name(caddr_t value, char *buf, u_int buflen,
  963     long *offset)
  964 {
  965 
  966         return (linker_debug_search_symbol_name(value, buf, buflen, offset));
  967 }
  968 
  969 /*
  970  * stack(9) helper for non-debugging environemnts.  Unlike DDB helpers, we do
  971  * obey locking protocols, and offer a significantly less complex interface.
  972  */
  973 int
  974 linker_search_symbol_name(caddr_t value, char *buf, u_int buflen,
  975     long *offset)
  976 {
  977         int error;
  978 
  979         KLD_LOCK();
  980         error = linker_debug_search_symbol_name(value, buf, buflen, offset);
  981         KLD_UNLOCK();
  982         return (error);
  983 }
  984 
  985 /*
  986  * Syscalls.
  987  */
  988 int
  989 kern_kldload(struct thread *td, const char *file, int *fileid)
  990 {
  991 #ifdef HWPMC_HOOKS
  992         struct pmckern_map_in pkm;
  993 #endif
  994         const char *kldname, *modname;
  995         linker_file_t lf;
  996         int error;
  997 
  998         if ((error = securelevel_gt(td->td_ucred, 0)) != 0)
  999                 return (error);
 1000 
 1001         if ((error = priv_check(td, PRIV_KLD_LOAD)) != 0)
 1002                 return (error);
 1003 
 1004         /*
 1005          * It is possible that kldloaded module will attach a new ifnet,
 1006          * so vnet context must be set when this ocurs.
 1007          */
 1008         CURVNET_SET(TD_TO_VNET(td));
 1009 
 1010         /*
 1011          * If file does not contain a qualified name or any dot in it
 1012          * (kldname.ko, or kldname.ver.ko) treat it as an interface
 1013          * name.
 1014          */
 1015         if (index(file, '/') || index(file, '.')) {
 1016                 kldname = file;
 1017                 modname = NULL;
 1018         } else {
 1019                 kldname = NULL;
 1020                 modname = file;
 1021         }
 1022 
 1023         KLD_LOCK();
 1024         error = linker_load_module(kldname, modname, NULL, NULL, &lf);
 1025         if (error) {
 1026                 KLD_UNLOCK();
 1027                 goto done;
 1028         }
 1029         lf->userrefs++;
 1030         if (fileid != NULL)
 1031                 *fileid = lf->id;
 1032 #ifdef HWPMC_HOOKS
 1033         KLD_DOWNGRADE();
 1034         pkm.pm_file = lf->filename;
 1035         pkm.pm_address = (uintptr_t) lf->address;
 1036         PMC_CALL_HOOK(td, PMC_FN_KLD_LOAD, (void *) &pkm);
 1037         KLD_UNLOCK_READ();
 1038 #else
 1039         KLD_UNLOCK();
 1040 #endif
 1041 
 1042 done:
 1043         CURVNET_RESTORE();
 1044         return (error);
 1045 }
 1046 
 1047 int
 1048 sys_kldload(struct thread *td, struct kldload_args *uap)
 1049 {
 1050         char *pathname = NULL;
 1051         int error, fileid;
 1052 
 1053         td->td_retval[0] = -1;
 1054 
 1055         pathname = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
 1056         error = copyinstr(uap->file, pathname, MAXPATHLEN, NULL);
 1057         if (error == 0) {
 1058                 error = kern_kldload(td, pathname, &fileid);
 1059                 if (error == 0)
 1060                         td->td_retval[0] = fileid;
 1061         }
 1062         free(pathname, M_TEMP);
 1063         return (error);
 1064 }
 1065 
 1066 int
 1067 kern_kldunload(struct thread *td, int fileid, int flags)
 1068 {
 1069 #ifdef HWPMC_HOOKS
 1070         struct pmckern_map_out pkm;
 1071 #endif
 1072         linker_file_t lf;
 1073         int error = 0;
 1074 
 1075         if ((error = securelevel_gt(td->td_ucred, 0)) != 0)
 1076                 return (error);
 1077 
 1078         if ((error = priv_check(td, PRIV_KLD_UNLOAD)) != 0)
 1079                 return (error);
 1080 
 1081         CURVNET_SET(TD_TO_VNET(td));
 1082         KLD_LOCK();
 1083         lf = linker_find_file_by_id(fileid);
 1084         if (lf) {
 1085                 KLD_DPF(FILE, ("kldunload: lf->userrefs=%d\n", lf->userrefs));
 1086 
 1087                 /* Check if there are DTrace probes enabled on this file. */
 1088                 if (lf->nenabled > 0) {
 1089                         printf("kldunload: attempt to unload file that has"
 1090                             " DTrace probes enabled\n");
 1091                         error = EBUSY;
 1092                 } else if (lf->userrefs == 0) {
 1093                         /*
 1094                          * XXX: maybe LINKER_UNLOAD_FORCE should override ?
 1095                          */
 1096                         printf("kldunload: attempt to unload file that was"
 1097                             " loaded by the kernel\n");
 1098                         error = EBUSY;
 1099                 } else {
 1100 #ifdef HWPMC_HOOKS
 1101                         /* Save data needed by hwpmc(4) before unloading. */
 1102                         pkm.pm_address = (uintptr_t) lf->address;
 1103                         pkm.pm_size = lf->size;
 1104 #endif
 1105                         lf->userrefs--;
 1106                         error = linker_file_unload(lf, flags);
 1107                         if (error)
 1108                                 lf->userrefs++;
 1109                 }
 1110         } else
 1111                 error = ENOENT;
 1112 
 1113 #ifdef HWPMC_HOOKS
 1114         if (error == 0) {
 1115                 KLD_DOWNGRADE();
 1116                 PMC_CALL_HOOK(td, PMC_FN_KLD_UNLOAD, (void *) &pkm);
 1117                 KLD_UNLOCK_READ();
 1118         } else
 1119                 KLD_UNLOCK();
 1120 #else
 1121         KLD_UNLOCK();
 1122 #endif
 1123         CURVNET_RESTORE();
 1124         return (error);
 1125 }
 1126 
 1127 int
 1128 sys_kldunload(struct thread *td, struct kldunload_args *uap)
 1129 {
 1130 
 1131         return (kern_kldunload(td, uap->fileid, LINKER_UNLOAD_NORMAL));
 1132 }
 1133 
 1134 int
 1135 sys_kldunloadf(struct thread *td, struct kldunloadf_args *uap)
 1136 {
 1137 
 1138         if (uap->flags != LINKER_UNLOAD_NORMAL &&
 1139             uap->flags != LINKER_UNLOAD_FORCE)
 1140                 return (EINVAL);
 1141         return (kern_kldunload(td, uap->fileid, uap->flags));
 1142 }
 1143 
 1144 int
 1145 sys_kldfind(struct thread *td, struct kldfind_args *uap)
 1146 {
 1147         char *pathname;
 1148         const char *filename;
 1149         linker_file_t lf;
 1150         int error;
 1151 
 1152 #ifdef MAC
 1153         error = mac_kld_check_stat(td->td_ucred);
 1154         if (error)
 1155                 return (error);
 1156 #endif
 1157 
 1158         td->td_retval[0] = -1;
 1159 
 1160         pathname = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
 1161         if ((error = copyinstr(uap->file, pathname, MAXPATHLEN, NULL)) != 0)
 1162                 goto out;
 1163 
 1164         filename = linker_basename(pathname);
 1165         KLD_LOCK();
 1166         lf = linker_find_file_by_name(filename);
 1167         if (lf)
 1168                 td->td_retval[0] = lf->id;
 1169         else
 1170                 error = ENOENT;
 1171         KLD_UNLOCK();
 1172 out:
 1173         free(pathname, M_TEMP);
 1174         return (error);
 1175 }
 1176 
 1177 int
 1178 sys_kldnext(struct thread *td, struct kldnext_args *uap)
 1179 {
 1180         linker_file_t lf;
 1181         int error = 0;
 1182 
 1183 #ifdef MAC
 1184         error = mac_kld_check_stat(td->td_ucred);
 1185         if (error)
 1186                 return (error);
 1187 #endif
 1188 
 1189         KLD_LOCK();
 1190         if (uap->fileid == 0)
 1191                 lf = TAILQ_FIRST(&linker_files);
 1192         else {
 1193                 lf = linker_find_file_by_id(uap->fileid);
 1194                 if (lf == NULL) {
 1195                         error = ENOENT;
 1196                         goto out;
 1197                 }
 1198                 lf = TAILQ_NEXT(lf, link);
 1199         }
 1200 
 1201         /* Skip partially loaded files. */
 1202         while (lf != NULL && !(lf->flags & LINKER_FILE_LINKED))
 1203                 lf = TAILQ_NEXT(lf, link);
 1204 
 1205         if (lf)
 1206                 td->td_retval[0] = lf->id;
 1207         else
 1208                 td->td_retval[0] = 0;
 1209 out:
 1210         KLD_UNLOCK();
 1211         return (error);
 1212 }
 1213 
 1214 int
 1215 sys_kldstat(struct thread *td, struct kldstat_args *uap)
 1216 {
 1217         struct kld_file_stat stat;
 1218         int error, version;
 1219 
 1220         /*
 1221          * Check the version of the user's structure.
 1222          */
 1223         if ((error = copyin(&uap->stat->version, &version, sizeof(version)))
 1224             != 0)
 1225                 return (error);
 1226         if (version != sizeof(struct kld_file_stat_1) &&
 1227             version != sizeof(struct kld_file_stat))
 1228                 return (EINVAL);
 1229 
 1230         error = kern_kldstat(td, uap->fileid, &stat);
 1231         if (error != 0)
 1232                 return (error);
 1233         return (copyout(&stat, uap->stat, version));
 1234 }
 1235 
 1236 int
 1237 kern_kldstat(struct thread *td, int fileid, struct kld_file_stat *stat)
 1238 {
 1239         linker_file_t lf;
 1240         int namelen;
 1241 #ifdef MAC
 1242         int error;
 1243 
 1244         error = mac_kld_check_stat(td->td_ucred);
 1245         if (error)
 1246                 return (error);
 1247 #endif
 1248 
 1249         KLD_LOCK();
 1250         lf = linker_find_file_by_id(fileid);
 1251         if (lf == NULL) {
 1252                 KLD_UNLOCK();
 1253                 return (ENOENT);
 1254         }
 1255 
 1256         /* Version 1 fields: */
 1257         namelen = strlen(lf->filename) + 1;
 1258         if (namelen > MAXPATHLEN)
 1259                 namelen = MAXPATHLEN;
 1260         bcopy(lf->filename, &stat->name[0], namelen);
 1261         stat->refs = lf->refs;
 1262         stat->id = lf->id;
 1263         stat->address = lf->address;
 1264         stat->size = lf->size;
 1265         /* Version 2 fields: */
 1266         namelen = strlen(lf->pathname) + 1;
 1267         if (namelen > MAXPATHLEN)
 1268                 namelen = MAXPATHLEN;
 1269         bcopy(lf->pathname, &stat->pathname[0], namelen);
 1270         KLD_UNLOCK();
 1271 
 1272         td->td_retval[0] = 0;
 1273         return (0);
 1274 }
 1275 
 1276 int
 1277 sys_kldfirstmod(struct thread *td, struct kldfirstmod_args *uap)
 1278 {
 1279         linker_file_t lf;
 1280         module_t mp;
 1281         int error = 0;
 1282 
 1283 #ifdef MAC
 1284         error = mac_kld_check_stat(td->td_ucred);
 1285         if (error)
 1286                 return (error);
 1287 #endif
 1288 
 1289         KLD_LOCK();
 1290         lf = linker_find_file_by_id(uap->fileid);
 1291         if (lf) {
 1292                 MOD_SLOCK;
 1293                 mp = TAILQ_FIRST(&lf->modules);
 1294                 if (mp != NULL)
 1295                         td->td_retval[0] = module_getid(mp);
 1296                 else
 1297                         td->td_retval[0] = 0;
 1298                 MOD_SUNLOCK;
 1299         } else
 1300                 error = ENOENT;
 1301         KLD_UNLOCK();
 1302         return (error);
 1303 }
 1304 
 1305 int
 1306 sys_kldsym(struct thread *td, struct kldsym_args *uap)
 1307 {
 1308         char *symstr = NULL;
 1309         c_linker_sym_t sym;
 1310         linker_symval_t symval;
 1311         linker_file_t lf;
 1312         struct kld_sym_lookup lookup;
 1313         int error = 0;
 1314 
 1315 #ifdef MAC
 1316         error = mac_kld_check_stat(td->td_ucred);
 1317         if (error)
 1318                 return (error);
 1319 #endif
 1320 
 1321         if ((error = copyin(uap->data, &lookup, sizeof(lookup))) != 0)
 1322                 return (error);
 1323         if (lookup.version != sizeof(lookup) ||
 1324             uap->cmd != KLDSYM_LOOKUP)
 1325                 return (EINVAL);
 1326         symstr = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
 1327         if ((error = copyinstr(lookup.symname, symstr, MAXPATHLEN, NULL)) != 0)
 1328                 goto out;
 1329         KLD_LOCK();
 1330         if (uap->fileid != 0) {
 1331                 lf = linker_find_file_by_id(uap->fileid);
 1332                 if (lf == NULL)
 1333                         error = ENOENT;
 1334                 else if (LINKER_LOOKUP_SYMBOL(lf, symstr, &sym) == 0 &&
 1335                     LINKER_SYMBOL_VALUES(lf, sym, &symval) == 0) {
 1336                         lookup.symvalue = (uintptr_t) symval.value;
 1337                         lookup.symsize = symval.size;
 1338                         error = copyout(&lookup, uap->data, sizeof(lookup));
 1339                 } else
 1340                         error = ENOENT;
 1341         } else {
 1342                 TAILQ_FOREACH(lf, &linker_files, link) {
 1343                         if (LINKER_LOOKUP_SYMBOL(lf, symstr, &sym) == 0 &&
 1344                             LINKER_SYMBOL_VALUES(lf, sym, &symval) == 0) {
 1345                                 lookup.symvalue = (uintptr_t)symval.value;
 1346                                 lookup.symsize = symval.size;
 1347                                 error = copyout(&lookup, uap->data,
 1348                                     sizeof(lookup));
 1349                                 break;
 1350                         }
 1351                 }
 1352                 if (lf == NULL)
 1353                         error = ENOENT;
 1354         }
 1355         KLD_UNLOCK();
 1356 out:
 1357         free(symstr, M_TEMP);
 1358         return (error);
 1359 }
 1360 
 1361 /*
 1362  * Preloaded module support
 1363  */
 1364 
 1365 static modlist_t
 1366 modlist_lookup(const char *name, int ver)
 1367 {
 1368         modlist_t mod;
 1369 
 1370         TAILQ_FOREACH(mod, &found_modules, link) {
 1371                 if (strcmp(mod->name, name) == 0 &&
 1372                     (ver == 0 || mod->version == ver))
 1373                         return (mod);
 1374         }
 1375         return (NULL);
 1376 }
 1377 
 1378 static modlist_t
 1379 modlist_lookup2(const char *name, struct mod_depend *verinfo)
 1380 {
 1381         modlist_t mod, bestmod;
 1382         int ver;
 1383 
 1384         if (verinfo == NULL)
 1385                 return (modlist_lookup(name, 0));
 1386         bestmod = NULL;
 1387         TAILQ_FOREACH(mod, &found_modules, link) {
 1388                 if (strcmp(mod->name, name) != 0)
 1389                         continue;
 1390                 ver = mod->version;
 1391                 if (ver == verinfo->md_ver_preferred)
 1392                         return (mod);
 1393                 if (ver >= verinfo->md_ver_minimum &&
 1394                     ver <= verinfo->md_ver_maximum &&
 1395                     (bestmod == NULL || ver > bestmod->version))
 1396                         bestmod = mod;
 1397         }
 1398         return (bestmod);
 1399 }
 1400 
 1401 static modlist_t
 1402 modlist_newmodule(const char *modname, int version, linker_file_t container)
 1403 {
 1404         modlist_t mod;
 1405 
 1406         mod = malloc(sizeof(struct modlist), M_LINKER, M_NOWAIT | M_ZERO);
 1407         if (mod == NULL)
 1408                 panic("no memory for module list");
 1409         mod->container = container;
 1410         mod->name = modname;
 1411         mod->version = version;
 1412         TAILQ_INSERT_TAIL(&found_modules, mod, link);
 1413         return (mod);
 1414 }
 1415 
 1416 static void
 1417 linker_addmodules(linker_file_t lf, struct mod_metadata **start,
 1418     struct mod_metadata **stop, int preload)
 1419 {
 1420         struct mod_metadata *mp, **mdp;
 1421         const char *modname;
 1422         int ver;
 1423 
 1424         for (mdp = start; mdp < stop; mdp++) {
 1425                 mp = *mdp;
 1426                 if (mp->md_type != MDT_VERSION)
 1427                         continue;
 1428                 modname = mp->md_cval;
 1429                 ver = ((struct mod_version *)mp->md_data)->mv_version;
 1430                 if (modlist_lookup(modname, ver) != NULL) {
 1431                         printf("module %s already present!\n", modname);
 1432                         /* XXX what can we do? this is a build error. :-( */
 1433                         continue;
 1434                 }
 1435                 modlist_newmodule(modname, ver, lf);
 1436         }
 1437 }
 1438 
 1439 static void
 1440 linker_preload(void *arg)
 1441 {
 1442         caddr_t modptr;
 1443         const char *modname, *nmodname;
 1444         char *modtype;
 1445         linker_file_t lf, nlf;
 1446         linker_class_t lc;
 1447         int error;
 1448         linker_file_list_t loaded_files;
 1449         linker_file_list_t depended_files;
 1450         struct mod_metadata *mp, *nmp;
 1451         struct mod_metadata **start, **stop, **mdp, **nmdp;
 1452         struct mod_depend *verinfo;
 1453         int nver;
 1454         int resolves;
 1455         modlist_t mod;
 1456         struct sysinit **si_start, **si_stop;
 1457 
 1458         TAILQ_INIT(&loaded_files);
 1459         TAILQ_INIT(&depended_files);
 1460         TAILQ_INIT(&found_modules);
 1461         error = 0;
 1462 
 1463         modptr = NULL;
 1464         while ((modptr = preload_search_next_name(modptr)) != NULL) {
 1465                 modname = (char *)preload_search_info(modptr, MODINFO_NAME);
 1466                 modtype = (char *)preload_search_info(modptr, MODINFO_TYPE);
 1467                 if (modname == NULL) {
 1468                         printf("Preloaded module at %p does not have a"
 1469                             " name!\n", modptr);
 1470                         continue;
 1471                 }
 1472                 if (modtype == NULL) {
 1473                         printf("Preloaded module at %p does not have a type!\n",
 1474                             modptr);
 1475                         continue;
 1476                 }
 1477                 if (bootverbose)
 1478                         printf("Preloaded %s \"%s\" at %p.\n", modtype, modname,
 1479                             modptr);
 1480                 lf = NULL;
 1481                 TAILQ_FOREACH(lc, &classes, link) {
 1482                         error = LINKER_LINK_PRELOAD(lc, modname, &lf);
 1483                         if (!error)
 1484                                 break;
 1485                         lf = NULL;
 1486                 }
 1487                 if (lf)
 1488                         TAILQ_INSERT_TAIL(&loaded_files, lf, loaded);
 1489         }
 1490 
 1491         /*
 1492          * First get a list of stuff in the kernel.
 1493          */
 1494         if (linker_file_lookup_set(linker_kernel_file, MDT_SETNAME, &start,
 1495             &stop, NULL) == 0)
 1496                 linker_addmodules(linker_kernel_file, start, stop, 1);
 1497 
 1498         /*
 1499          * This is a once-off kinky bubble sort to resolve relocation
 1500          * dependency requirements.
 1501          */
 1502 restart:
 1503         TAILQ_FOREACH(lf, &loaded_files, loaded) {
 1504                 error = linker_file_lookup_set(lf, MDT_SETNAME, &start,
 1505                     &stop, NULL);
 1506                 /*
 1507                  * First, look to see if we would successfully link with this
 1508                  * stuff.
 1509                  */
 1510                 resolves = 1;   /* unless we know otherwise */
 1511                 if (!error) {
 1512                         for (mdp = start; mdp < stop; mdp++) {
 1513                                 mp = *mdp;
 1514                                 if (mp->md_type != MDT_DEPEND)
 1515                                         continue;
 1516                                 modname = mp->md_cval;
 1517                                 verinfo = mp->md_data;
 1518                                 for (nmdp = start; nmdp < stop; nmdp++) {
 1519                                         nmp = *nmdp;
 1520                                         if (nmp->md_type != MDT_VERSION)
 1521                                                 continue;
 1522                                         nmodname = nmp->md_cval;
 1523                                         if (strcmp(modname, nmodname) == 0)
 1524                                                 break;
 1525                                 }
 1526                                 if (nmdp < stop)   /* it's a self reference */
 1527                                         continue;
 1528 
 1529                                 /*
 1530                                  * ok, the module isn't here yet, we
 1531                                  * are not finished
 1532                                  */
 1533                                 if (modlist_lookup2(modname, verinfo) == NULL)
 1534                                         resolves = 0;
 1535                         }
 1536                 }
 1537                 /*
 1538                  * OK, if we found our modules, we can link.  So, "provide"
 1539                  * the modules inside and add it to the end of the link order
 1540                  * list.
 1541                  */
 1542                 if (resolves) {
 1543                         if (!error) {
 1544                                 for (mdp = start; mdp < stop; mdp++) {
 1545                                         mp = *mdp;
 1546                                         if (mp->md_type != MDT_VERSION)
 1547                                                 continue;
 1548                                         modname = mp->md_cval;
 1549                                         nver = ((struct mod_version *)
 1550                                             mp->md_data)->mv_version;
 1551                                         if (modlist_lookup(modname,
 1552                                             nver) != NULL) {
 1553                                                 printf("module %s already"
 1554                                                     " present!\n", modname);
 1555                                                 TAILQ_REMOVE(&loaded_files,
 1556                                                     lf, loaded);
 1557                                                 linker_file_unload(lf,
 1558                                                     LINKER_UNLOAD_FORCE);
 1559                                                 /* we changed tailq next ptr */
 1560                                                 goto restart;
 1561                                         }
 1562                                         modlist_newmodule(modname, nver, lf);
 1563                                 }
 1564                         }
 1565                         TAILQ_REMOVE(&loaded_files, lf, loaded);
 1566                         TAILQ_INSERT_TAIL(&depended_files, lf, loaded);
 1567                         /*
 1568                          * Since we provided modules, we need to restart the
 1569                          * sort so that the previous files that depend on us
 1570                          * have a chance. Also, we've busted the tailq next
 1571                          * pointer with the REMOVE.
 1572                          */
 1573                         goto restart;
 1574                 }
 1575         }
 1576 
 1577         /*
 1578          * At this point, we check to see what could not be resolved..
 1579          */
 1580         while ((lf = TAILQ_FIRST(&loaded_files)) != NULL) {
 1581                 TAILQ_REMOVE(&loaded_files, lf, loaded);
 1582                 printf("KLD file %s is missing dependencies\n", lf->filename);
 1583                 linker_file_unload(lf, LINKER_UNLOAD_FORCE);
 1584         }
 1585 
 1586         /*
 1587          * We made it. Finish off the linking in the order we determined.
 1588          */
 1589         TAILQ_FOREACH_SAFE(lf, &depended_files, loaded, nlf) {
 1590                 if (linker_kernel_file) {
 1591                         linker_kernel_file->refs++;
 1592                         error = linker_file_add_dependency(lf,
 1593                             linker_kernel_file);
 1594                         if (error)
 1595                                 panic("cannot add dependency");
 1596                 }
 1597                 lf->userrefs++; /* so we can (try to) kldunload it */
 1598                 error = linker_file_lookup_set(lf, MDT_SETNAME, &start,
 1599                     &stop, NULL);
 1600                 if (!error) {
 1601                         for (mdp = start; mdp < stop; mdp++) {
 1602                                 mp = *mdp;
 1603                                 if (mp->md_type != MDT_DEPEND)
 1604                                         continue;
 1605                                 modname = mp->md_cval;
 1606                                 verinfo = mp->md_data;
 1607                                 mod = modlist_lookup2(modname, verinfo);
 1608                                 if (mod == NULL) {
 1609                                         printf("KLD file %s - cannot find "
 1610                                             "dependency \"%s\"\n",
 1611                                             lf->filename, modname);
 1612                                         goto fail;
 1613                                 }
 1614                                 /* Don't count self-dependencies */
 1615                                 if (lf == mod->container)
 1616                                         continue;
 1617                                 mod->container->refs++;
 1618                                 error = linker_file_add_dependency(lf,
 1619                                     mod->container);
 1620                                 if (error)
 1621                                         panic("cannot add dependency");
 1622                         }
 1623                 }
 1624                 /*
 1625                  * Now do relocation etc using the symbol search paths
 1626                  * established by the dependencies
 1627                  */
 1628                 error = LINKER_LINK_PRELOAD_FINISH(lf);
 1629                 if (error) {
 1630                         printf("KLD file %s - could not finalize loading\n",
 1631                             lf->filename);
 1632                         goto fail;
 1633                 }
 1634                 linker_file_register_modules(lf);
 1635                 if (linker_file_lookup_set(lf, "sysinit_set", &si_start,
 1636                     &si_stop, NULL) == 0)
 1637                         sysinit_add(si_start, si_stop);
 1638                 linker_file_register_sysctls(lf);
 1639                 lf->flags |= LINKER_FILE_LINKED;
 1640                 continue;
 1641 fail:
 1642                 TAILQ_REMOVE(&depended_files, lf, loaded);
 1643                 linker_file_unload(lf, LINKER_UNLOAD_FORCE);
 1644         }
 1645         /* woohoo! we made it! */
 1646 }
 1647 
 1648 SYSINIT(preload, SI_SUB_KLD, SI_ORDER_MIDDLE, linker_preload, 0);
 1649 
 1650 /*
 1651  * Search for a not-loaded module by name.
 1652  *
 1653  * Modules may be found in the following locations:
 1654  *
 1655  * - preloaded (result is just the module name) - on disk (result is full path
 1656  * to module)
 1657  *
 1658  * If the module name is qualified in any way (contains path, etc.) the we
 1659  * simply return a copy of it.
 1660  *
 1661  * The search path can be manipulated via sysctl.  Note that we use the ';'
 1662  * character as a separator to be consistent with the bootloader.
 1663  */
 1664 
 1665 static char linker_hintfile[] = "linker.hints";
 1666 static char linker_path[MAXPATHLEN] = "/boot/kernel;/boot/modules";
 1667 
 1668 SYSCTL_STRING(_kern, OID_AUTO, module_path, CTLFLAG_RW, linker_path,
 1669     sizeof(linker_path), "module load search path");
 1670 
 1671 TUNABLE_STR("module_path", linker_path, sizeof(linker_path));
 1672 
 1673 static char *linker_ext_list[] = {
 1674         "",
 1675         ".ko",
 1676         NULL
 1677 };
 1678 
 1679 /*
 1680  * Check if file actually exists either with or without extension listed in
 1681  * the linker_ext_list. (probably should be generic for the rest of the
 1682  * kernel)
 1683  */
 1684 static char *
 1685 linker_lookup_file(const char *path, int pathlen, const char *name,
 1686     int namelen, struct vattr *vap)
 1687 {
 1688         struct nameidata nd;
 1689         struct thread *td = curthread;  /* XXX */
 1690         char *result, **cpp, *sep;
 1691         int error, len, extlen, reclen, flags, vfslocked;
 1692         enum vtype type;
 1693 
 1694         extlen = 0;
 1695         for (cpp = linker_ext_list; *cpp; cpp++) {
 1696                 len = strlen(*cpp);
 1697                 if (len > extlen)
 1698                         extlen = len;
 1699         }
 1700         extlen++;               /* trailing '\0' */
 1701         sep = (path[pathlen - 1] != '/') ? "/" : "";
 1702 
 1703         reclen = pathlen + strlen(sep) + namelen + extlen + 1;
 1704         result = malloc(reclen, M_LINKER, M_WAITOK);
 1705         for (cpp = linker_ext_list; *cpp; cpp++) {
 1706                 snprintf(result, reclen, "%.*s%s%.*s%s", pathlen, path, sep,
 1707                     namelen, name, *cpp);
 1708                 /*
 1709                  * Attempt to open the file, and return the path if
 1710                  * we succeed and it's a regular file.
 1711                  */
 1712                 NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, result, td);
 1713                 flags = FREAD;
 1714                 error = vn_open(&nd, &flags, 0, NULL);
 1715                 if (error == 0) {
 1716                         vfslocked = NDHASGIANT(&nd);
 1717                         NDFREE(&nd, NDF_ONLY_PNBUF);
 1718                         type = nd.ni_vp->v_type;
 1719                         if (vap)
 1720                                 VOP_GETATTR(nd.ni_vp, vap, td->td_ucred);
 1721                         VOP_UNLOCK(nd.ni_vp, 0);
 1722                         vn_close(nd.ni_vp, FREAD, td->td_ucred, td);
 1723                         VFS_UNLOCK_GIANT(vfslocked);
 1724                         if (type == VREG)
 1725                                 return (result);
 1726                 }
 1727         }
 1728         free(result, M_LINKER);
 1729         return (NULL);
 1730 }
 1731 
 1732 #define INT_ALIGN(base, ptr)    ptr =                                   \
 1733         (base) + (((ptr) - (base) + sizeof(int) - 1) & ~(sizeof(int) - 1))
 1734 
 1735 /*
 1736  * Lookup KLD which contains requested module in the "linker.hints" file. If
 1737  * version specification is available, then try to find the best KLD.
 1738  * Otherwise just find the latest one.
 1739  */
 1740 static char *
 1741 linker_hints_lookup(const char *path, int pathlen, const char *modname,
 1742     int modnamelen, struct mod_depend *verinfo)
 1743 {
 1744         struct thread *td = curthread;  /* XXX */
 1745         struct ucred *cred = td ? td->td_ucred : NULL;
 1746         struct nameidata nd;
 1747         struct vattr vattr, mattr;
 1748         u_char *hints = NULL;
 1749         u_char *cp, *recptr, *bufend, *result, *best, *pathbuf, *sep;
 1750         int error, ival, bestver, *intp, reclen, found, flags, clen, blen;
 1751         int vfslocked = 0;
 1752 
 1753         result = NULL;
 1754         bestver = found = 0;
 1755 
 1756         sep = (path[pathlen - 1] != '/') ? "/" : "";
 1757         reclen = imax(modnamelen, strlen(linker_hintfile)) + pathlen +
 1758             strlen(sep) + 1;
 1759         pathbuf = malloc(reclen, M_LINKER, M_WAITOK);
 1760         snprintf(pathbuf, reclen, "%.*s%s%s", pathlen, path, sep,
 1761             linker_hintfile);
 1762 
 1763         NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, pathbuf, td);
 1764         flags = FREAD;
 1765         error = vn_open(&nd, &flags, 0, NULL);
 1766         if (error)
 1767                 goto bad;
 1768         vfslocked = NDHASGIANT(&nd);
 1769         NDFREE(&nd, NDF_ONLY_PNBUF);
 1770         if (nd.ni_vp->v_type != VREG)
 1771                 goto bad;
 1772         best = cp = NULL;
 1773         error = VOP_GETATTR(nd.ni_vp, &vattr, cred);
 1774         if (error)
 1775                 goto bad;
 1776         /*
 1777          * XXX: we need to limit this number to some reasonable value
 1778          */
 1779         if (vattr.va_size > 100 * 1024) {
 1780                 printf("hints file too large %ld\n", (long)vattr.va_size);
 1781                 goto bad;
 1782         }
 1783         hints = malloc(vattr.va_size, M_TEMP, M_WAITOK);
 1784         if (hints == NULL)
 1785                 goto bad;
 1786         error = vn_rdwr(UIO_READ, nd.ni_vp, (caddr_t)hints, vattr.va_size, 0,
 1787             UIO_SYSSPACE, IO_NODELOCKED, cred, NOCRED, &reclen, td);
 1788         if (error)
 1789                 goto bad;
 1790         VOP_UNLOCK(nd.ni_vp, 0);
 1791         vn_close(nd.ni_vp, FREAD, cred, td);
 1792         VFS_UNLOCK_GIANT(vfslocked);
 1793         nd.ni_vp = NULL;
 1794         if (reclen != 0) {
 1795                 printf("can't read %d\n", reclen);
 1796                 goto bad;
 1797         }
 1798         intp = (int *)hints;
 1799         ival = *intp++;
 1800         if (ival != LINKER_HINTS_VERSION) {
 1801                 printf("hints file version mismatch %d\n", ival);
 1802                 goto bad;
 1803         }
 1804         bufend = hints + vattr.va_size;
 1805         recptr = (u_char *)intp;
 1806         clen = blen = 0;
 1807         while (recptr < bufend && !found) {
 1808                 intp = (int *)recptr;
 1809                 reclen = *intp++;
 1810                 ival = *intp++;
 1811                 cp = (char *)intp;
 1812                 switch (ival) {
 1813                 case MDT_VERSION:
 1814                         clen = *cp++;
 1815                         if (clen != modnamelen || bcmp(cp, modname, clen) != 0)
 1816                                 break;
 1817                         cp += clen;
 1818                         INT_ALIGN(hints, cp);
 1819                         ival = *(int *)cp;
 1820                         cp += sizeof(int);
 1821                         clen = *cp++;
 1822                         if (verinfo == NULL ||
 1823                             ival == verinfo->md_ver_preferred) {
 1824                                 found = 1;
 1825                                 break;
 1826                         }
 1827                         if (ival >= verinfo->md_ver_minimum &&
 1828                             ival <= verinfo->md_ver_maximum &&
 1829                             ival > bestver) {
 1830                                 bestver = ival;
 1831                                 best = cp;
 1832                                 blen = clen;
 1833                         }
 1834                         break;
 1835                 default:
 1836                         break;
 1837                 }
 1838                 recptr += reclen + sizeof(int);
 1839         }
 1840         /*
 1841          * Finally check if KLD is in the place
 1842          */
 1843         if (found)
 1844                 result = linker_lookup_file(path, pathlen, cp, clen, &mattr);
 1845         else if (best)
 1846                 result = linker_lookup_file(path, pathlen, best, blen, &mattr);
 1847 
 1848         /*
 1849          * KLD is newer than hints file. What we should do now?
 1850          */
 1851         if (result && timespeccmp(&mattr.va_mtime, &vattr.va_mtime, >))
 1852                 printf("warning: KLD '%s' is newer than the linker.hints"
 1853                     " file\n", result);
 1854 bad:
 1855         free(pathbuf, M_LINKER);
 1856         if (hints)
 1857                 free(hints, M_TEMP);
 1858         if (nd.ni_vp != NULL) {
 1859                 VOP_UNLOCK(nd.ni_vp, 0);
 1860                 vn_close(nd.ni_vp, FREAD, cred, td);
 1861                 VFS_UNLOCK_GIANT(vfslocked);
 1862         }
 1863         /*
 1864          * If nothing found or hints is absent - fallback to the old
 1865          * way by using "kldname[.ko]" as module name.
 1866          */
 1867         if (!found && !bestver && result == NULL)
 1868                 result = linker_lookup_file(path, pathlen, modname,
 1869                     modnamelen, NULL);
 1870         return (result);
 1871 }
 1872 
 1873 /*
 1874  * Lookup KLD which contains requested module in the all directories.
 1875  */
 1876 static char *
 1877 linker_search_module(const char *modname, int modnamelen,
 1878     struct mod_depend *verinfo)
 1879 {
 1880         char *cp, *ep, *result;
 1881 
 1882         /*
 1883          * traverse the linker path
 1884          */
 1885         for (cp = linker_path; *cp; cp = ep + 1) {
 1886                 /* find the end of this component */
 1887                 for (ep = cp; (*ep != 0) && (*ep != ';'); ep++);
 1888                 result = linker_hints_lookup(cp, ep - cp, modname,
 1889                     modnamelen, verinfo);
 1890                 if (result != NULL)
 1891                         return (result);
 1892                 if (*ep == 0)
 1893                         break;
 1894         }
 1895         return (NULL);
 1896 }
 1897 
 1898 /*
 1899  * Search for module in all directories listed in the linker_path.
 1900  */
 1901 static char *
 1902 linker_search_kld(const char *name)
 1903 {
 1904         char *cp, *ep, *result;
 1905         int len;
 1906 
 1907         /* qualified at all? */
 1908         if (index(name, '/'))
 1909                 return (linker_strdup(name));
 1910 
 1911         /* traverse the linker path */
 1912         len = strlen(name);
 1913         for (ep = linker_path; *ep; ep++) {
 1914                 cp = ep;
 1915                 /* find the end of this component */
 1916                 for (; *ep != 0 && *ep != ';'; ep++);
 1917                 result = linker_lookup_file(cp, ep - cp, name, len, NULL);
 1918                 if (result != NULL)
 1919                         return (result);
 1920         }
 1921         return (NULL);
 1922 }
 1923 
 1924 static const char *
 1925 linker_basename(const char *path)
 1926 {
 1927         const char *filename;
 1928 
 1929         filename = rindex(path, '/');
 1930         if (filename == NULL)
 1931                 return path;
 1932         if (filename[1])
 1933                 filename++;
 1934         return (filename);
 1935 }
 1936 
 1937 #ifdef HWPMC_HOOKS
 1938 /*
 1939  * Inform hwpmc about the set of kernel modules currently loaded.
 1940  */
 1941 void *
 1942 linker_hwpmc_list_objects(void)
 1943 {
 1944         linker_file_t lf;
 1945         struct pmckern_map_in *kobase;
 1946         int i, nmappings;
 1947 
 1948         nmappings = 0;
 1949         KLD_LOCK_READ();
 1950         TAILQ_FOREACH(lf, &linker_files, link)
 1951                 nmappings++;
 1952 
 1953         /* Allocate nmappings + 1 entries. */
 1954         kobase = malloc((nmappings + 1) * sizeof(struct pmckern_map_in),
 1955             M_LINKER, M_WAITOK | M_ZERO);
 1956         i = 0;
 1957         TAILQ_FOREACH(lf, &linker_files, link) {
 1958 
 1959                 /* Save the info for this linker file. */
 1960                 kobase[i].pm_file = lf->filename;
 1961                 kobase[i].pm_address = (uintptr_t)lf->address;
 1962                 i++;
 1963         }
 1964         KLD_UNLOCK_READ();
 1965 
 1966         KASSERT(i > 0, ("linker_hpwmc_list_objects: no kernel objects?"));
 1967 
 1968         /* The last entry of the malloced area comprises of all zeros. */
 1969         KASSERT(kobase[i].pm_file == NULL,
 1970             ("linker_hwpmc_list_objects: last object not NULL"));
 1971 
 1972         return ((void *)kobase);
 1973 }
 1974 #endif
 1975 
 1976 /*
 1977  * Find a file which contains given module and load it, if "parent" is not
 1978  * NULL, register a reference to it.
 1979  */
 1980 static int
 1981 linker_load_module(const char *kldname, const char *modname,
 1982     struct linker_file *parent, struct mod_depend *verinfo,
 1983     struct linker_file **lfpp)
 1984 {
 1985         linker_file_t lfdep;
 1986         const char *filename;
 1987         char *pathname;
 1988         int error;
 1989 
 1990         KLD_LOCK_ASSERT();
 1991         if (modname == NULL) {
 1992                 /*
 1993                  * We have to load KLD
 1994                  */
 1995                 KASSERT(verinfo == NULL, ("linker_load_module: verinfo"
 1996                     " is not NULL"));
 1997                 pathname = linker_search_kld(kldname);
 1998         } else {
 1999                 if (modlist_lookup2(modname, verinfo) != NULL)
 2000                         return (EEXIST);
 2001                 if (kldname != NULL)
 2002                         pathname = linker_strdup(kldname);
 2003                 else if (rootvnode == NULL)
 2004                         pathname = NULL;
 2005                 else
 2006                         /*
 2007                          * Need to find a KLD with required module
 2008                          */
 2009                         pathname = linker_search_module(modname,
 2010                             strlen(modname), verinfo);
 2011         }
 2012         if (pathname == NULL)
 2013                 return (ENOENT);
 2014 
 2015         /*
 2016          * Can't load more than one file with the same basename XXX:
 2017          * Actually it should be possible to have multiple KLDs with
 2018          * the same basename but different path because they can
 2019          * provide different versions of the same modules.
 2020          */
 2021         filename = linker_basename(pathname);
 2022         if (linker_find_file_by_name(filename))
 2023                 error = EEXIST;
 2024         else do {
 2025                 error = linker_load_file(pathname, &lfdep);
 2026                 if (error)
 2027                         break;
 2028                 if (modname && verinfo &&
 2029                     modlist_lookup2(modname, verinfo) == NULL) {
 2030                         linker_file_unload(lfdep, LINKER_UNLOAD_FORCE);
 2031                         error = ENOENT;
 2032                         break;
 2033                 }
 2034                 if (parent) {
 2035                         error = linker_file_add_dependency(parent, lfdep);
 2036                         if (error)
 2037                                 break;
 2038                 }
 2039                 if (lfpp)
 2040                         *lfpp = lfdep;
 2041         } while (0);
 2042         free(pathname, M_LINKER);
 2043         return (error);
 2044 }
 2045 
 2046 /*
 2047  * This routine is responsible for finding dependencies of userland initiated
 2048  * kldload(2)'s of files.
 2049  */
 2050 int
 2051 linker_load_dependencies(linker_file_t lf)
 2052 {
 2053         linker_file_t lfdep;
 2054         struct mod_metadata **start, **stop, **mdp, **nmdp;
 2055         struct mod_metadata *mp, *nmp;
 2056         struct mod_depend *verinfo;
 2057         modlist_t mod;
 2058         const char *modname, *nmodname;
 2059         int ver, error = 0, count;
 2060 
 2061         /*
 2062          * All files are dependant on /kernel.
 2063          */
 2064         KLD_LOCK_ASSERT();
 2065         if (linker_kernel_file) {
 2066                 linker_kernel_file->refs++;
 2067                 error = linker_file_add_dependency(lf, linker_kernel_file);
 2068                 if (error)
 2069                         return (error);
 2070         }
 2071         if (linker_file_lookup_set(lf, MDT_SETNAME, &start, &stop,
 2072             &count) != 0)
 2073                 return (0);
 2074         for (mdp = start; mdp < stop; mdp++) {
 2075                 mp = *mdp;
 2076                 if (mp->md_type != MDT_VERSION)
 2077                         continue;
 2078                 modname = mp->md_cval;
 2079                 ver = ((struct mod_version *)mp->md_data)->mv_version;
 2080                 mod = modlist_lookup(modname, ver);
 2081                 if (mod != NULL) {
 2082                         printf("interface %s.%d already present in the KLD"
 2083                             " '%s'!\n", modname, ver,
 2084                             mod->container->filename);
 2085                         return (EEXIST);
 2086                 }
 2087         }
 2088 
 2089         for (mdp = start; mdp < stop; mdp++) {
 2090                 mp = *mdp;
 2091                 if (mp->md_type != MDT_DEPEND)
 2092                         continue;
 2093                 modname = mp->md_cval;
 2094                 verinfo = mp->md_data;
 2095                 nmodname = NULL;
 2096                 for (nmdp = start; nmdp < stop; nmdp++) {
 2097                         nmp = *nmdp;
 2098                         if (nmp->md_type != MDT_VERSION)
 2099                                 continue;
 2100                         nmodname = nmp->md_cval;
 2101                         if (strcmp(modname, nmodname) == 0)
 2102                                 break;
 2103                 }
 2104                 if (nmdp < stop)/* early exit, it's a self reference */
 2105                         continue;
 2106                 mod = modlist_lookup2(modname, verinfo);
 2107                 if (mod) {      /* woohoo, it's loaded already */
 2108                         lfdep = mod->container;
 2109                         lfdep->refs++;
 2110                         error = linker_file_add_dependency(lf, lfdep);
 2111                         if (error)
 2112                                 break;
 2113                         continue;
 2114                 }
 2115                 error = linker_load_module(NULL, modname, lf, verinfo, NULL);
 2116                 if (error) {
 2117                         printf("KLD %s: depends on %s - not available or"
 2118                             " version mismatch\n", lf->filename, modname);
 2119                         break;
 2120                 }
 2121         }
 2122 
 2123         if (error)
 2124                 return (error);
 2125         linker_addmodules(lf, start, stop, 0);
 2126         return (error);
 2127 }
 2128 
 2129 static int
 2130 sysctl_kern_function_list_iterate(const char *name, void *opaque)
 2131 {
 2132         struct sysctl_req *req;
 2133 
 2134         req = opaque;
 2135         return (SYSCTL_OUT(req, name, strlen(name) + 1));
 2136 }
 2137 
 2138 /*
 2139  * Export a nul-separated, double-nul-terminated list of all function names
 2140  * in the kernel.
 2141  */
 2142 static int
 2143 sysctl_kern_function_list(SYSCTL_HANDLER_ARGS)
 2144 {
 2145         linker_file_t lf;
 2146         int error;
 2147 
 2148 #ifdef MAC
 2149         error = mac_kld_check_stat(req->td->td_ucred);
 2150         if (error)
 2151                 return (error);
 2152 #endif
 2153         error = sysctl_wire_old_buffer(req, 0);
 2154         if (error != 0)
 2155                 return (error);
 2156         KLD_LOCK();
 2157         TAILQ_FOREACH(lf, &linker_files, link) {
 2158                 error = LINKER_EACH_FUNCTION_NAME(lf,
 2159                     sysctl_kern_function_list_iterate, req);
 2160                 if (error) {
 2161                         KLD_UNLOCK();
 2162                         return (error);
 2163                 }
 2164         }
 2165         KLD_UNLOCK();
 2166         return (SYSCTL_OUT(req, "", 1));
 2167 }
 2168 
 2169 SYSCTL_PROC(_kern, OID_AUTO, function_list, CTLTYPE_OPAQUE | CTLFLAG_RD,
 2170     NULL, 0, sysctl_kern_function_list, "", "kernel function list");

Cache object: 65980286ade0ecadcd352a4884a46852


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.