xref: /freebsd/sys/kern/kern_linker.c (revision 41466b50c1d5bfd1cf6adaae547a579a75d7c04e)
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  * $FreeBSD$
27  */
28 
29 #include "opt_ddb.h"
30 
31 #include <sys/param.h>
32 #include <sys/kernel.h>
33 #include <sys/systm.h>
34 #include <sys/malloc.h>
35 #include <sys/sysproto.h>
36 #include <sys/sysent.h>
37 #include <sys/proc.h>
38 #include <sys/lock.h>
39 #include <sys/mutex.h>
40 #include <sys/module.h>
41 #include <sys/linker.h>
42 #include <sys/fcntl.h>
43 #include <sys/libkern.h>
44 #include <sys/namei.h>
45 #include <sys/vnode.h>
46 #include <sys/sysctl.h>
47 
48 
49 #include "linker_if.h"
50 
51 #ifdef KLD_DEBUG
52 int kld_debug = 0;
53 #endif
54 
55 /*static char *linker_search_path(const char *name, struct mod_depend *verinfo);*/
56 static const char *linker_basename(const char* path);
57 static int linker_load_module(const char *kldname, const char *modname,
58 	struct linker_file *parent, struct mod_depend *verinfo,
59 	struct linker_file **lfpp);
60 
61 /* Metadata from the static kernel */
62 SET_DECLARE(modmetadata_set, struct mod_metadata);
63 
64 MALLOC_DEFINE(M_LINKER, "linker", "kernel linker");
65 
66 linker_file_t linker_kernel_file;
67 
68 static struct lock lock;	/* lock for the file list */
69 static linker_class_list_t classes;
70 static linker_file_list_t linker_files;
71 static int next_file_id = 1;
72 
73 /* XXX wrong name; we're looking at version provision tags here, not modules */
74 typedef TAILQ_HEAD(, modlist) modlisthead_t;
75 struct modlist {
76     TAILQ_ENTRY(modlist) link;		/* chain together all modules */
77     linker_file_t	container;
78     const char		*name;
79     int			version;
80 };
81 typedef struct modlist	*modlist_t;
82 static modlisthead_t	found_modules;
83 
84 static char *
85 linker_strdup(const char *str)
86 {
87     char	*result;
88 
89     if ((result = malloc((strlen(str) + 1), M_LINKER, M_WAITOK)) != NULL)
90 	strcpy(result, str);
91     return(result);
92 }
93 
94 static void
95 linker_init(void* arg)
96 {
97     lockinit(&lock, PVM, "klink", 0, 0);
98     TAILQ_INIT(&classes);
99     TAILQ_INIT(&linker_files);
100 }
101 
102 SYSINIT(linker, SI_SUB_KLD, SI_ORDER_FIRST, linker_init, 0);
103 
104 int
105 linker_add_class(linker_class_t lc)
106 {
107     kobj_class_compile((kobj_class_t) lc);
108     TAILQ_INSERT_TAIL(&classes, lc, link);
109     return 0;
110 }
111 
112 static void
113 linker_file_sysinit(linker_file_t lf)
114 {
115     struct sysinit** start, ** stop;
116     struct sysinit** sipp;
117     struct sysinit** xipp;
118     struct sysinit* save;
119 
120     KLD_DPF(FILE, ("linker_file_sysinit: calling SYSINITs for %s\n",
121 		   lf->filename));
122 
123     if (linker_file_lookup_set(lf, "sysinit_set", &start, &stop, NULL) != 0)
124 	return;
125     /*
126      * Perform a bubble sort of the system initialization objects by
127      * their subsystem (primary key) and order (secondary key).
128      *
129      * Since some things care about execution order, this is the
130      * operation which ensures continued function.
131      */
132     for (sipp = start; sipp < stop; sipp++) {
133 	for (xipp = sipp + 1; xipp < stop; xipp++) {
134 	    if ((*sipp)->subsystem < (*xipp)->subsystem ||
135 		 ((*sipp)->subsystem == (*xipp)->subsystem &&
136 		  (*sipp)->order <= (*xipp)->order))
137 		continue;	/* skip*/
138 	    save = *sipp;
139 	    *sipp = *xipp;
140 	    *xipp = save;
141 	}
142     }
143 
144 
145     /*
146      * Traverse the (now) ordered list of system initialization tasks.
147      * Perform each task, and continue on to the next task.
148      */
149     for (sipp = start; sipp < stop; sipp++) {
150 	if ((*sipp)->subsystem == SI_SUB_DUMMY)
151 	    continue;	/* skip dummy task(s)*/
152 
153 	/* Call function */
154 	(*((*sipp)->func))((*sipp)->udata);
155     }
156 }
157 
158 static void
159 linker_file_sysuninit(linker_file_t lf)
160 {
161     struct sysinit** start, ** stop;
162     struct sysinit** sipp;
163     struct sysinit** xipp;
164     struct sysinit* save;
165 
166     KLD_DPF(FILE, ("linker_file_sysuninit: calling SYSUNINITs for %s\n",
167 		   lf->filename));
168 
169     if (linker_file_lookup_set(lf, "sysuninit_set", &start, &stop, NULL) != 0)
170 	return;
171 
172     /*
173      * Perform a reverse bubble sort of the system initialization objects
174      * by their subsystem (primary key) and order (secondary key).
175      *
176      * Since some things care about execution order, this is the
177      * operation which ensures continued function.
178      */
179     for (sipp = start; sipp < stop; sipp++) {
180 	for (xipp = sipp + 1; xipp < stop; xipp++) {
181 	    if ((*sipp)->subsystem > (*xipp)->subsystem ||
182 		 ((*sipp)->subsystem == (*xipp)->subsystem &&
183 		  (*sipp)->order >= (*xipp)->order))
184 		continue;	/* skip*/
185 	    save = *sipp;
186 	    *sipp = *xipp;
187 	    *xipp = save;
188 	}
189     }
190 
191     /*
192      * Traverse the (now) ordered list of system initialization tasks.
193      * Perform each task, and continue on to the next task.
194      */
195     for (sipp = start; sipp < stop; sipp++) {
196 	if ((*sipp)->subsystem == SI_SUB_DUMMY)
197 	    continue;	/* skip dummy task(s)*/
198 
199 	/* Call function */
200 	(*((*sipp)->func))((*sipp)->udata);
201     }
202 }
203 
204 static void
205 linker_file_register_sysctls(linker_file_t lf)
206 {
207     struct sysctl_oid **start, **stop, **oidp;
208 
209     KLD_DPF(FILE, ("linker_file_register_sysctls: registering SYSCTLs for %s\n",
210 		   lf->filename));
211 
212     if (linker_file_lookup_set(lf, "sysctl_set", &start, &stop, NULL) != 0)
213 	return;
214 
215     for (oidp = start; oidp < stop; oidp++)
216 	sysctl_register_oid(*oidp);
217 }
218 
219 static void
220 linker_file_unregister_sysctls(linker_file_t lf)
221 {
222     struct sysctl_oid **start, **stop, **oidp;
223 
224     KLD_DPF(FILE, ("linker_file_unregister_sysctls: registering SYSCTLs for %s\n",
225 		   lf->filename));
226 
227     if (linker_file_lookup_set(lf, "sysctl_set", &start, &stop, NULL) != 0)
228 	return;
229 
230     for (oidp = start; oidp < stop; oidp++)
231 	sysctl_unregister_oid(*oidp);
232 }
233 
234 static int
235 linker_file_register_modules(linker_file_t lf)
236 {
237     int error;
238     struct mod_metadata **start, **stop;
239     struct mod_metadata **mdp;
240     const moduledata_t *moddata;
241 
242     KLD_DPF(FILE, ("linker_file_register_modules: registering modules in %s\n",
243 		   lf->filename));
244 
245     if (linker_file_lookup_set(lf, "modmetadata_set", &start, &stop, 0) != 0) {
246 	/*
247 	 * This fallback should be unnecessary, but if we get booted from
248 	 * boot2 instead of loader and we are missing our metadata then
249 	 * we have to try the best we can.
250 	 */
251 	if (lf == linker_kernel_file) {
252 	    start = SET_BEGIN(modmetadata_set);
253 	    stop = SET_LIMIT(modmetadata_set);
254 	} else {
255 	    return 0;
256 	}
257     }
258     for (mdp = start; mdp < stop; mdp++) {
259 	if ((*mdp)->md_type != MDT_MODULE)
260 	    continue;
261 	moddata = (*mdp)->md_data;
262 	KLD_DPF(FILE, ("Registering module %s in %s\n",
263              moddata->name, lf->filename));
264 	if (module_lookupbyname(moddata->name) != NULL) {
265 	    printf("Warning: module %s already exists\n", moddata->name);
266 	    continue;	/* or return a error ? */
267 	}
268 	error = module_register(moddata, lf);
269 	if (error)
270 	    printf("Module %s failed to register: %d\n", moddata->name, error);
271     }
272     return 0;
273 }
274 
275 static void
276 linker_init_kernel_modules(void)
277 {
278     linker_file_register_modules(linker_kernel_file);
279 }
280 
281 SYSINIT(linker_kernel, SI_SUB_KLD, SI_ORDER_ANY, linker_init_kernel_modules, 0);
282 
283 int
284 linker_load_file(const char* filename, linker_file_t* result)
285 {
286     linker_class_t lc;
287     linker_file_t lf;
288     int foundfile, error = 0;
289 
290     /* Refuse to load modules if securelevel raised */
291     if (securelevel > 0)
292 	return EPERM;
293 
294     lf = linker_find_file_by_name(filename);
295     if (lf) {
296 	KLD_DPF(FILE, ("linker_load_file: file %s is already loaded, incrementing refs\n", filename));
297 	*result = lf;
298 	lf->refs++;
299 	goto out;
300     }
301 
302     lf = NULL;
303     foundfile = 0;
304     TAILQ_FOREACH(lc, &classes, link) {
305 	KLD_DPF(FILE, ("linker_load_file: trying to load %s\n",
306 		       filename));
307 	error = LINKER_LOAD_FILE(lc, filename, &lf);
308 	/*
309 	 * If we got something other than ENOENT, then it exists but we cannot
310 	 * load it for some other reason.
311 	 */
312 	if (error != ENOENT)
313 	    foundfile = 1;
314 	if (lf) {
315 	    linker_file_register_modules(lf);
316 	    linker_file_register_sysctls(lf);
317 	    linker_file_sysinit(lf);
318 	    lf->flags |= LINKER_FILE_LINKED;
319 
320 	    *result = lf;
321 	    error = 0;
322 	    goto out;
323 	}
324     }
325     /*
326      * Less than ideal, but tells the user whether it failed to load or
327      * the module was not found.
328      */
329     if (foundfile)
330 	error = ENOEXEC;	/* Format not recognised (or unloadable) */
331     else
332 	error = ENOENT;		/* Nothing found */
333 
334 out:
335     return error;
336 }
337 
338 /* XXX: function parameters are incomplete */
339 int
340 linker_reference_module(const char *modname, linker_file_t *result)
341 {
342 
343     return linker_load_module(NULL, modname, NULL, NULL, result);
344 }
345 
346 linker_file_t
347 linker_find_file_by_name(const char* filename)
348 {
349     linker_file_t lf = 0;
350     char *koname;
351 
352     koname = malloc(strlen(filename) + 4, M_LINKER, M_WAITOK);
353     if (koname == NULL)
354 	goto out;
355     sprintf(koname, "%s.ko", filename);
356 
357     lockmgr(&lock, LK_SHARED, 0, curthread);
358     TAILQ_FOREACH(lf, &linker_files, link) {
359 	if (!strcmp(lf->filename, koname))
360 	    break;
361 	if (!strcmp(lf->filename, filename))
362 	    break;
363     }
364     lockmgr(&lock, LK_RELEASE, 0, curthread);
365 
366 out:
367     if (koname)
368 	free(koname, M_LINKER);
369     return lf;
370 }
371 
372 linker_file_t
373 linker_find_file_by_id(int fileid)
374 {
375     linker_file_t lf = 0;
376 
377     lockmgr(&lock, LK_SHARED, 0, curthread);
378     TAILQ_FOREACH(lf, &linker_files, link)
379 	if (lf->id == fileid)
380 	    break;
381     lockmgr(&lock, LK_RELEASE, 0, curthread);
382 
383     return lf;
384 }
385 
386 linker_file_t
387 linker_make_file(const char* pathname, linker_class_t lc)
388 {
389     linker_file_t lf = 0;
390     const char *filename;
391 
392     filename = linker_basename(pathname);
393 
394     KLD_DPF(FILE, ("linker_make_file: new file, filename=%s\n", filename));
395     lockmgr(&lock, LK_EXCLUSIVE, 0, curthread);
396     lf = (linker_file_t) kobj_create((kobj_class_t) lc, M_LINKER, M_WAITOK);
397     if (!lf)
398 	goto out;
399 
400     lf->refs = 1;
401     lf->userrefs = 0;
402     lf->flags = 0;
403     lf->filename = linker_strdup(filename);
404     lf->id = next_file_id++;
405     lf->ndeps = 0;
406     lf->deps = NULL;
407     STAILQ_INIT(&lf->common);
408     TAILQ_INIT(&lf->modules);
409 
410     TAILQ_INSERT_TAIL(&linker_files, lf, link);
411 
412 out:
413     lockmgr(&lock, LK_RELEASE, 0, curthread);
414     return lf;
415 }
416 
417 int
418 linker_file_unload(linker_file_t file)
419 {
420     module_t mod, next;
421     modlist_t ml, nextml;
422     struct common_symbol* cp;
423     int error = 0;
424     int i;
425 
426     /* Refuse to unload modules if securelevel raised */
427     if (securelevel > 0)
428 	return EPERM;
429 
430     KLD_DPF(FILE, ("linker_file_unload: lf->refs=%d\n", file->refs));
431     lockmgr(&lock, LK_EXCLUSIVE, 0, curthread);
432     if (file->refs == 1) {
433 	KLD_DPF(FILE, ("linker_file_unload: file is unloading, informing modules\n"));
434 	/*
435 	 * Inform any modules associated with this file.
436 	 */
437 	for (mod = TAILQ_FIRST(&file->modules); mod; mod = next) {
438 	    next = module_getfnext(mod);
439 
440 	    /*
441 	     * Give the module a chance to veto the unload.
442 	     */
443 	    if ((error = module_unload(mod)) != 0) {
444 		KLD_DPF(FILE, ("linker_file_unload: module %x vetoes unload\n",
445 			       mod));
446 		lockmgr(&lock, LK_RELEASE, 0, curthread);
447 		goto out;
448 	    }
449 
450 	    module_release(mod);
451 	}
452     }
453 
454     file->refs--;
455     if (file->refs > 0) {
456 	lockmgr(&lock, LK_RELEASE, 0, curthread);
457 	goto out;
458     }
459 
460     for (ml = TAILQ_FIRST(&found_modules); ml; ml = nextml) {
461 	nextml = TAILQ_NEXT(ml, link);
462 	if (ml->container == file) {
463 	    TAILQ_REMOVE(&found_modules, ml, link);
464 	}
465     }
466 
467     /* Don't try to run SYSUNINITs if we are unloaded due to a link error */
468     if (file->flags & LINKER_FILE_LINKED) {
469 	linker_file_sysuninit(file);
470 	linker_file_unregister_sysctls(file);
471     }
472 
473     TAILQ_REMOVE(&linker_files, file, link);
474     lockmgr(&lock, LK_RELEASE, 0, curthread);
475 
476     if (file->deps) {
477 	for (i = 0; i < file->ndeps; i++)
478 	    linker_file_unload(file->deps[i]);
479 	free(file->deps, M_LINKER);
480 	file->deps = NULL;
481     }
482 
483     for (cp = STAILQ_FIRST(&file->common); cp;
484 	 cp = STAILQ_FIRST(&file->common)) {
485 	STAILQ_REMOVE(&file->common, cp, common_symbol, link);
486 	free(cp, M_LINKER);
487     }
488 
489     LINKER_UNLOAD(file);
490     if (file->filename) {
491 	free(file->filename, M_LINKER);
492 	file->filename = NULL;
493     }
494     kobj_delete((kobj_t) file, M_LINKER);
495 
496 out:
497     return error;
498 }
499 
500 int
501 linker_file_add_dependancy(linker_file_t file, linker_file_t dep)
502 {
503     linker_file_t* newdeps;
504 
505     newdeps = malloc((file->ndeps + 1) * sizeof(linker_file_t*),
506 		     M_LINKER, M_WAITOK | M_ZERO);
507     if (newdeps == NULL)
508 	return ENOMEM;
509 
510     if (file->deps) {
511 	bcopy(file->deps, newdeps, file->ndeps * sizeof(linker_file_t*));
512 	free(file->deps, M_LINKER);
513     }
514     file->deps = newdeps;
515     file->deps[file->ndeps] = dep;
516     file->ndeps++;
517 
518     return 0;
519 }
520 
521 /*
522  * Locate a linker set and its contents.
523  * This is a helper function to avoid linker_if.h exposure elsewhere.
524  * Note: firstp and lastp are really void ***
525  */
526 int
527 linker_file_lookup_set(linker_file_t file, const char *name,
528 		       void *firstp, void *lastp, int *countp)
529 {
530 
531     return LINKER_LOOKUP_SET(file, name, firstp, lastp, countp);
532 }
533 
534 caddr_t
535 linker_file_lookup_symbol(linker_file_t file, const char* name, int deps)
536 {
537     c_linker_sym_t sym;
538     linker_symval_t symval;
539     caddr_t address;
540     size_t common_size = 0;
541     int i;
542 
543     KLD_DPF(SYM, ("linker_file_lookup_symbol: file=%x, name=%s, deps=%d\n",
544 		  file, name, deps));
545 
546     if (LINKER_LOOKUP_SYMBOL(file, name, &sym) == 0) {
547 	LINKER_SYMBOL_VALUES(file, sym, &symval);
548 	if (symval.value == 0)
549 	    /*
550 	     * For commons, first look them up in the dependancies and
551 	     * only allocate space if not found there.
552 	     */
553 	    common_size = symval.size;
554 	else {
555 	    KLD_DPF(SYM, ("linker_file_lookup_symbol: symbol.value=%x\n", symval.value));
556 	    return symval.value;
557 	}
558     }
559 
560     if (deps) {
561 	for (i = 0; i < file->ndeps; i++) {
562 	    address = linker_file_lookup_symbol(file->deps[i], name, 0);
563 	    if (address) {
564 		KLD_DPF(SYM, ("linker_file_lookup_symbol: deps value=%x\n", address));
565 		return address;
566 	    }
567 	}
568     }
569 
570     if (common_size > 0) {
571 	/*
572 	 * This is a common symbol which was not found in the
573 	 * dependancies.  We maintain a simple common symbol table in
574 	 * the file object.
575 	 */
576 	struct common_symbol* cp;
577 
578 	STAILQ_FOREACH(cp, &file->common, link)
579 	    if (!strcmp(cp->name, name)) {
580 		KLD_DPF(SYM, ("linker_file_lookup_symbol: old common value=%x\n", cp->address));
581 		return cp->address;
582 	    }
583 
584 	/*
585 	 * Round the symbol size up to align.
586 	 */
587 	common_size = (common_size + sizeof(int) - 1) & -sizeof(int);
588 	cp = malloc(sizeof(struct common_symbol)
589 		    + common_size
590 		    + strlen(name) + 1,
591 		    M_LINKER, M_WAITOK | M_ZERO);
592 	if (!cp) {
593 	    KLD_DPF(SYM, ("linker_file_lookup_symbol: nomem\n"));
594 	    return 0;
595 	}
596 
597 	cp->address = (caddr_t) (cp + 1);
598 	cp->name = cp->address + common_size;
599 	strcpy(cp->name, name);
600 	bzero(cp->address, common_size);
601 	STAILQ_INSERT_TAIL(&file->common, cp, link);
602 
603 	KLD_DPF(SYM, ("linker_file_lookup_symbol: new common value=%x\n", cp->address));
604 	return cp->address;
605     }
606 
607     KLD_DPF(SYM, ("linker_file_lookup_symbol: fail\n"));
608     return 0;
609 }
610 
611 #ifdef DDB
612 /*
613  * DDB Helpers.  DDB has to look across multiple files with their own
614  * symbol tables and string tables.
615  *
616  * Note that we do not obey list locking protocols here.  We really don't
617  * need DDB to hang because somebody's got the lock held.  We'll take the
618  * chance that the files list is inconsistant instead.
619  */
620 
621 int
622 linker_ddb_lookup(const char *symstr, c_linker_sym_t *sym)
623 {
624     linker_file_t lf;
625 
626     TAILQ_FOREACH(lf, &linker_files, link) {
627 	if (LINKER_LOOKUP_SYMBOL(lf, symstr, sym) == 0)
628 	    return 0;
629     }
630     return ENOENT;
631 }
632 
633 int
634 linker_ddb_search_symbol(caddr_t value, c_linker_sym_t *sym, long *diffp)
635 {
636     linker_file_t lf;
637     u_long off = (uintptr_t)value;
638     u_long diff, bestdiff;
639     c_linker_sym_t best;
640     c_linker_sym_t es;
641 
642     best = 0;
643     bestdiff = off;
644     TAILQ_FOREACH(lf, &linker_files, link) {
645 	if (LINKER_SEARCH_SYMBOL(lf, value, &es, &diff) != 0)
646 	    continue;
647 	if (es != 0 && diff < bestdiff) {
648 	    best = es;
649 	    bestdiff = diff;
650 	}
651 	if (bestdiff == 0)
652 	    break;
653     }
654     if (best) {
655 	*sym = best;
656 	*diffp = bestdiff;
657 	return 0;
658     } else {
659 	*sym = 0;
660 	*diffp = off;
661 	return ENOENT;
662     }
663 }
664 
665 int
666 linker_ddb_symbol_values(c_linker_sym_t sym, linker_symval_t *symval)
667 {
668     linker_file_t lf;
669 
670     TAILQ_FOREACH(lf, &linker_files, link) {
671 	if (LINKER_SYMBOL_VALUES(lf, sym, symval) == 0)
672 	    return 0;
673     }
674     return ENOENT;
675 }
676 
677 #endif
678 
679 /*
680  * Syscalls.
681  */
682 /*
683  * MPSAFE
684  */
685 int
686 kldload(struct thread* td, struct kldload_args* uap)
687 {
688     char *kldname, *modname;
689     char *pathname = NULL;
690     linker_file_t lf;
691     int error = 0;
692 
693     td->td_retval[0] = -1;
694 
695     if (securelevel > 0)	/* redundant, but that's OK */
696 	return EPERM;
697 
698     mtx_lock(&Giant);
699 
700     if ((error = suser_td(td)) != 0)
701 	goto out;
702 
703     pathname = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
704     if ((error = copyinstr(SCARG(uap, file), pathname, MAXPATHLEN, NULL)) != 0)
705 	goto out;
706 
707     /*
708      * If path do not contain qualified name or any dot in it (kldname.ko, or
709      * kldname.ver.ko) treat it as interface name.
710      */
711     if (index(pathname, '/') || index(pathname, '.')) {
712 	kldname = pathname;
713 	modname = NULL;
714     } else {
715 	kldname = NULL;
716 	modname = pathname;
717     }
718     error = linker_load_module(kldname, modname, NULL, NULL, &lf);
719     if (error)
720 	goto out;
721 
722     lf->userrefs++;
723     td->td_retval[0] = lf->id;
724 
725 out:
726     if (pathname)
727 	free(pathname, M_TEMP);
728     mtx_unlock(&Giant);
729     return (error);
730 }
731 
732 /*
733  * MPSAFE
734  */
735 int
736 kldunload(struct thread* td, struct kldunload_args* uap)
737 {
738     linker_file_t lf;
739     int error = 0;
740 
741     if (securelevel > 0)	/* redundant, but that's OK */
742 	return EPERM;
743 
744     mtx_lock(&Giant);
745 
746     if ((error = suser_td(td)) != 0)
747 	goto out;
748 
749     lf = linker_find_file_by_id(SCARG(uap, fileid));
750     if (lf) {
751 	KLD_DPF(FILE, ("kldunload: lf->userrefs=%d\n", lf->userrefs));
752 	if (lf->userrefs == 0) {
753 	    printf("kldunload: attempt to unload file that was loaded by the kernel\n");
754 	    error = EBUSY;
755 	    goto out;
756 	}
757 	lf->userrefs--;
758 	error = linker_file_unload(lf);
759 	if (error)
760 	    lf->userrefs++;
761     } else {
762 	error = ENOENT;
763     }
764 out:
765     mtx_unlock(&Giant);
766     return (error);
767 }
768 
769 /*
770  * MPSAFE
771  */
772 int
773 kldfind(struct thread* td, struct kldfind_args* uap)
774 {
775     char* pathname;
776     const char *filename;
777     linker_file_t lf;
778     int error = 0;
779 
780     mtx_lock(&Giant);
781     td->td_retval[0] = -1;
782 
783     pathname = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
784     if ((error = copyinstr(SCARG(uap, file), pathname, MAXPATHLEN, NULL)) != 0)
785 	goto out;
786 
787     filename = linker_basename(pathname);
788 
789     lf = linker_find_file_by_name(filename);
790     if (lf)
791 	td->td_retval[0] = lf->id;
792     else
793 	error = ENOENT;
794 
795 out:
796     if (pathname)
797 	free(pathname, M_TEMP);
798     mtx_unlock(&Giant);
799     return (error);
800 }
801 
802 /*
803  * MPSAFE
804  */
805 int
806 kldnext(struct thread* td, struct kldnext_args* uap)
807 {
808     linker_file_t lf;
809     int error = 0;
810 
811     mtx_lock(&Giant);
812 
813     if (SCARG(uap, fileid) == 0) {
814 	if (TAILQ_FIRST(&linker_files))
815 	    td->td_retval[0] = TAILQ_FIRST(&linker_files)->id;
816 	else
817 	    td->td_retval[0] = 0;
818 	goto out;
819     }
820 
821     lf = linker_find_file_by_id(SCARG(uap, fileid));
822     if (lf) {
823 	if (TAILQ_NEXT(lf, link))
824 	    td->td_retval[0] = TAILQ_NEXT(lf, link)->id;
825 	else
826 	    td->td_retval[0] = 0;
827     } else {
828 	error = ENOENT;
829     }
830 out:
831     mtx_unlock(&Giant);
832     return (error);
833 }
834 
835 /*
836  * MPSAFE
837  */
838 int
839 kldstat(struct thread* td, struct kldstat_args* uap)
840 {
841     linker_file_t lf;
842     int error = 0;
843     int version;
844     struct kld_file_stat* stat;
845     int namelen;
846 
847     mtx_lock(&Giant);
848 
849     lf = linker_find_file_by_id(SCARG(uap, fileid));
850     if (!lf) {
851 	error = ENOENT;
852 	goto out;
853     }
854 
855     stat = SCARG(uap, stat);
856 
857     /*
858      * Check the version of the user's structure.
859      */
860     if ((error = copyin(&stat->version, &version, sizeof(version))) != 0)
861 	goto out;
862     if (version != sizeof(struct kld_file_stat)) {
863 	error = EINVAL;
864 	goto out;
865     }
866 
867     namelen = strlen(lf->filename) + 1;
868     if (namelen > MAXPATHLEN)
869 	namelen = MAXPATHLEN;
870     if ((error = copyout(lf->filename, &stat->name[0], namelen)) != 0)
871 	goto out;
872     if ((error = copyout(&lf->refs, &stat->refs, sizeof(int))) != 0)
873 	goto out;
874     if ((error = copyout(&lf->id, &stat->id, sizeof(int))) != 0)
875 	goto out;
876     if ((error = copyout(&lf->address, &stat->address, sizeof(caddr_t))) != 0)
877 	goto out;
878     if ((error = copyout(&lf->size, &stat->size, sizeof(size_t))) != 0)
879 	goto out;
880 
881     td->td_retval[0] = 0;
882 
883 out:
884     mtx_unlock(&Giant);
885     return (error);
886 }
887 
888 /*
889  * MPSAFE
890  */
891 int
892 kldfirstmod(struct thread* td, struct kldfirstmod_args* uap)
893 {
894     linker_file_t lf;
895     int error = 0;
896 
897     mtx_lock(&Giant);
898     lf = linker_find_file_by_id(SCARG(uap, fileid));
899     if (lf) {
900 	if (TAILQ_FIRST(&lf->modules))
901 	    td->td_retval[0] = module_getid(TAILQ_FIRST(&lf->modules));
902 	else
903 	    td->td_retval[0] = 0;
904     } else {
905 	error = ENOENT;
906     }
907     mtx_unlock(&Giant);
908     return (error);
909 }
910 
911 /*
912  * MPSAFE
913  */
914 int
915 kldsym(struct thread *td, struct kldsym_args *uap)
916 {
917     char *symstr = NULL;
918     c_linker_sym_t sym;
919     linker_symval_t symval;
920     linker_file_t lf;
921     struct kld_sym_lookup lookup;
922     int error = 0;
923 
924     mtx_lock(&Giant);
925 
926     if ((error = copyin(SCARG(uap, data), &lookup, sizeof(lookup))) != 0)
927 	goto out;
928     if (lookup.version != sizeof(lookup) || SCARG(uap, cmd) != KLDSYM_LOOKUP) {
929 	error = EINVAL;
930 	goto out;
931     }
932 
933     symstr = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
934     if ((error = copyinstr(lookup.symname, symstr, MAXPATHLEN, NULL)) != 0)
935 	goto out;
936 
937     if (SCARG(uap, fileid) != 0) {
938 	lf = linker_find_file_by_id(SCARG(uap, fileid));
939 	if (lf == NULL) {
940 	    error = ENOENT;
941 	    goto out;
942 	}
943 	if (LINKER_LOOKUP_SYMBOL(lf, symstr, &sym) == 0 &&
944 	    LINKER_SYMBOL_VALUES(lf, sym, &symval) == 0) {
945 	    lookup.symvalue = (uintptr_t)symval.value;
946 	    lookup.symsize = symval.size;
947 	    error = copyout(&lookup, SCARG(uap, data), sizeof(lookup));
948 	} else
949 	    error = ENOENT;
950     } else {
951 	TAILQ_FOREACH(lf, &linker_files, link) {
952 	    if (LINKER_LOOKUP_SYMBOL(lf, symstr, &sym) == 0 &&
953 		LINKER_SYMBOL_VALUES(lf, sym, &symval) == 0) {
954 		lookup.symvalue = (uintptr_t)symval.value;
955 		lookup.symsize = symval.size;
956 		error = copyout(&lookup, SCARG(uap, data), sizeof(lookup));
957 		break;
958 	    }
959 	}
960 	if (!lf)
961 	    error = ENOENT;
962     }
963 out:
964     if (symstr)
965 	free(symstr, M_TEMP);
966     mtx_unlock(&Giant);
967     return (error);
968 }
969 
970 /*
971  * Preloaded module support
972  */
973 
974 static modlist_t
975 modlist_lookup(const char *name, int ver)
976 {
977     modlist_t mod;
978 
979     TAILQ_FOREACH(mod, &found_modules, link) {
980 	if (strcmp(mod->name, name) == 0 && (ver == 0 || mod->version == ver))
981 	    return mod;
982     }
983     return NULL;
984 }
985 
986 static modlist_t
987 modlist_lookup2(const char *name, struct mod_depend *verinfo)
988 {
989     modlist_t mod, bestmod;
990     int ver;
991 
992     if (verinfo == NULL)
993 	return modlist_lookup(name, 0);
994     bestmod = NULL;
995     for (mod = TAILQ_FIRST(&found_modules); mod; mod = TAILQ_NEXT(mod, link)) {
996 	if (strcmp(mod->name, name) != 0)
997 	    continue;
998 	ver = mod->version;
999 	if (ver == verinfo->md_ver_preferred)
1000 	    return mod;
1001 	if (ver >= verinfo->md_ver_minimum &&
1002 	    ver <= verinfo->md_ver_maximum &&
1003 	    ver > bestmod->version)
1004 	    bestmod = mod;
1005     }
1006     return bestmod;
1007 }
1008 
1009 static modlist_t
1010 modlist_newmodule(const char *modname, int version, linker_file_t container)
1011 {
1012     modlist_t mod;
1013 
1014     mod = malloc(sizeof(struct modlist), M_LINKER, M_NOWAIT);
1015     if (mod == NULL)
1016 	panic("no memory for module list");
1017     bzero(mod, sizeof(*mod));
1018     mod->container = container;
1019     mod->name = modname;
1020     mod->version = version;
1021     TAILQ_INSERT_TAIL(&found_modules, mod, link);
1022     return mod;
1023 }
1024 
1025 /*
1026  * This routine is cheap and nasty but will work for data pointers.
1027  */
1028 static void *
1029 linker_reloc_ptr(linker_file_t lf, const void *offset)
1030 {
1031 	return lf->address + (uintptr_t)offset;
1032 }
1033 
1034 /*
1035  * Dereference MDT_VERSION metadata into module name and version
1036  */
1037 static void
1038 linker_mdt_version(linker_file_t lf, struct mod_metadata *mp,
1039 	const char **modname, int *version)
1040 {
1041     struct mod_version *mvp;
1042 
1043     if (modname)
1044 	*modname = linker_reloc_ptr(lf, mp->md_cval);
1045     if (version) {
1046 	mvp = linker_reloc_ptr(lf, mp->md_data);
1047 	*version = mvp->mv_version;
1048     }
1049 }
1050 
1051 /*
1052  * Dereference MDT_DEPEND metadata into module name and mod_depend structure
1053  */
1054 static void
1055 linker_mdt_depend(linker_file_t lf, struct mod_metadata *mp,
1056 	const char **modname, struct mod_depend **verinfo)
1057 {
1058 
1059     if (modname)
1060 	*modname = linker_reloc_ptr(lf, mp->md_cval);
1061     if (verinfo)
1062 	*verinfo = linker_reloc_ptr(lf, mp->md_data);
1063 }
1064 
1065 static void
1066 linker_addmodules(linker_file_t lf, struct mod_metadata **start,
1067 	struct mod_metadata **stop, int preload)
1068 {
1069     struct mod_metadata	*mp, **mdp;
1070     const char *modname;
1071     int ver;
1072 
1073     for (mdp = start; mdp < stop; mdp++) {
1074 	if (preload)
1075 	    mp = *mdp;
1076 	else
1077 	    mp = linker_reloc_ptr(lf, *mdp);
1078 	if (mp->md_type != MDT_VERSION)
1079 	    continue;
1080 	if (preload) {
1081 	    modname = mp->md_cval;
1082 	    ver = ((struct mod_version*)mp->md_data)->mv_version;
1083 	} else
1084 	    linker_mdt_version(lf, mp, &modname, &ver);
1085 	if (modlist_lookup(modname, ver) != NULL) {
1086 	    printf("module %s already present!\n", modname);
1087 	    /* XXX what can we do? this is a build error. :-( */
1088 	    continue;
1089 	}
1090 	modlist_newmodule(modname, ver, lf);
1091     }
1092 }
1093 
1094 static void
1095 linker_preload(void* arg)
1096 {
1097     caddr_t		modptr;
1098     const char		*modname, *nmodname;
1099     char		*modtype;
1100     linker_file_t	lf;
1101     linker_class_t	lc;
1102     int			error;
1103     linker_file_list_t	loaded_files;
1104     linker_file_list_t	depended_files;
1105     struct mod_metadata	*mp, *nmp;
1106     struct mod_metadata **start, **stop, **mdp, **nmdp;
1107     struct mod_depend	*verinfo;
1108     int			nver;
1109     int			resolves;
1110     modlist_t		mod;
1111     struct sysinit	**si_start, **si_stop;
1112 
1113     TAILQ_INIT(&loaded_files);
1114     TAILQ_INIT(&depended_files);
1115     TAILQ_INIT(&found_modules);
1116     error = 0;
1117 
1118     modptr = NULL;
1119     while ((modptr = preload_search_next_name(modptr)) != NULL) {
1120 	modname = (char *)preload_search_info(modptr, MODINFO_NAME);
1121 	modtype = (char *)preload_search_info(modptr, MODINFO_TYPE);
1122 	if (modname == NULL) {
1123 	    printf("Preloaded module at %p does not have a name!\n", modptr);
1124 	    continue;
1125 	}
1126 	if (modtype == NULL) {
1127 	    printf("Preloaded module at %p does not have a type!\n", modptr);
1128 	    continue;
1129 	}
1130 	printf("Preloaded %s \"%s\" at %p.\n", modtype, modname, modptr);
1131 	lf = NULL;
1132 	TAILQ_FOREACH(lc, &classes, link) {
1133 	    error = LINKER_LINK_PRELOAD(lc, modname, &lf);
1134 	    if (error) {
1135 		lf = NULL;
1136 		break;
1137 	    }
1138 	}
1139 	if (lf)
1140 	    TAILQ_INSERT_TAIL(&loaded_files, lf, loaded);
1141     }
1142 
1143     /*
1144      * First get a list of stuff in the kernel.
1145      */
1146     if (linker_file_lookup_set(linker_kernel_file, MDT_SETNAME, &start, &stop,
1147 			       NULL) == 0)
1148 	linker_addmodules(linker_kernel_file, start, stop, 1);
1149 
1150     /*
1151      * this is a once-off kinky bubble sort
1152      * resolve relocation dependency requirements
1153      */
1154 restart:
1155     TAILQ_FOREACH(lf, &loaded_files, loaded) {
1156 	error = linker_file_lookup_set(lf, MDT_SETNAME, &start, &stop, NULL);
1157 	/*
1158 	 * First, look to see if we would successfully link with this stuff.
1159 	 */
1160 	resolves = 1;	/* unless we know otherwise */
1161 	if (!error) {
1162 	    for (mdp = start; mdp < stop; mdp++) {
1163 		mp = linker_reloc_ptr(lf, *mdp);
1164 		if (mp->md_type != MDT_DEPEND)
1165 		    continue;
1166 		linker_mdt_depend(lf, mp, &modname, &verinfo);
1167 		for (nmdp = start; nmdp < stop; nmdp++) {
1168 		    nmp = linker_reloc_ptr(lf, *nmdp);
1169 		    if (nmp->md_type != MDT_VERSION)
1170 			continue;
1171 		    linker_mdt_version(lf, nmp, &nmodname, NULL);
1172 		    nmodname = linker_reloc_ptr(lf, nmp->md_cval);
1173 		    if (strcmp(modname, nmodname) == 0)
1174 			break;
1175 		}
1176 		if (nmdp < stop)		/* it's a self reference */
1177 		    continue;
1178 		if (modlist_lookup2(modname, verinfo) == NULL) {
1179 		    /* ok, the module isn't here yet, we are not finished */
1180 		    resolves = 0;
1181 		}
1182 	    }
1183 	}
1184 	/*
1185 	 * OK, if we found our modules, we can link.  So, "provide" the
1186 	 * modules inside and add it to the end of the link order list.
1187 	 */
1188 	if (resolves) {
1189 	    if (!error) {
1190 		for (mdp = start; mdp < stop; mdp++) {
1191 		    mp = linker_reloc_ptr(lf, *mdp);
1192 		    if (mp->md_type != MDT_VERSION)
1193 			continue;
1194 		    linker_mdt_version(lf, mp, &modname, &nver);
1195 		    if (modlist_lookup(modname, nver) != NULL) {
1196 			printf("module %s already present!\n", modname);
1197 			linker_file_unload(lf);
1198 			TAILQ_REMOVE(&loaded_files, lf, loaded);
1199 			goto restart;	/* we changed the tailq next ptr */
1200 		    }
1201 		    modlist_newmodule(modname, nver, lf);
1202 		}
1203 	    }
1204 	    TAILQ_REMOVE(&loaded_files, lf, loaded);
1205 	    TAILQ_INSERT_TAIL(&depended_files, lf, loaded);
1206 	    /*
1207 	     * Since we provided modules, we need to restart the sort so
1208 	     * that the previous files that depend on us have a chance.
1209 	     * Also, we've busted the tailq next pointer with the REMOVE.
1210 	     */
1211 	    goto restart;
1212 	}
1213     }
1214 
1215     /*
1216      * At this point, we check to see what could not be resolved..
1217      */
1218     TAILQ_FOREACH(lf, &loaded_files, loaded) {
1219 	printf("KLD file %s is missing dependencies\n", lf->filename);
1220 	linker_file_unload(lf);
1221 	TAILQ_REMOVE(&loaded_files, lf, loaded);
1222     }
1223 
1224     /*
1225      * We made it. Finish off the linking in the order we determined.
1226      */
1227     TAILQ_FOREACH(lf, &depended_files, loaded) {
1228 	if (linker_kernel_file) {
1229 	    linker_kernel_file->refs++;
1230 	    error = linker_file_add_dependancy(lf, linker_kernel_file);
1231 	    if (error)
1232 		panic("cannot add dependency");
1233 	}
1234 	lf->userrefs++;		/* so we can (try to) kldunload it */
1235 	error = linker_file_lookup_set(lf, MDT_SETNAME, &start, &stop, NULL);
1236 	if (!error) {
1237 	    for (mdp = start; mdp < stop; mdp++) {
1238 		mp = linker_reloc_ptr(lf, *mdp);
1239 		if (mp->md_type != MDT_DEPEND)
1240 		    continue;
1241 		linker_mdt_depend(lf, mp, &modname, &verinfo);
1242 		mod = modlist_lookup2(modname, verinfo);
1243 		mod->container->refs++;
1244 		error = linker_file_add_dependancy(lf, mod->container);
1245 		if (error)
1246 		    panic("cannot add dependency");
1247 	    }
1248 	}
1249 
1250 	/*
1251 	 * Now do relocation etc using the symbol search paths established by
1252 	 * the dependencies
1253 	 */
1254 	error = LINKER_LINK_PRELOAD_FINISH(lf);
1255 	if (error) {
1256 	    printf("KLD file %s - could not finalize loading\n", lf->filename);
1257 	    linker_file_unload(lf);
1258 	    continue;
1259 	}
1260 
1261 	linker_file_register_modules(lf);
1262 	if (linker_file_lookup_set(lf, "sysinit_set", &si_start, &si_stop, NULL) == 0)
1263 	    sysinit_add(si_start, si_stop);
1264 	linker_file_register_sysctls(lf);
1265 	lf->flags |= LINKER_FILE_LINKED;
1266     }
1267     /* woohoo! we made it! */
1268 }
1269 
1270 SYSINIT(preload, SI_SUB_KLD, SI_ORDER_MIDDLE, linker_preload, 0);
1271 
1272 /*
1273  * Search for a not-loaded module by name.
1274  *
1275  * Modules may be found in the following locations:
1276  *
1277  * - preloaded (result is just the module name)
1278  * - on disk (result is full path to module)
1279  *
1280  * If the module name is qualified in any way (contains path, etc.)
1281  * the we simply return a copy of it.
1282  *
1283  * The search path can be manipulated via sysctl.  Note that we use the ';'
1284  * character as a separator to be consistent with the bootloader.
1285  */
1286 
1287 static char linker_hintfile[] = "linker.hints";
1288 static char linker_path[MAXPATHLEN] = "/boot/kernel;/boot/modules;/modules";
1289 
1290 SYSCTL_STRING(_kern, OID_AUTO, module_path, CTLFLAG_RW, linker_path,
1291 	      sizeof(linker_path), "module load search path");
1292 
1293 TUNABLE_STR("module_path", linker_path, sizeof(linker_path));
1294 
1295 static char *linker_ext_list[] = {
1296 	"",
1297 	".ko",
1298 	NULL
1299 };
1300 
1301 /*
1302  * Check if file actually exists either with or without extension listed
1303  * in the linker_ext_list.
1304  * (probably should be generic for the rest of the kernel)
1305  */
1306 static char *
1307 linker_lookup_file(const char *path, int pathlen,
1308 	const char *name, int namelen, struct vattr *vap)
1309 {
1310     struct nameidata	nd;
1311     struct thread	*td = curthread;	/* XXX */
1312     char		*result, **cpp, *sep;
1313     int			error, len, extlen, reclen, flags;
1314     enum vtype		type;
1315 
1316     extlen = 0;
1317     for (cpp = linker_ext_list; *cpp; cpp++) {
1318 	len = strlen(*cpp);
1319 	if (len > extlen)
1320 	    extlen = len;
1321     }
1322     extlen++;	/* trailing '\0' */
1323     sep = (path[pathlen - 1] != '/') ? "/" : "";
1324 
1325     reclen = pathlen + strlen(sep) + namelen + extlen + 1;
1326     result = malloc(reclen, M_LINKER, M_WAITOK);
1327     for (cpp = linker_ext_list; *cpp; cpp++) {
1328 	snprintf(result, reclen, "%.*s%s%.*s%s", pathlen, path, sep,
1329 	    namelen, name, *cpp);
1330 	/*
1331 	 * Attempt to open the file, and return the path if we succeed
1332 	 * and it's a regular file.
1333 	 */
1334 	NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, result, td);
1335 	flags = FREAD;
1336 	error = vn_open(&nd, &flags, 0);
1337 	if (error == 0) {
1338 	    NDFREE(&nd, NDF_ONLY_PNBUF);
1339 	    type = nd.ni_vp->v_type;
1340 	    if (vap)
1341 		VOP_GETATTR(nd.ni_vp, vap, td->td_proc->p_ucred, td);
1342 	    VOP_UNLOCK(nd.ni_vp, 0, td);
1343 	    vn_close(nd.ni_vp, FREAD, td->td_proc->p_ucred, td);
1344 	    if (type == VREG)
1345 	        return(result);
1346 	}
1347     }
1348     free(result, M_LINKER);
1349     return(NULL);
1350 }
1351 
1352 #define	INT_ALIGN(base, ptr)	ptr = \
1353 	(base) + (((ptr) - (base) + sizeof(int) - 1) & ~(sizeof(int) - 1))
1354 
1355 /*
1356  * Lookup KLD which contains requested module in the "linker.hints" file.
1357  * If version specification is available, then try to find the best KLD.
1358  * Otherwise just find the latest one.
1359  */
1360 static char *
1361 linker_hints_lookup(const char *path, int pathlen,
1362 	const char *modname, int modnamelen,
1363 	struct mod_depend *verinfo)
1364 {
1365     struct thread *td = curthread;	/* XXX */
1366     struct ucred *cred = td ? td->td_proc->p_ucred : NULL;
1367     struct nameidata nd;
1368     struct vattr vattr, mattr;
1369     u_char *hints = NULL;
1370     u_char *cp, *recptr, *bufend, *result, *best, *pathbuf, *sep;
1371     int error, ival, bestver, *intp, reclen, found, flags, clen, blen;
1372 
1373     result = NULL;
1374     bestver = found = 0;
1375 
1376     sep = (path[pathlen - 1] != '/') ? "/" : "";
1377     reclen = imax(modnamelen, strlen(linker_hintfile)) + pathlen +
1378         strlen(sep) + 1;
1379     pathbuf = malloc(reclen, M_LINKER, M_WAITOK);
1380     snprintf(pathbuf, reclen, "%.*s%s%s", pathlen, path, sep, linker_hintfile);
1381 
1382     NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, pathbuf, td);
1383     flags = FREAD;
1384     error = vn_open(&nd, &flags, 0);
1385     if (error)
1386 	goto bad;
1387     NDFREE(&nd, NDF_ONLY_PNBUF);
1388     VOP_UNLOCK(nd.ni_vp, 0, td);
1389     if (nd.ni_vp->v_type != VREG)
1390 	goto bad;
1391     best = cp = NULL;
1392     error = VOP_GETATTR(nd.ni_vp, &vattr, cred, td);
1393     if (error)
1394 	goto bad;
1395     /*
1396      * XXX: we need to limit this number to some reasonable value
1397      */
1398     if (vattr.va_size > 100 * 1024) {
1399 	printf("hints file too large %ld\n", (long)vattr.va_size);
1400 	goto bad;
1401     }
1402     hints = malloc(vattr.va_size, M_TEMP, M_WAITOK);
1403     if (hints == NULL)
1404 	goto bad;
1405     error = vn_rdwr(UIO_READ, nd.ni_vp, (caddr_t)hints, vattr.va_size, 0,
1406 		    UIO_SYSSPACE, IO_NODELOCKED, cred, &reclen, td);
1407     if (error)
1408 	goto bad;
1409     vn_close(nd.ni_vp, FREAD, cred, td);
1410     nd.ni_vp = NULL;
1411     if (reclen != 0) {
1412 	printf("can't read %d\n", reclen);
1413 	goto bad;
1414     }
1415     intp = (int*)hints;
1416     ival = *intp++;
1417     if (ival != LINKER_HINTS_VERSION) {
1418 	printf("hints file version mismatch %d\n", ival);
1419 	goto bad;
1420     }
1421     bufend = hints + vattr.va_size;
1422     recptr = (u_char*)intp;
1423     clen = blen = 0;
1424     while (recptr < bufend && !found) {
1425 	intp = (int*)recptr;
1426 	reclen = *intp++;
1427 	ival = *intp++;
1428 	cp = (char*)intp;
1429 	switch (ival) {
1430 	case MDT_VERSION:
1431 	    clen = *cp++;
1432 	    if (clen != modnamelen || bcmp(cp, modname, clen) != 0)
1433 		break;
1434 	    cp += clen;
1435 	    INT_ALIGN(hints, cp);
1436 	    ival = *(int*)cp;
1437 	    cp += sizeof(int);
1438 	    clen = *cp++;
1439 	    if (verinfo == NULL || ival == verinfo->md_ver_preferred) {
1440 		found = 1;
1441 		break;
1442 	    }
1443 	    if (ival >= verinfo->md_ver_minimum &&
1444 		ival <= verinfo->md_ver_maximum &&
1445 		ival > bestver) {
1446 		bestver = ival;
1447 		best = cp;
1448 		blen = clen;
1449 	    }
1450 	    break;
1451 	default:
1452 	    break;
1453 	}
1454 	recptr += reclen + sizeof(int);
1455     }
1456     /*
1457      * Finally check if KLD is in the place
1458      */
1459     if (found)
1460 	result = linker_lookup_file(path, pathlen, cp, clen, &mattr);
1461     else if (best)
1462 	result = linker_lookup_file(path, pathlen, best, blen, &mattr);
1463     if (result && timespeccmp(&mattr.va_mtime, &vattr.va_mtime, >)) {
1464 	/*
1465 	 * KLD is newer than hints file. What we should do now ?
1466 	 */
1467 	 printf("warning: KLD '%s' is newer than the linker.hints file\n",
1468 	     result);
1469     }
1470 bad:
1471     if (hints)
1472 	free(hints, M_TEMP);
1473     if (nd.ni_vp != NULL)
1474 	vn_close(nd.ni_vp, FREAD, cred, td);
1475     /*
1476      * If nothing found or hints is absent - fallback to the old way
1477      * by using "kldname[.ko]" as module name.
1478      */
1479     if (!found && !bestver && result == NULL)
1480 	result = linker_lookup_file(path, pathlen, modname, modnamelen, NULL);
1481     return result;
1482 }
1483 
1484 /*
1485  * Lookup KLD which contains requested module in the all directories.
1486  */
1487 static char *
1488 linker_search_module(const char *modname, int modnamelen,
1489 	struct mod_depend *verinfo)
1490 {
1491     char *cp, *ep, *result;
1492 
1493     /*
1494      * traverse the linker path
1495      */
1496     for (cp = linker_path; *cp; cp = ep + 1) {
1497 
1498 	/* find the end of this component */
1499 	for (ep = cp; (*ep != 0) && (*ep != ';'); ep++)
1500 	    ;
1501 	result = linker_hints_lookup(cp, ep - cp, modname, modnamelen, verinfo);
1502 	if (result != NULL)
1503 	    return(result);
1504 	if (*ep == 0)
1505 	    break;
1506     }
1507     return (NULL);
1508 }
1509 
1510 /*
1511  * Search for module in all directories listed in the linker_path.
1512  */
1513 static char *
1514 linker_search_kld(const char *name)
1515 {
1516     char		*cp, *ep, *result, **cpp;
1517     int			extlen, len;
1518 
1519     /* qualified at all? */
1520     if (index(name, '/'))
1521 	return(linker_strdup(name));
1522 
1523     extlen = 0;
1524     for (cpp = linker_ext_list; *cpp; cpp++) {
1525 	len = strlen(*cpp);
1526 	if (len > extlen)
1527 	    extlen = len;
1528     }
1529     extlen++;	/* trailing '\0' */
1530 
1531     /* traverse the linker path */
1532     len = strlen(name);
1533     for (ep = linker_path; *ep; ep++) {
1534 	cp = ep;
1535 	/* find the end of this component */
1536 	for (; *ep != 0 && *ep != ';'; ep++)
1537 	    ;
1538 	result = linker_lookup_file(cp, ep - cp, name, len, NULL);
1539 	if (result != NULL)
1540 	    return(result);
1541     }
1542     return(NULL);
1543 }
1544 
1545 static const char *
1546 linker_basename(const char* path)
1547 {
1548     const char *filename;
1549 
1550     filename = rindex(path, '/');
1551     if (filename == NULL)
1552 	return path;
1553     if (filename[1])
1554 	filename++;
1555     return filename;
1556 }
1557 
1558 /*
1559  * Find a file which contains given module and load it,
1560  * if "parent" is not NULL, register a reference to it.
1561  */
1562 static int
1563 linker_load_module(const char *kldname, const char *modname,
1564 	struct linker_file *parent, struct mod_depend *verinfo,
1565 	struct linker_file **lfpp)
1566 {
1567     linker_file_t lfdep;
1568     const char *filename;
1569     char *pathname;
1570     int error;
1571 
1572     if (modname == NULL) {
1573 	/*
1574 	 * We have to load KLD
1575 	 */
1576 	KASSERT(verinfo == NULL, ("linker_load_module: verinfo is not NULL"));
1577 	pathname = linker_search_kld(kldname);
1578     } else {
1579 	if (modlist_lookup2(modname, verinfo) != NULL)
1580 	    return (EEXIST);
1581 	if (kldname == NULL) {
1582 	    /*
1583 	     * Need to find a KLD with required module
1584 	     */
1585 	    pathname = linker_search_module(modname, strlen(modname), verinfo);
1586 	} else
1587 	    pathname = linker_strdup(kldname);
1588     }
1589     if (pathname == NULL)
1590 	return (ENOENT);
1591 
1592     /*
1593      * Can't load more than one file with the same basename
1594      * XXX: Actually it should be possible to have multiple KLDs
1595      * with the same basename but different path because they can provide
1596      * different versions of the same modules.
1597      */
1598     filename = linker_basename(pathname);
1599     if (linker_find_file_by_name(filename)) {
1600 	error = EEXIST;
1601 	goto out;
1602     }
1603 
1604     do {
1605 	error = linker_load_file(pathname, &lfdep);
1606 	if (error)
1607 	    break;
1608 	if (modname && verinfo && modlist_lookup2(modname, verinfo) == NULL) {
1609 	    linker_file_unload(lfdep);
1610 	    error = ENOENT;
1611 	    break;
1612 	}
1613 	if (parent) {
1614 	    error = linker_file_add_dependancy(parent, lfdep);
1615 	    if (error)
1616 		break;
1617 	}
1618 	if (lfpp)
1619 	    *lfpp = lfdep;
1620     } while(0);
1621 out:
1622     if (pathname)
1623 	free(pathname, M_LINKER);
1624     return error;
1625 }
1626 
1627 /*
1628  * This routine is responsible for finding dependencies of userland
1629  * initiated kldload(2)'s of files.
1630  */
1631 int
1632 linker_load_dependancies(linker_file_t lf)
1633 {
1634     linker_file_t lfdep;
1635     struct mod_metadata **start, **stop, **mdp, **nmdp;
1636     struct mod_metadata *mp, *nmp;
1637     struct mod_depend *verinfo;
1638     modlist_t mod;
1639     const char *modname, *nmodname;
1640     int ver, error = 0, count;
1641 
1642     /*
1643      * All files are dependant on /kernel.
1644      */
1645     if (linker_kernel_file) {
1646 	linker_kernel_file->refs++;
1647 	error = linker_file_add_dependancy(lf, linker_kernel_file);
1648 	if (error)
1649 	    return error;
1650     }
1651 
1652     if (linker_file_lookup_set(lf, MDT_SETNAME, &start, &stop, &count) != 0)
1653 	return 0;
1654     for (mdp = start; mdp < stop; mdp++) {
1655 	mp = linker_reloc_ptr(lf, *mdp);
1656 	if (mp->md_type != MDT_VERSION)
1657 	    continue;
1658 	linker_mdt_version(lf, mp, &modname, &ver);
1659 	mod = modlist_lookup(modname, ver);
1660 	if (mod != NULL) {
1661 	    printf("interface %s.%d already present in the KLD '%s'!\n",
1662 		modname, ver, mod->container->filename);
1663 	    return EEXIST;
1664 	}
1665     }
1666 
1667     for (mdp = start; mdp < stop; mdp++) {
1668 	mp = linker_reloc_ptr(lf, *mdp);
1669 	if (mp->md_type != MDT_DEPEND)
1670 	    continue;
1671 	linker_mdt_depend(lf, mp, &modname, &verinfo);
1672 	nmodname = NULL;
1673 	for (nmdp = start; nmdp < stop; nmdp++) {
1674 	    nmp = linker_reloc_ptr(lf, *nmdp);
1675 	    if (nmp->md_type != MDT_VERSION)
1676 		continue;
1677 	    nmodname = linker_reloc_ptr(lf, nmp->md_cval);
1678 	    if (strcmp(modname, nmodname) == 0)
1679 		break;
1680 	}
1681 	if (nmdp < stop)	/* early exit, it's a self reference */
1682 	    continue;
1683 	mod = modlist_lookup2(modname, verinfo);
1684 	if (mod) {		/* woohoo, it's loaded already */
1685 	    lfdep = mod->container;
1686 	    lfdep->refs++;
1687 	    error = linker_file_add_dependancy(lf, lfdep);
1688 	    if (error)
1689 		break;
1690 	    continue;
1691 	}
1692 	error = linker_load_module(NULL, modname, lf, verinfo, NULL);
1693 	if (error) {
1694 	    printf("KLD %s: depends on %s - not available\n",
1695 		lf->filename, modname);
1696 	    break;
1697 	}
1698     }
1699 
1700     if (error)
1701 	return error;
1702     linker_addmodules(lf, start, stop, 0);
1703     return error;
1704 }
1705 
1706 static int
1707 sysctl_kern_function_list_iterate(const char *name, void *opaque)
1708 {
1709 	struct sysctl_req *req;
1710 
1711 	req = opaque;
1712 	return (SYSCTL_OUT(req, name, strlen(name) + 1));
1713 }
1714 
1715 /*
1716  * Export a nul-separated, double-nul-terminated list of all function names
1717  * in the kernel.
1718  */
1719 static int
1720 sysctl_kern_function_list(SYSCTL_HANDLER_ARGS)
1721 {
1722 	linker_file_t lf;
1723 	int error;
1724 
1725 	TAILQ_FOREACH(lf, &linker_files, link) {
1726 		error = LINKER_EACH_FUNCTION_NAME(lf,
1727 		    sysctl_kern_function_list_iterate, req);
1728 		if (error)
1729 			return (error);
1730 	}
1731 	return (SYSCTL_OUT(req, "", 1));
1732 }
1733 
1734 SYSCTL_PROC(_kern, OID_AUTO, function_list, CTLFLAG_RD,
1735 	NULL, 0, sysctl_kern_function_list, "", "kernel function list");
1736