kern_conf.c revision 11170
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>
40extern 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) \
47int 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
82ADDENTRY(bdevsw, nblkdev)
83ADDENTRY(cdevsw, nchrdev)
84