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