xref: /dflybsd-src/sys/kern/kern_linker.c (revision e7b4468ce80913950cd099c393f3ce6ece6fcb2c)
1 /*-
2  * Copyright (c) 1997 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: src/sys/kern/kern_linker.c,v 1.41.2.3 2001/11/21 17:50:35 luigi Exp $
27  * $DragonFly: src/sys/kern/kern_linker.c,v 1.40 2008/01/05 14:02:38 swildner Exp $
28  */
29 
30 #include "opt_ddb.h"
31 
32 #include <sys/param.h>
33 #include <sys/kernel.h>
34 #include <sys/systm.h>
35 #include <sys/malloc.h>
36 #include <sys/sysproto.h>
37 #include <sys/sysent.h>
38 #include <sys/proc.h>
39 #include <sys/lock.h>
40 #include <sys/module.h>
41 #include <sys/linker.h>
42 #include <sys/fcntl.h>
43 #include <sys/libkern.h>
44 #include <sys/nlookup.h>
45 #include <sys/vnode.h>
46 #include <sys/sysctl.h>
47 
48 #include <vm/vm_zone.h>
49 
50 #ifdef _KERNEL_VIRTUAL
51 #include <dlfcn.h>
52 #endif
53 
54 #ifdef KLD_DEBUG
55 int kld_debug = 0;
56 #endif
57 
58 /* Metadata from the static kernel */
59 SET_DECLARE(modmetadata_set, struct mod_metadata);
60 MALLOC_DEFINE(M_LINKER, "kld", "kernel linker");
61 
62 linker_file_t linker_current_file;
63 linker_file_t linker_kernel_file;
64 
65 static struct lock lock;	/* lock for the file list */
66 static linker_class_list_t classes;
67 static linker_file_list_t linker_files;
68 static int next_file_id = 1;
69 
70 static void
71 linker_init(void* arg)
72 {
73     lockinit(&lock, "klink", 0, 0);
74     TAILQ_INIT(&classes);
75     TAILQ_INIT(&linker_files);
76 }
77 
78 SYSINIT(linker, SI_BOOT2_KLD, SI_ORDER_FIRST, linker_init, 0);
79 
80 int
81 linker_add_class(const char* desc, void* priv,
82 		 struct linker_class_ops* ops)
83 {
84     linker_class_t lc;
85 
86     lc = kmalloc(sizeof(struct linker_class), M_LINKER, M_NOWAIT | M_ZERO);
87     if (!lc)
88 	return ENOMEM;
89 
90     lc->desc = desc;
91     lc->priv = priv;
92     lc->ops = ops;
93     TAILQ_INSERT_HEAD(&classes, lc, link);
94 
95     return 0;
96 }
97 
98 static int
99 linker_file_sysinit(linker_file_t lf)
100 {
101     struct sysinit** start, ** stop;
102     struct sysinit** sipp;
103     struct sysinit** xipp;
104     struct sysinit* save;
105     const moduledata_t *moddata;
106     int error;
107 
108     KLD_DPF(FILE, ("linker_file_sysinit: calling SYSINITs for %s\n",
109 		   lf->filename));
110 
111     if (linker_file_lookup_set(lf, "sysinit_set", &start, &stop, NULL) != 0)
112 	return 0; /* XXX is this correct ? No sysinit ? */
113 
114     /* HACK ALERT! */
115     for (sipp = start; sipp < stop; sipp++) {
116 	if ((*sipp)->func == module_register_init) {
117 	    moddata = (*sipp)->udata;
118 	    error = module_register(moddata, lf);
119 	    if (error) {
120 		kprintf("linker_file_sysinit \"%s\" failed to register! %d\n",
121 		    lf->filename, error);
122 		return error;
123 	    }
124 	}
125     }
126 
127     /*
128      * Perform a bubble sort of the system initialization objects by
129      * their subsystem (primary key) and order (secondary key).
130      *
131      * Since some things care about execution order, this is the
132      * operation which ensures continued function.
133      */
134     for (sipp = start; sipp < stop; sipp++) {
135 	for (xipp = sipp + 1; xipp < stop; xipp++) {
136 	    if ((*sipp)->subsystem < (*xipp)->subsystem ||
137 		 ((*sipp)->subsystem == (*xipp)->subsystem &&
138 		  (*sipp)->order <= (*xipp)->order))
139 		continue;	/* skip*/
140 	    save = *sipp;
141 	    *sipp = *xipp;
142 	    *xipp = save;
143 	}
144     }
145 
146 
147     /*
148      * Traverse the (now) ordered list of system initialization tasks.
149      * Perform each task, and continue on to the next task.
150      */
151     for (sipp = start; sipp < stop; sipp++) {
152 	if ((*sipp)->subsystem == SI_SPECIAL_DUMMY)
153 	    continue;	/* skip dummy task(s)*/
154 
155 	/* Call function */
156 	(*((*sipp)->func))((*sipp)->udata);
157     }
158     return 0; /* no errors */
159 }
160 
161 static void
162 linker_file_sysuninit(linker_file_t lf)
163 {
164     struct sysinit** start, ** stop;
165     struct sysinit** sipp;
166     struct sysinit** xipp;
167     struct sysinit* save;
168 
169     KLD_DPF(FILE, ("linker_file_sysuninit: calling SYSUNINITs for %s\n",
170 		   lf->filename));
171 
172     if (linker_file_lookup_set(lf, "sysuninit_set", &start, &stop, NULL) != 0)
173 	return;
174 
175     /*
176      * Perform a reverse bubble sort of the system initialization objects
177      * by their subsystem (primary key) and order (secondary key).
178      *
179      * Since some things care about execution order, this is the
180      * operation which ensures continued function.
181      */
182     for (sipp = start; sipp < stop; sipp++) {
183 	for (xipp = sipp + 1; xipp < stop; xipp++) {
184 	    if ((*sipp)->subsystem > (*xipp)->subsystem ||
185 		 ((*sipp)->subsystem == (*xipp)->subsystem &&
186 		  (*sipp)->order >= (*xipp)->order))
187 		continue;	/* skip*/
188 	    save = *sipp;
189 	    *sipp = *xipp;
190 	    *xipp = save;
191 	}
192     }
193 
194 
195     /*
196      * Traverse the (now) ordered list of system initialization tasks.
197      * Perform each task, and continue on to the next task.
198      */
199     for (sipp = start; sipp < stop; sipp++) {
200 	if ((*sipp)->subsystem == SI_SPECIAL_DUMMY)
201 	    continue;	/* skip dummy task(s)*/
202 
203 	/* Call function */
204 	(*((*sipp)->func))((*sipp)->udata);
205     }
206 }
207 
208 static void
209 linker_file_register_sysctls(linker_file_t lf)
210 {
211     struct sysctl_oid **start, **stop, **oidp;
212 
213     KLD_DPF(FILE, ("linker_file_register_sysctls: registering SYSCTLs for %s\n",
214 		   lf->filename));
215 
216     if (linker_file_lookup_set(lf, "sysctl_set", &start, &stop, NULL) != 0)
217 	return;
218     for (oidp = start; oidp < stop; oidp++)
219 	sysctl_register_oid(*oidp);
220 }
221 
222 static void
223 linker_file_unregister_sysctls(linker_file_t lf)
224 {
225     struct sysctl_oid **start, **stop, **oidp;
226 
227     KLD_DPF(FILE, ("linker_file_unregister_sysctls: registering SYSCTLs for %s\n",
228 		   lf->filename));
229 
230     if (linker_file_lookup_set(lf, "sysctl_set", &start, &stop, NULL) != 0)
231 	return;
232     for (oidp = start; oidp < stop; oidp++)
233 	sysctl_unregister_oid(*oidp);
234 }
235 
236 int
237 linker_load_file(const char* filename, linker_file_t* result)
238 {
239     linker_class_t lc;
240     linker_file_t lf;
241     int foundfile, error = 0;
242     char *koname = NULL;
243 
244     /* Refuse to load modules if securelevel raised */
245     if (securelevel > 0 || kernel_mem_readonly)
246 	return EPERM;
247 
248     lf = linker_find_file_by_name(filename);
249     if (lf) {
250 	KLD_DPF(FILE, ("linker_load_file: file %s is already loaded, incrementing refs\n", filename));
251 	*result = lf;
252 	lf->refs++;
253 	goto out;
254     }
255     if (find_mod_metadata(filename)) {
256 	if (linker_kernel_file)
257 	    ++linker_kernel_file->refs;
258 	*result = linker_kernel_file;
259 	goto out;
260     }
261 
262     koname = kmalloc(strlen(filename) + 4, M_LINKER, M_WAITOK);
263     if (koname == NULL) {
264 	error = ENOMEM;
265 	goto out;
266     }
267     ksprintf(koname, "%s.ko", filename);
268     lf = NULL;
269     foundfile = 0;
270     for (lc = TAILQ_FIRST(&classes); lc; lc = TAILQ_NEXT(lc, link)) {
271 	KLD_DPF(FILE, ("linker_load_file: trying to load %s as %s\n",
272 		       filename, lc->desc));
273 
274 	error = lc->ops->load_file(koname, &lf);	/* First with .ko */
275 	if (lf == NULL && error == ENOENT)
276 	    error = lc->ops->load_file(filename, &lf);	/* Then try without */
277 	/*
278 	 * If we got something other than ENOENT, then it exists but we cannot
279 	 * load it for some other reason.
280 	 */
281 	if (error != ENOENT)
282 	    foundfile = 1;
283 	if (lf) {
284 	    linker_file_register_sysctls(lf);
285 	    error = linker_file_sysinit(lf);
286 
287 	    *result = lf;
288 	    goto out;
289 	}
290     }
291     /*
292      * Less than ideal, but tells the user whether it failed to load or
293      * the module was not found.
294      */
295     if (foundfile) {
296 	    /*
297 	     * Format not recognized or otherwise unloadable.
298 	     * When loading a module that is statically built into
299 	     * the kernel EEXIST percolates back up as the return
300 	     * value.  Preserve this so that apps can recognize this
301 	     * special case.
302 	     */
303 	    if (error != EEXIST)
304 		    error = ENOEXEC;
305     } else {
306 	error = ENOENT;		/* Nothing found */
307     }
308 
309 out:
310     if (koname)
311 	kfree(koname, M_LINKER);
312     return error;
313 }
314 
315 linker_file_t
316 linker_find_file_by_name(const char* filename)
317 {
318     linker_file_t lf = 0;
319     char *koname;
320     int i;
321 
322     for (i = strlen(filename); i > 0 && filename[i-1] != '/'; --i)
323 	;
324     filename += i;
325 
326     koname = kmalloc(strlen(filename) + 4, M_LINKER, M_WAITOK);
327     if (koname == NULL)
328 	goto out;
329     ksprintf(koname, "%s.ko", filename);
330 
331     lockmgr(&lock, LK_SHARED);
332     for (lf = TAILQ_FIRST(&linker_files); lf; lf = TAILQ_NEXT(lf, link)) {
333 	if (!strcmp(lf->filename, koname))
334 	    break;
335 	if (!strcmp(lf->filename, filename))
336 	    break;
337     }
338     lockmgr(&lock, LK_RELEASE);
339 
340 out:
341     if (koname)
342 	kfree(koname, M_LINKER);
343     return lf;
344 }
345 
346 linker_file_t
347 linker_find_file_by_id(int fileid)
348 {
349     linker_file_t lf = 0;
350 
351     lockmgr(&lock, LK_SHARED);
352     for (lf = TAILQ_FIRST(&linker_files); lf; lf = TAILQ_NEXT(lf, link))
353 	if (lf->id == fileid)
354 	    break;
355     lockmgr(&lock, LK_RELEASE);
356 
357     return lf;
358 }
359 
360 linker_file_t
361 linker_make_file(const char* pathname, void* priv, struct linker_file_ops* ops)
362 {
363     linker_file_t lf = 0;
364     int namelen;
365     const char *filename;
366 
367     filename = rindex(pathname, '/');
368     if (filename && filename[1])
369 	filename++;
370     else
371 	filename = pathname;
372 
373     KLD_DPF(FILE, ("linker_make_file: new file, filename=%s\n", filename));
374     lockmgr(&lock, LK_EXCLUSIVE);
375     namelen = strlen(filename) + 1;
376     lf = kmalloc(sizeof(struct linker_file) + namelen, M_LINKER, M_WAITOK);
377     if (!lf)
378 	goto out;
379     bzero(lf, sizeof(*lf));
380 
381     lf->refs = 1;
382     lf->userrefs = 0;
383     lf->flags = 0;
384     lf->filename = (char*) (lf + 1);
385     strcpy(lf->filename, filename);
386     lf->id = next_file_id++;
387     lf->ndeps = 0;
388     lf->deps = NULL;
389     STAILQ_INIT(&lf->common);
390     TAILQ_INIT(&lf->modules);
391 
392     lf->priv = priv;
393     lf->ops = ops;
394     TAILQ_INSERT_TAIL(&linker_files, lf, link);
395 
396 out:
397     lockmgr(&lock, LK_RELEASE);
398     return lf;
399 }
400 
401 int
402 linker_file_unload(linker_file_t file)
403 {
404     module_t mod, next;
405     struct common_symbol* cp;
406     int error = 0;
407     int i;
408 
409     /* Refuse to unload modules if securelevel raised */
410     if (securelevel > 0 || kernel_mem_readonly)
411 	return EPERM;
412 
413     KLD_DPF(FILE, ("linker_file_unload: lf->refs=%d\n", file->refs));
414     lockmgr(&lock, LK_EXCLUSIVE);
415     if (file->refs == 1) {
416 	KLD_DPF(FILE, ("linker_file_unload: file is unloading, informing modules\n"));
417 	/*
418 	 * Temporarily bump file->refs to prevent recursive unloading
419 	 */
420 	++file->refs;
421 
422 	/*
423 	 * Inform any modules associated with this file.
424 	 */
425 	mod = TAILQ_FIRST(&file->modules);
426 	while (mod) {
427 	    /*
428 	     * Give the module a chance to veto the unload.  Note that the
429 	     * act of unloading the module may cause other modules in the
430 	     * same file list to be unloaded recursively.
431 	     */
432 	    if ((error = module_unload(mod)) != 0) {
433 		KLD_DPF(FILE, ("linker_file_unload: module %x vetoes unload\n",
434 			       mod));
435 		lockmgr(&lock, LK_RELEASE);
436 		file->refs--;
437 		goto out;
438 	    }
439 
440 	    /*
441 	     * Recursive relationships may prevent the release from
442 	     * immediately removing the module, or may remove other
443 	     * modules in the list.
444 	     */
445 	    next = module_getfnext(mod);
446 	    module_release(mod);
447 	    mod = next;
448 	}
449 
450 	/*
451 	 * Since we intend to destroy the file structure, we expect all
452 	 * modules to have been removed by now.
453 	 */
454 	for (mod = TAILQ_FIRST(&file->modules);
455 	     mod;
456 	     mod = module_getfnext(mod)
457 	) {
458 	    kprintf("linker_file_unload: module %p still has refs!\n", mod);
459 	}
460 	--file->refs;
461     }
462 
463     file->refs--;
464     if (file->refs > 0) {
465 	lockmgr(&lock, LK_RELEASE);
466 	goto out;
467     }
468 
469     /* Don't try to run SYSUNINITs if we are unloaded due to a link error */
470     if (file->flags & LINKER_FILE_LINKED) {
471 	linker_file_sysuninit(file);
472 	linker_file_unregister_sysctls(file);
473     }
474 
475     TAILQ_REMOVE(&linker_files, file, link);
476     lockmgr(&lock, LK_RELEASE);
477 
478     for (i = 0; i < file->ndeps; i++)
479 	linker_file_unload(file->deps[i]);
480     kfree(file->deps, M_LINKER);
481 
482     for (cp = STAILQ_FIRST(&file->common); cp;
483 	 cp = STAILQ_FIRST(&file->common)) {
484 	STAILQ_REMOVE(&file->common, cp, common_symbol, link);
485 	kfree(cp, M_LINKER);
486     }
487 
488     file->ops->unload(file);
489     kfree(file, M_LINKER);
490 
491 out:
492     return error;
493 }
494 
495 int
496 linker_file_add_dependancy(linker_file_t file, linker_file_t dep)
497 {
498     linker_file_t* newdeps;
499 
500     newdeps = kmalloc((file->ndeps + 1) * sizeof(linker_file_t*),
501 		     M_LINKER, M_WAITOK | M_ZERO);
502     if (newdeps == NULL)
503 	return ENOMEM;
504 
505     if (file->deps) {
506 	bcopy(file->deps, newdeps, file->ndeps * sizeof(linker_file_t*));
507 	kfree(file->deps, M_LINKER);
508     }
509     file->deps = newdeps;
510     file->deps[file->ndeps] = dep;
511     file->ndeps++;
512 
513     return 0;
514 }
515 
516 /*
517  * Locate a linker set and its contents.
518  * This is a helper function to avoid linker_if.h exposure elsewhere.
519  * Note: firstp and lastp are really void ***
520  */
521 int
522 linker_file_lookup_set(linker_file_t file, const char *name,
523                       void *firstp, void *lastp, int *countp)
524 {
525     return file->ops->lookup_set(file, name, firstp, lastp, countp);
526 }
527 
528 int
529 linker_file_lookup_symbol(linker_file_t file, const char* name, int deps, caddr_t *raddr)
530 {
531     c_linker_sym_t sym;
532     linker_symval_t symval;
533     linker_file_t lf;
534     size_t common_size = 0;
535     int i;
536 
537     KLD_DPF(SYM, ("linker_file_lookup_symbol: file=%x, name=%s, deps=%d\n",
538 		  file, name, deps));
539 
540     if (file->ops->lookup_symbol(file, name, &sym) == 0) {
541 	file->ops->symbol_values(file, sym, &symval);
542 
543 	/*
544 	 * XXX Assume a common symbol if its value is 0 and it has a non-zero
545 	 * size, otherwise it could be an absolute symbol with a value of 0.
546 	 */
547 	if (symval.value == 0 && symval.size != 0) {
548 	    /*
549 	     * For commons, first look them up in the dependancies and
550 	     * only allocate space if not found there.
551 	     */
552 	    common_size = symval.size;
553 	} else {
554 	    KLD_DPF(SYM, ("linker_file_lookup_symbol: symbol.value=%x\n", symval.value));
555 	    *raddr = symval.value;
556 	    return 0;
557 	}
558     }
559     if (deps) {
560 	for (i = 0; i < file->ndeps; i++) {
561 	    if (linker_file_lookup_symbol(file->deps[i], name, 0, raddr) == 0) {
562 		KLD_DPF(SYM, ("linker_file_lookup_symbol: deps value=%x\n", *raddr));
563 		return 0;
564 	    }
565 	}
566 
567 	/* If we have not found it in the dependencies, search globally */
568 	for (lf = TAILQ_FIRST(&linker_files); lf; lf = TAILQ_NEXT(lf, link)) {
569 	    /* But skip the current file if it's on the list */
570 	    if (lf == file)
571 		continue;
572 	    /* And skip the files we searched above */
573 	    for (i = 0; i < file->ndeps; i++)
574 		if (lf == file->deps[i])
575 		    break;
576 	    if (i < file->ndeps)
577 		continue;
578 	    if (linker_file_lookup_symbol(lf, name, 0, raddr) == 0) {
579 		KLD_DPF(SYM, ("linker_file_lookup_symbol: global value=%x\n", *raddr));
580 		return 0;
581 	    }
582 	}
583     }
584 
585     if (common_size > 0) {
586 	/*
587 	 * This is a common symbol which was not found in the
588 	 * dependancies.  We maintain a simple common symbol table in
589 	 * the file object.
590 	 */
591 	struct common_symbol* cp;
592 
593 	for (cp = STAILQ_FIRST(&file->common); cp;
594 	     cp = STAILQ_NEXT(cp, link))
595 	    if (!strcmp(cp->name, name)) {
596 		KLD_DPF(SYM, ("linker_file_lookup_symbol: old common value=%x\n", cp->address));
597 		*raddr = cp->address;
598 		return 0;
599 	    }
600 
601 	/*
602 	 * Round the symbol size up to align.
603 	 */
604 	common_size = (common_size + sizeof(int) - 1) & -sizeof(int);
605 	cp = kmalloc(sizeof(struct common_symbol)
606 		    + common_size
607 		    + strlen(name) + 1,
608 		    M_LINKER, M_WAITOK | M_ZERO);
609 	if (!cp) {
610 	    KLD_DPF(SYM, ("linker_file_lookup_symbol: nomem\n"));
611 	    return ENOMEM;
612 	}
613 
614 	cp->address = (caddr_t) (cp + 1);
615 	cp->name = cp->address + common_size;
616 	strcpy(cp->name, name);
617 	bzero(cp->address, common_size);
618 	STAILQ_INSERT_TAIL(&file->common, cp, link);
619 
620 	KLD_DPF(SYM, ("linker_file_lookup_symbol: new common value=%x\n", cp->address));
621 	*raddr = cp->address;
622 	return 0;
623     }
624 
625 #ifdef _KERNEL_VIRTUAL
626     *raddr = dlsym(RTLD_NEXT, name);
627     if (*raddr != NULL) {
628 	KLD_DPF(SYM, ("linker_file_lookup_symbol: found dlsym=%x\n", *raddr));
629 	return 0;
630     }
631 #endif
632 
633     KLD_DPF(SYM, ("linker_file_lookup_symbol: fail\n"));
634     return ENOENT;
635 }
636 
637 #ifdef DDB
638 /*
639  * DDB Helpers.  DDB has to look across multiple files with their own
640  * symbol tables and string tables.
641  *
642  * Note that we do not obey list locking protocols here.  We really don't
643  * need DDB to hang because somebody's got the lock held.  We'll take the
644  * chance that the files list is inconsistant instead.
645  */
646 
647 int
648 linker_ddb_lookup(const char *symstr, c_linker_sym_t *sym)
649 {
650     linker_file_t lf;
651 
652     for (lf = TAILQ_FIRST(&linker_files); lf; lf = TAILQ_NEXT(lf, link)) {
653 	if (lf->ops->lookup_symbol(lf, symstr, sym) == 0)
654 	    return 0;
655     }
656     return ENOENT;
657 }
658 
659 int
660 linker_ddb_search_symbol(caddr_t value, c_linker_sym_t *sym, long *diffp)
661 {
662     linker_file_t lf;
663     u_long off = (uintptr_t)value;
664     u_long diff, bestdiff;
665     c_linker_sym_t best;
666     c_linker_sym_t es;
667 
668     best = 0;
669     bestdiff = off;
670     for (lf = TAILQ_FIRST(&linker_files); lf; lf = TAILQ_NEXT(lf, link)) {
671 	if (lf->ops->search_symbol(lf, value, &es, &diff) != 0)
672 	    continue;
673 	if (es != 0 && diff < bestdiff) {
674 	    best = es;
675 	    bestdiff = diff;
676 	}
677 	if (bestdiff == 0)
678 	    break;
679     }
680     if (best) {
681 	*sym = best;
682 	*diffp = bestdiff;
683 	return 0;
684     } else {
685 	*sym = 0;
686 	*diffp = off;
687 	return ENOENT;
688     }
689 }
690 
691 int
692 linker_ddb_symbol_values(c_linker_sym_t sym, linker_symval_t *symval)
693 {
694     linker_file_t lf;
695 
696     for (lf = TAILQ_FIRST(&linker_files); lf; lf = TAILQ_NEXT(lf, link)) {
697 	if (lf->ops->symbol_values(lf, sym, symval) == 0)
698 	    return 0;
699     }
700     return ENOENT;
701 }
702 
703 #endif
704 
705 /*
706  * Syscalls.
707  */
708 
709 int
710 sys_kldload(struct kldload_args *uap)
711 {
712     struct thread *td = curthread;
713     char* filename = NULL, *modulename;
714     linker_file_t lf;
715     int error = 0;
716 
717     uap->sysmsg_result = -1;
718 
719     if (securelevel > 0 || kernel_mem_readonly)	/* redundant, but that's OK */
720 	return EPERM;
721 
722     if ((error = suser(td)) != 0)
723 	return error;
724 
725     filename = kmalloc(MAXPATHLEN, M_TEMP, M_WAITOK);
726     if ((error = copyinstr(uap->file, filename, MAXPATHLEN, NULL)) != 0)
727 	goto out;
728 
729     /* Can't load more than one module with the same name */
730     modulename = rindex(filename, '/');
731     if (modulename == NULL)
732 	modulename = filename;
733     else
734 	modulename++;
735     if (linker_find_file_by_name(modulename)) {
736 	error = EEXIST;
737 	goto out;
738     }
739 
740     if ((error = linker_load_file(filename, &lf)) != 0)
741 	goto out;
742 
743     lf->userrefs++;
744     uap->sysmsg_result = lf->id;
745 
746 out:
747     if (filename)
748 	kfree(filename, M_TEMP);
749     return error;
750 }
751 
752 int
753 sys_kldunload(struct kldunload_args *uap)
754 {
755     struct thread *td = curthread;
756     linker_file_t lf;
757     int error = 0;
758 
759     if (securelevel > 0 || kernel_mem_readonly)	/* redundant, but that's OK */
760 	return EPERM;
761 
762     if ((error = suser(td)) != 0)
763 	return error;
764 
765     lf = linker_find_file_by_id(uap->fileid);
766     if (lf) {
767 	KLD_DPF(FILE, ("kldunload: lf->userrefs=%d\n", lf->userrefs));
768 	if (lf->userrefs == 0) {
769 	    kprintf("linkerunload: attempt to unload file that was loaded by the kernel\n");
770 	    error = EBUSY;
771 	    goto out;
772 	}
773 	lf->userrefs--;
774 	error = linker_file_unload(lf);
775 	if (error)
776 	    lf->userrefs++;
777     } else
778 	error = ENOENT;
779 
780 out:
781     return error;
782 }
783 
784 int
785 sys_kldfind(struct kldfind_args *uap)
786 {
787     char *filename = NULL, *modulename;
788     linker_file_t lf;
789     int error = 0;
790 
791     uap->sysmsg_result = -1;
792 
793     filename = kmalloc(MAXPATHLEN, M_TEMP, M_WAITOK);
794     if ((error = copyinstr(uap->file, filename, MAXPATHLEN, NULL)) != 0)
795 	goto out;
796 
797     modulename = rindex(filename, '/');
798     if (modulename == NULL)
799 	modulename = filename;
800 
801     lf = linker_find_file_by_name(modulename);
802     if (lf)
803 	uap->sysmsg_result = lf->id;
804     else
805 	error = ENOENT;
806 
807 out:
808     if (filename)
809 	kfree(filename, M_TEMP);
810     return error;
811 }
812 
813 int
814 sys_kldnext(struct kldnext_args *uap)
815 {
816     linker_file_t lf;
817     int error = 0;
818 
819     if (uap->fileid == 0) {
820 	if (TAILQ_FIRST(&linker_files))
821 	    uap->sysmsg_result = TAILQ_FIRST(&linker_files)->id;
822 	else
823 	    uap->sysmsg_result = 0;
824 	return 0;
825     }
826 
827     lf = linker_find_file_by_id(uap->fileid);
828     if (lf) {
829 	if (TAILQ_NEXT(lf, link))
830 	    uap->sysmsg_result = TAILQ_NEXT(lf, link)->id;
831 	else
832 	    uap->sysmsg_result = 0;
833     } else
834 	error = ENOENT;
835 
836     return error;
837 }
838 
839 int
840 sys_kldstat(struct kldstat_args *uap)
841 {
842     linker_file_t lf;
843     int error = 0;
844     int version;
845     struct kld_file_stat* stat;
846     int namelen;
847 
848     lf = linker_find_file_by_id(uap->fileid);
849     if (!lf) {
850 	error = ENOENT;
851 	goto out;
852     }
853 
854     stat = uap->stat;
855 
856     /*
857      * Check the version of the user's structure.
858      */
859     if ((error = copyin(&stat->version, &version, sizeof(version))) != 0)
860 	goto out;
861     if (version != sizeof(struct kld_file_stat)) {
862 	error = EINVAL;
863 	goto out;
864     }
865 
866     namelen = strlen(lf->filename) + 1;
867     if (namelen > MAXPATHLEN)
868 	namelen = MAXPATHLEN;
869     if ((error = copyout(lf->filename, &stat->name[0], namelen)) != 0)
870 	goto out;
871     if ((error = copyout(&lf->refs, &stat->refs, sizeof(int))) != 0)
872 	goto out;
873     if ((error = copyout(&lf->id, &stat->id, sizeof(int))) != 0)
874 	goto out;
875     if ((error = copyout(&lf->address, &stat->address, sizeof(caddr_t))) != 0)
876 	goto out;
877     if ((error = copyout(&lf->size, &stat->size, sizeof(size_t))) != 0)
878 	goto out;
879 
880     uap->sysmsg_result = 0;
881 
882 out:
883     return error;
884 }
885 
886 int
887 sys_kldfirstmod(struct kldfirstmod_args *uap)
888 {
889     linker_file_t lf;
890     int error = 0;
891 
892     lf = linker_find_file_by_id(uap->fileid);
893     if (lf) {
894 	if (TAILQ_FIRST(&lf->modules))
895 	    uap->sysmsg_result = module_getid(TAILQ_FIRST(&lf->modules));
896 	else
897 	    uap->sysmsg_result = 0;
898     } else
899 	error = ENOENT;
900 
901     return error;
902 }
903 
904 int
905 sys_kldsym(struct kldsym_args *uap)
906 {
907     char *symstr = NULL;
908     c_linker_sym_t sym;
909     linker_symval_t symval;
910     linker_file_t lf;
911     struct kld_sym_lookup lookup;
912     int error = 0;
913 
914     if ((error = copyin(uap->data, &lookup, sizeof(lookup))) != 0)
915 	goto out;
916     if (lookup.version != sizeof(lookup) || uap->cmd != KLDSYM_LOOKUP) {
917 	error = EINVAL;
918 	goto out;
919     }
920 
921     symstr = kmalloc(MAXPATHLEN, M_TEMP, M_WAITOK);
922     if ((error = copyinstr(lookup.symname, symstr, MAXPATHLEN, NULL)) != 0)
923 	goto out;
924 
925     if (uap->fileid != 0) {
926 	lf = linker_find_file_by_id(uap->fileid);
927 	if (lf == NULL) {
928 	    error = ENOENT;
929 	    goto out;
930 	}
931 	if (lf->ops->lookup_symbol(lf, symstr, &sym) == 0 &&
932 	    lf->ops->symbol_values(lf, sym, &symval) == 0) {
933 	    lookup.symvalue = (uintptr_t)symval.value;
934 	    lookup.symsize = symval.size;
935 	    error = copyout(&lookup, uap->data, sizeof(lookup));
936 	} else
937 	    error = ENOENT;
938     } else {
939 	for (lf = TAILQ_FIRST(&linker_files); lf; lf = TAILQ_NEXT(lf, link)) {
940 	    if (lf->ops->lookup_symbol(lf, symstr, &sym) == 0 &&
941 		lf->ops->symbol_values(lf, sym, &symval) == 0) {
942 		lookup.symvalue = (uintptr_t)symval.value;
943 		lookup.symsize = symval.size;
944 		error = copyout(&lookup, uap->data, sizeof(lookup));
945 		break;
946 	    }
947 	}
948 	if (!lf)
949 	    error = ENOENT;
950     }
951 out:
952     if (symstr)
953 	kfree(symstr, M_TEMP);
954     return error;
955 }
956 
957 /*
958  * Look for module metadata in the static kernel
959  */
960 struct mod_metadata *
961 find_mod_metadata(const char *modname)
962 {
963     int len;
964     struct mod_metadata **mdp;
965     struct mod_metadata *mdt;
966 
967     /*
968      * Strip path prefixes and any dot extension.  MDT_MODULE names
969      * are just the module name without a path or ".ko".
970      */
971     for (len = strlen(modname) - 1; len >= 0; --len) {
972 	if (modname[len] == '/')
973 	    break;
974     }
975     modname += len + 1;
976     for (len = 0; modname[len] && modname[len] != '.'; ++len)
977 	;
978 
979     /*
980      * Look for the module declaration
981      */
982     SET_FOREACH(mdp, modmetadata_set) {
983 	mdt = *mdp;
984 	if (mdt->md_type != MDT_MODULE)
985 	    continue;
986 	if (strlen(mdt->md_cval) == len &&
987 	    strncmp(mdt->md_cval, modname, len) == 0) {
988 	    return(mdt);
989 	}
990     }
991     return(NULL);
992 }
993 
994 /*
995  * Preloaded module support
996  */
997 static void
998 linker_preload(void* arg)
999 {
1000     caddr_t		modptr;
1001     char		*modname;
1002     char		*modtype;
1003     linker_file_t	lf;
1004     linker_class_t	lc;
1005     int			error;
1006     struct sysinit	**sipp;
1007     const moduledata_t	*moddata;
1008     struct sysinit	**si_start, **si_stop;
1009 
1010     modptr = NULL;
1011     while ((modptr = preload_search_next_name(modptr)) != NULL) {
1012 	modname = (char *)preload_search_info(modptr, MODINFO_NAME);
1013 	modtype = (char *)preload_search_info(modptr, MODINFO_TYPE);
1014 	if (modname == NULL) {
1015 	    kprintf("Preloaded module at %p does not have a name!\n", modptr);
1016 	    continue;
1017 	}
1018 	if (modtype == NULL) {
1019 	    kprintf("Preloaded module at %p does not have a type!\n", modptr);
1020 	    continue;
1021 	}
1022 
1023 	/*
1024 	 * This is a hack at the moment, but what's in FreeBSD-5 is even
1025 	 * worse so I'd rather the hack.
1026 	 */
1027 	kprintf("Preloaded %s \"%s\" at %p", modtype, modname, modptr);
1028 	if (find_mod_metadata(modname)) {
1029 	    kprintf(" (ignored, already in static kernel)\n");
1030 	    continue;
1031 	}
1032 	kprintf(".\n");
1033 
1034 	lf = linker_find_file_by_name(modname);
1035 	if (lf) {
1036 	    lf->refs++;
1037 	    lf->userrefs++;
1038 	    continue;
1039 	}
1040 	lf = NULL;
1041 	for (lc = TAILQ_FIRST(&classes); lc; lc = TAILQ_NEXT(lc, link)) {
1042 	    error = lc->ops->load_file(modname, &lf);
1043 	    if (error) {
1044 		lf = NULL;
1045 		break;
1046 	    }
1047 	}
1048 	if (lf) {
1049 	    lf->userrefs++;
1050 
1051 	    if (linker_file_lookup_set(lf, "sysinit_set", &si_start, &si_stop, NULL) == 0) {
1052 		/* HACK ALERT!
1053 		 * This is to set the sysinit moduledata so that the module
1054 		 * can attach itself to the correct containing file.
1055 		 * The sysinit could be run at *any* time.
1056 		 */
1057 		for (sipp = si_start; sipp < si_stop; sipp++) {
1058 		    if ((*sipp)->func == module_register_init) {
1059 			moddata = (*sipp)->udata;
1060 			error = module_register(moddata, lf);
1061 			if (error)
1062 			    kprintf("Preloaded %s \"%s\" failed to register: %d\n",
1063 				modtype, modname, error);
1064 		    }
1065 		}
1066 		sysinit_add(si_start, si_stop);
1067 	    }
1068 	    linker_file_register_sysctls(lf);
1069 	}
1070     }
1071 }
1072 
1073 SYSINIT(preload, SI_BOOT2_KLD, SI_ORDER_MIDDLE, linker_preload, 0);
1074 
1075 /*
1076  * Search for a not-loaded module by name.
1077  *
1078  * Modules may be found in the following locations:
1079  *
1080  * - preloaded (result is just the module name)
1081  * - on disk (result is full path to module)
1082  *
1083  * If the module name is qualified in any way (contains path, etc.)
1084  * the we simply return a copy of it.
1085  *
1086  * The search path can be manipulated via sysctl.  Note that we use the ';'
1087  * character as a separator to be consistent with the bootloader.
1088  */
1089 
1090 static char linker_path[MAXPATHLEN] = "/;/boot;/modules";
1091 
1092 SYSCTL_STRING(_kern, OID_AUTO, module_path, CTLFLAG_RW, linker_path,
1093 	      sizeof(linker_path), "module load search path");
1094 TUNABLE_STR("module_path", linker_path, sizeof(linker_path));
1095 
1096 static char *
1097 linker_strdup(const char *str)
1098 {
1099     char	*result;
1100 
1101     if ((result = kmalloc((strlen(str) + 1), M_LINKER, M_WAITOK)) != NULL)
1102 	strcpy(result, str);
1103     return(result);
1104 }
1105 
1106 char *
1107 linker_search_path(const char *name)
1108 {
1109     struct nlookupdata	nd;
1110     char		*cp, *ep, *result;
1111     size_t		name_len, prefix_len;
1112     int			sep;
1113     int			error;
1114     enum vtype		type;
1115 
1116     /* qualified at all? */
1117     if (index(name, '/'))
1118 	return(linker_strdup(name));
1119 
1120     /* traverse the linker path */
1121     cp = linker_path;
1122     name_len = strlen(name);
1123     for (;;) {
1124 
1125 	/* find the end of this component */
1126 	for (ep = cp; (*ep != 0) && (*ep != ';'); ep++)
1127 	    ;
1128 	prefix_len = ep - cp;
1129 	/* if this component doesn't end with a slash, add one */
1130 	if (ep == cp || *(ep - 1) != '/')
1131 	    sep = 1;
1132 	else
1133 	    sep = 0;
1134 
1135 	/*
1136 	 * +2 : possible separator, plus terminator.
1137 	 */
1138 	result = kmalloc(prefix_len + name_len + 2, M_LINKER, M_WAITOK);
1139 
1140 	strncpy(result, cp, prefix_len);
1141 	if (sep)
1142 	    result[prefix_len++] = '/';
1143 	strcpy(result + prefix_len, name);
1144 
1145 	/*
1146 	 * Attempt to open the file, and return the path if we succeed and it's
1147 	 * a regular file.
1148 	 */
1149 	error = nlookup_init(&nd, result, UIO_SYSSPACE, NLC_FOLLOW|NLC_LOCKVP);
1150 	if (error == 0)
1151 	    error = vn_open(&nd, NULL, FREAD, 0);
1152 	if (error == 0) {
1153 	    type = nd.nl_open_vp->v_type;
1154 	    if (type == VREG) {
1155 		nlookup_done(&nd);
1156 		return (result);
1157 	    }
1158 	}
1159 	nlookup_done(&nd);
1160 	kfree(result, M_LINKER);
1161 
1162 	if (*ep == 0)
1163 	    break;
1164 	cp = ep + 1;
1165     }
1166     return(NULL);
1167 }
1168