xref: /freebsd/sys/kern/kern_conf.c (revision 8e6b01171e30297084bb0b4457c4183c2746aacc)
1 /*-
2  * Parts Copyright (c) 1995 Terrence R. Lambert
3  * Copyright (c) 1995 Julian R. Elischer
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *      This product includes software developed by Terrence R. Lambert.
17  * 4. The name Terrence R. Lambert may not be used to endorse or promote
18  *    products derived from this software without specific prior written
19  *    permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Julian R. Elischer ``AS IS'' AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE TERRENCE R. LAMBERT BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * $Id: kern_conf.c,v 1.2 1995/10/02 10:15:40 julian Exp $
34  */
35 
36 #include <sys/param.h>
37 #include <sys/types.h>
38 #include <sys/systm.h>
39 #include <sys/conf.h>
40 extern d_open_t lkmenodev;
41 
42 /*
43  * (re)place an entry in the bdevsw or cdevsw table
44  * return the slot used in major(*descrip)
45  */
46 #define ADDENTRY(TTYPE,NXXXDEV) \
47 int TTYPE##_add(dev_t *descrip,						\
48 		struct TTYPE *newentry,					\
49 		struct TTYPE *oldentry)					\
50 {									\
51 	int i ;								\
52 	if ( (int)*descrip == -1) {	/* auto (0 is valid) */		\
53 		/*							\
54 		 * Search the table looking for a slot...		\
55 		 */							\
56 		for (i = 0; i < NXXXDEV; i++)				\
57 			if (TTYPE[i].d_open == lkmenodev)		\
58 				break;		/* found it! */		\
59 		/* out of allocable slots? */				\
60 		if (i == NXXXDEV) {					\
61 			return ENFILE;					\
62 		}							\
63 	} else {				/* assign */		\
64 		i = major(descrip);					\
65 		if (i < 0 || i >= NXXXDEV) {				\
66 			return EINVAL;					\
67 		}							\
68 	}								\
69 									\
70 	/* maybe save old */						\
71         if (oldentry) {							\
72 		bcopy(&TTYPE[i], oldentry, sizeof(struct TTYPE));	\
73 	}								\
74 	/* replace with new */						\
75 	bcopy(newentry, &TTYPE[i], sizeof(struct TTYPE));		\
76 									\
77 	/* done! */							\
78 	*descrip = makedev(i,0);					\
79 	return 0;							\
80 } \
81 
82 ADDENTRY(bdevsw, nblkdev)
83 ADDENTRY(cdevsw, nchrdev)
84