xref: /freebsd/sys/kern/kern_conf.c (revision 1dfcbb0ce387c0935b3ad247c673aed061c4b9f3)
126453f35SJulian Elischer /*-
226453f35SJulian Elischer  * Parts Copyright (c) 1995 Terrence R. Lambert
326453f35SJulian Elischer  * Copyright (c) 1995 Julian R. Elischer
426453f35SJulian Elischer  * All rights reserved.
526453f35SJulian Elischer  *
626453f35SJulian Elischer  * Redistribution and use in source and binary forms, with or without
726453f35SJulian Elischer  * modification, are permitted provided that the following conditions
826453f35SJulian Elischer  * are met:
926453f35SJulian Elischer  * 1. Redistributions of source code must retain the above copyright
1026453f35SJulian Elischer  *    notice, this list of conditions and the following disclaimer.
1126453f35SJulian Elischer  * 2. Redistributions in binary form must reproduce the above copyright
1226453f35SJulian Elischer  *    notice, this list of conditions and the following disclaimer in the
1326453f35SJulian Elischer  *    documentation and/or other materials provided with the distribution.
1426453f35SJulian Elischer  * 3. All advertising materials mentioning features or use of this software
1526453f35SJulian Elischer  *    must display the following acknowledgement:
1626453f35SJulian Elischer  *      This product includes software developed by Terrence R. Lambert.
1726453f35SJulian Elischer  * 4. The name Terrence R. Lambert may not be used to endorse or promote
1826453f35SJulian Elischer  *    products derived from this software without specific prior written
1926453f35SJulian Elischer  *    permission.
2026453f35SJulian Elischer  *
2126453f35SJulian Elischer  * THIS SOFTWARE IS PROVIDED BY Julian R. Elischer ``AS IS'' AND ANY
2226453f35SJulian Elischer  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2326453f35SJulian Elischer  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2426453f35SJulian Elischer  * ARE DISCLAIMED.  IN NO EVENT SHALL THE TERRENCE R. LAMBERT BE LIABLE
2526453f35SJulian Elischer  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2626453f35SJulian Elischer  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2726453f35SJulian Elischer  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2826453f35SJulian Elischer  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2926453f35SJulian Elischer  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3026453f35SJulian Elischer  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3126453f35SJulian Elischer  * SUCH DAMAGE.
3226453f35SJulian Elischer  *
331dfcbb0cSJulian Elischer  * $Id: kern_conf.c,v 1.7 1995/12/13 15:12:48 julian Exp $
3426453f35SJulian Elischer  */
3526453f35SJulian Elischer 
3626453f35SJulian Elischer #include <sys/param.h>
37f8a760b3SJulian Elischer #include <sys/types.h>
38f8a760b3SJulian Elischer #include <sys/systm.h>
3926453f35SJulian Elischer #include <sys/conf.h>
401dfcbb0cSJulian Elischer #include <sys/vnode.h>
411dfcbb0cSJulian Elischer 
421dfcbb0cSJulian Elischer #define NUMCDEV 96
431dfcbb0cSJulian Elischer #define NUMBDEV 32
441dfcbb0cSJulian Elischer 
451dfcbb0cSJulian Elischer struct bdevsw 	*bdevsw[NUMBDEV];
461dfcbb0cSJulian Elischer int	nblkdev = NUMBDEV;
471dfcbb0cSJulian Elischer struct cdevsw 	*cdevsw[NUMCDEV];
481dfcbb0cSJulian Elischer int	nchrdev = NUMCDEV;
491dfcbb0cSJulian Elischer 
501dfcbb0cSJulian Elischer 
511dfcbb0cSJulian Elischer 
521dfcbb0cSJulian Elischer /*
531dfcbb0cSJulian Elischer  * Routine to determine if a device is a disk.
541dfcbb0cSJulian Elischer  *
551dfcbb0cSJulian Elischer  * KLUDGE XXX add flags to cdevsw entries for disks XXX
561dfcbb0cSJulian Elischer  * A minimal stub routine can always return 0.
571dfcbb0cSJulian Elischer  */
581dfcbb0cSJulian Elischer int
591dfcbb0cSJulian Elischer isdisk(dev, type)
601dfcbb0cSJulian Elischer 	dev_t dev;
611dfcbb0cSJulian Elischer 	int type;
621dfcbb0cSJulian Elischer {
631dfcbb0cSJulian Elischer 
641dfcbb0cSJulian Elischer 	switch (major(dev)) {
651dfcbb0cSJulian Elischer 	case 15:		/* VBLK: vn, VCHR: cd */
661dfcbb0cSJulian Elischer 		return (1);
671dfcbb0cSJulian Elischer 	case 0:			/* wd */
681dfcbb0cSJulian Elischer 	case 2:			/* fd */
691dfcbb0cSJulian Elischer 	case 4:			/* sd */
701dfcbb0cSJulian Elischer 	case 6:			/* cd */
711dfcbb0cSJulian Elischer 	case 7:			/* mcd */
721dfcbb0cSJulian Elischer 	case 16:		/* scd */
731dfcbb0cSJulian Elischer 	case 17:		/* matcd */
741dfcbb0cSJulian Elischer 	case 18:		/* ata */
751dfcbb0cSJulian Elischer 	case 19:		/* wcd */
761dfcbb0cSJulian Elischer 	case 20:		/* od */
771dfcbb0cSJulian Elischer 		if (type == VBLK)
781dfcbb0cSJulian Elischer 			return (1);
791dfcbb0cSJulian Elischer 		return (0);
801dfcbb0cSJulian Elischer 	case 3:			/* wd */
811dfcbb0cSJulian Elischer 	case 9:			/* fd */
821dfcbb0cSJulian Elischer 	case 13:		/* sd */
831dfcbb0cSJulian Elischer 	case 29:		/* mcd */
841dfcbb0cSJulian Elischer 	case 43:		/* vn */
851dfcbb0cSJulian Elischer 	case 45:		/* scd */
861dfcbb0cSJulian Elischer 	case 46:		/* matcd */
871dfcbb0cSJulian Elischer 	case 69:		/* wcd */
881dfcbb0cSJulian Elischer 	case 70:		/* od */
891dfcbb0cSJulian Elischer 		if (type == VCHR)
901dfcbb0cSJulian Elischer 			return (1);
911dfcbb0cSJulian Elischer 		/* fall through */
921dfcbb0cSJulian Elischer 	default:
931dfcbb0cSJulian Elischer 		return (0);
941dfcbb0cSJulian Elischer 	}
951dfcbb0cSJulian Elischer 	/* NOTREACHED */
961dfcbb0cSJulian Elischer }
971dfcbb0cSJulian Elischer 
981dfcbb0cSJulian Elischer 
991dfcbb0cSJulian Elischer /*
1001dfcbb0cSJulian Elischer  * Routine to convert from character to block device number.
1011dfcbb0cSJulian Elischer  *
1021dfcbb0cSJulian Elischer  * A minimal stub routine can always return NODEV.
1031dfcbb0cSJulian Elischer  */
1041dfcbb0cSJulian Elischer dev_t
1051dfcbb0cSJulian Elischer chrtoblk(dev_t dev)
1061dfcbb0cSJulian Elischer {
1071dfcbb0cSJulian Elischer 	int blkmaj;
1081dfcbb0cSJulian Elischer 	struct bdevsw *bd;
1091dfcbb0cSJulian Elischer 	struct cdevsw *cd;
1101dfcbb0cSJulian Elischer 
1111dfcbb0cSJulian Elischer 	if(cd = cdevsw[major(dev)]) {
1121dfcbb0cSJulian Elischer           if ( (bd = cd->d_bdev) )
1131dfcbb0cSJulian Elischer 	    return(makedev(bd->d_maj,minor(dev)));
1141dfcbb0cSJulian Elischer 	}
1151dfcbb0cSJulian Elischer 	return(NODEV);
1161dfcbb0cSJulian Elischer }
11726453f35SJulian Elischer 
11826453f35SJulian Elischer /*
11926453f35SJulian Elischer  * (re)place an entry in the bdevsw or cdevsw table
120f8a760b3SJulian Elischer  * return the slot used in major(*descrip)
12126453f35SJulian Elischer  */
12226453f35SJulian Elischer #define ADDENTRY(TTYPE,NXXXDEV) \
12326453f35SJulian Elischer int TTYPE##_add(dev_t *descrip,						\
1244c1a35b2SJulian Elischer 		struct TTYPE *newentry,					\
1256ba9ebceSJulian Elischer 		struct TTYPE **oldentry)				\
12626453f35SJulian Elischer {									\
127f8a760b3SJulian Elischer 	int i ;								\
128f8a760b3SJulian Elischer 	if ( (int)*descrip == -1) {	/* auto (0 is valid) */		\
12926453f35SJulian Elischer 		/*							\
13026453f35SJulian Elischer 		 * Search the table looking for a slot...		\
13126453f35SJulian Elischer 		 */							\
13226453f35SJulian Elischer 		for (i = 0; i < NXXXDEV; i++)				\
1336ba9ebceSJulian Elischer 			if (TTYPE[i] == NULL)				\
134adb2dc29SJulian Elischer 				break;		/* found one! */	\
13526453f35SJulian Elischer 		/* out of allocable slots? */				\
13626453f35SJulian Elischer 		if (i == NXXXDEV) {					\
13726453f35SJulian Elischer 			return ENFILE;					\
13826453f35SJulian Elischer 		}							\
13926453f35SJulian Elischer 	} else {				/* assign */		\
140de1676f9SJulian Elischer 		i = major(*descrip);					\
14126453f35SJulian Elischer 		if (i < 0 || i >= NXXXDEV) {				\
14226453f35SJulian Elischer 			return EINVAL;					\
14326453f35SJulian Elischer 		}							\
14426453f35SJulian Elischer 	}								\
14526453f35SJulian Elischer 									\
1464c1a35b2SJulian Elischer 	/* maybe save old */						\
14726453f35SJulian Elischer         if (oldentry) {							\
1486ba9ebceSJulian Elischer 		*oldentry = TTYPE[i];					\
14926453f35SJulian Elischer 	}								\
15087f6c662SJulian Elischer 	newentry->d_maj = i;						\
15126453f35SJulian Elischer 	/* replace with new */						\
1526ba9ebceSJulian Elischer 	TTYPE[i] = newentry;						\
15326453f35SJulian Elischer 									\
1546ba9ebceSJulian Elischer 	/* done!  let them know where we put it */			\
15526453f35SJulian Elischer 	*descrip = makedev(i,0);					\
156f8a760b3SJulian Elischer 	return 0;							\
15726453f35SJulian Elischer } \
15826453f35SJulian Elischer 
1594c1a35b2SJulian Elischer ADDENTRY(bdevsw, nblkdev)
1604c1a35b2SJulian Elischer ADDENTRY(cdevsw, nchrdev)
161