Home | History | Annotate | Download | only in os
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 /*
     28  * modctl system call for loadable module support.
     29  */
     30 
     31 #include <sys/param.h>
     32 #include <sys/user.h>
     33 #include <sys/systm.h>
     34 #include <sys/exec.h>
     35 #include <sys/file.h>
     36 #include <sys/stat.h>
     37 #include <sys/conf.h>
     38 #include <sys/time.h>
     39 #include <sys/reboot.h>
     40 #include <sys/fs/ufs_fsdir.h>
     41 #include <sys/kmem.h>
     42 #include <sys/sysconf.h>
     43 #include <sys/cmn_err.h>
     44 #include <sys/ddi.h>
     45 #include <sys/sunddi.h>
     46 #include <sys/sunndi.h>
     47 #include <sys/ndi_impldefs.h>
     48 #include <sys/ddi_impldefs.h>
     49 #include <sys/ddi_implfuncs.h>
     50 #include <sys/bootconf.h>
     51 #include <sys/dc_ki.h>
     52 #include <sys/cladm.h>
     53 #include <sys/dtrace.h>
     54 #include <sys/kdi.h>
     55 
     56 #include <sys/devpolicy.h>
     57 #include <sys/modctl.h>
     58 #include <sys/kobj.h>
     59 #include <sys/devops.h>
     60 #include <sys/autoconf.h>
     61 #include <sys/hwconf.h>
     62 #include <sys/callb.h>
     63 #include <sys/debug.h>
     64 #include <sys/cpuvar.h>
     65 #include <sys/sysmacros.h>
     66 #include <sys/sysevent.h>
     67 #include <sys/sysevent_impl.h>
     68 #include <sys/instance.h>
     69 #include <sys/modhash.h>
     70 #include <sys/modhash_impl.h>
     71 #include <sys/dacf_impl.h>
     72 #include <sys/vfs.h>
     73 #include <sys/pathname.h>
     74 #include <sys/console.h>
     75 #include <sys/policy.h>
     76 #include <ipp/ipp_impl.h>
     77 #include <sys/fs/dv_node.h>
     78 #include <sys/strsubr.h>
     79 #include <sys/fs/sdev_impl.h>
     80 
     81 static int		mod_circdep(struct modctl *);
     82 static int		modinfo(modid_t, struct modinfo *);
     83 
     84 static void		mod_uninstall_all(void);
     85 static int		mod_getinfo(struct modctl *, struct modinfo *);
     86 static struct modctl	*allocate_modp(const char *, const char *);
     87 
     88 static int		mod_load(struct modctl *, int);
     89 static void		mod_unload(struct modctl *);
     90 static int		modinstall(struct modctl *);
     91 static int		moduninstall(struct modctl *);
     92 
     93 static struct modctl	*mod_hold_by_name_common(struct modctl *, const char *);
     94 static struct modctl	*mod_hold_next_by_id(modid_t);
     95 static struct modctl	*mod_hold_loaded_mod(struct modctl *, char *, int *);
     96 static struct modctl	*mod_hold_installed_mod(char *, int, int, int *);
     97 
     98 static void		mod_release(struct modctl *);
     99 static void		mod_make_requisite(struct modctl *, struct modctl *);
    100 static int		mod_install_requisites(struct modctl *);
    101 static void		check_esc_sequences(char *, char *);
    102 static struct modctl	*mod_hold_by_name_requisite(struct modctl *, char *);
    103 
    104 /*
    105  * module loading thread control structure. Calls to kobj_load_module()() are
    106  * handled off to a separate thead using this structure.
    107  */
    108 struct loadmt {
    109 	ksema_t		sema;
    110 	struct modctl	*mp;
    111 	int		usepath;
    112 	kthread_t	*owner;
    113 	int		retval;
    114 };
    115 
    116 static void	modload_thread(struct loadmt *);
    117 
    118 kcondvar_t	mod_cv;
    119 kcondvar_t	mod_uninstall_cv;	/* Communication between swapper */
    120 					/* and the uninstall daemon. */
    121 kmutex_t	mod_lock;		/* protects &modules insert linkage, */
    122 					/* mod_busy, mod_want, and mod_ref. */
    123 					/* blocking operations while holding */
    124 					/* mod_lock should be avoided */
    125 kmutex_t	mod_uninstall_lock;	/* protects mod_uninstall_cv */
    126 kthread_id_t	mod_aul_thread;
    127 
    128 int		modunload_wait;
    129 kmutex_t	modunload_wait_mutex;
    130 kcondvar_t	modunload_wait_cv;
    131 int		modunload_active_count;
    132 int		modunload_disable_count;
    133 
    134 int	isminiroot;		/* set if running as miniroot */
    135 int	modrootloaded;		/* set after root driver and fs are loaded */
    136 int	moddebug = 0x0;		/* debug flags for module writers */
    137 int	swaploaded;		/* set after swap driver and fs are loaded */
    138 int	bop_io_quiesced = 0;	/* set when BOP I/O can no longer be used */
    139 int	last_module_id;
    140 clock_t	mod_uninstall_interval = 0;
    141 int	ddi_modclose_unload = 1;	/* 0 -> just decrement reference */
    142 
    143 struct devnames *devnamesp;
    144 struct devnames orphanlist;
    145 
    146 krwlock_t	devinfo_tree_lock;	/* obsolete, to be removed */
    147 
    148 #define	MAJBINDFILE "/etc/name_to_major"
    149 #define	SYSBINDFILE "/etc/name_to_sysnum"
    150 
    151 static char	majbind[] = MAJBINDFILE;
    152 static char	sysbind[] = SYSBINDFILE;
    153 static uint_t	mod_autounload_key;	/* for module autounload detection */
    154 
    155 extern int obpdebug;
    156 
    157 #define	DEBUGGER_PRESENT	((boothowto & RB_DEBUG) || (obpdebug != 0))
    158 
    159 static int minorperm_loaded = 0;
    160 
    161 void
    162 mod_setup(void)
    163 {
    164 	struct sysent *callp;
    165 	int callnum, exectype;
    166 	int	num_devs;
    167 	int	i;
    168 
    169 	/*
    170 	 * Initialize the list of loaded driver dev_ops.
    171 	 * XXX - This must be done before reading the system file so that
    172 	 * forceloads of drivers will work.
    173 	 */
    174 	num_devs = read_binding_file(majbind, mb_hashtab, make_mbind);
    175 	/*
    176 	 * Since read_binding_file is common code, it doesn't enforce that all
    177 	 * of the binding file entries have major numbers <= MAXMAJ32.	Thus,
    178 	 * ensure that we don't allocate some massive amount of space due to a
    179 	 * bad entry.  We can't have major numbers bigger than MAXMAJ32
    180 	 * until file system support for larger major numbers exists.
    181 	 */
    182 
    183 	/*
    184 	 * Leave space for expansion, but not more than L_MAXMAJ32
    185 	 */
    186 	devcnt = MIN(num_devs + 30, L_MAXMAJ32);
    187 	devopsp = kmem_alloc(devcnt * sizeof (struct dev_ops *), KM_SLEEP);
    188 	for (i = 0; i < devcnt; i++)
    189 		devopsp[i] = &mod_nodev_ops;
    190 
    191 	init_devnamesp(devcnt);
    192 
    193 	/*
    194 	 * Sync up with the work that the stand-alone linker has already done.
    195 	 */
    196 	(void) kobj_sync();
    197 
    198 	if (boothowto & RB_DEBUG)
    199 		kdi_dvec_modavail();
    200 
    201 	make_aliases(mb_hashtab);
    202 
    203 	/*
    204 	 * Initialize streams device implementation structures.
    205 	 */
    206 	devimpl = kmem_zalloc(devcnt * sizeof (cdevsw_impl_t), KM_SLEEP);
    207 
    208 	/*
    209 	 * If the cl_bootstrap module is present,
    210 	 * we should be configured as a cluster. Loading this module
    211 	 * will set "cluster_bootflags" to non-zero.
    212 	 */
    213 	(void) modload("misc", "cl_bootstrap");
    214 
    215 	(void) read_binding_file(sysbind, sb_hashtab, make_mbind);
    216 	init_syscallnames(NSYSCALL);
    217 
    218 	/*
    219 	 * Start up dynamic autoconfiguration framework (dacf).
    220 	 */
    221 	mod_hash_init();
    222 	dacf_init();
    223 
    224 	/*
    225 	 * Start up IP policy framework (ipp).
    226 	 */
    227 	ipp_init();
    228 
    229 	/*
    230 	 * Allocate loadable native system call locks.
    231 	 */
    232 	for (callnum = 0, callp = sysent; callnum < NSYSCALL;
    233 	    callnum++, callp++) {
    234 		if (LOADABLE_SYSCALL(callp)) {
    235 			if (mod_getsysname(callnum) != NULL) {
    236 				callp->sy_lock =
    237 				    kobj_zalloc(sizeof (krwlock_t), KM_SLEEP);
    238 				rw_init(callp->sy_lock, NULL, RW_DEFAULT, NULL);
    239 			} else {
    240 				callp->sy_flags &= ~SE_LOADABLE;
    241 				callp->sy_callc = nosys;
    242 			}
    243 #ifdef DEBUG
    244 		} else {
    245 			/*
    246 			 * Do some sanity checks on the sysent table
    247 			 */
    248 			switch (callp->sy_flags & SE_RVAL_MASK) {
    249 			case SE_32RVAL1:
    250 				/* only r_val1 returned */
    251 			case SE_32RVAL1 | SE_32RVAL2:
    252 				/* r_val1 and r_val2 returned */
    253 			case SE_64RVAL:
    254 				/* 64-bit rval returned */
    255 				break;
    256 			default:
    257 				cmn_err(CE_WARN, "sysent[%d]: bad flags %x",
    258 				    callnum, callp->sy_flags);
    259 			}
    260 #endif
    261 		}
    262 	}
    263 
    264 #ifdef _SYSCALL32_IMPL
    265 	/*
    266 	 * Allocate loadable system call locks for 32-bit compat syscalls
    267 	 */
    268 	for (callnum = 0, callp = sysent32; callnum < NSYSCALL;
    269 	    callnum++, callp++) {
    270 		if (LOADABLE_SYSCALL(callp)) {
    271 			if (mod_getsysname(callnum) != NULL) {
    272 				callp->sy_lock =
    273 				    kobj_zalloc(sizeof (krwlock_t), KM_SLEEP);
    274 				rw_init(callp->sy_lock, NULL, RW_DEFAULT, NULL);
    275 			} else {
    276 				callp->sy_flags &= ~SE_LOADABLE;
    277 				callp->sy_callc = nosys;
    278 			}
    279 #ifdef DEBUG
    280 		} else {
    281 			/*
    282 			 * Do some sanity checks on the sysent table
    283 			 */
    284 			switch (callp->sy_flags & SE_RVAL_MASK) {
    285 			case SE_32RVAL1:
    286 				/* only r_val1 returned */
    287 			case SE_32RVAL1 | SE_32RVAL2:
    288 				/* r_val1 and r_val2 returned */
    289 			case SE_64RVAL:
    290 				/* 64-bit rval returned */
    291 				break;
    292 			default:
    293 				cmn_err(CE_WARN, "sysent32[%d]: bad flags %x",
    294 				    callnum, callp->sy_flags);
    295 				goto skip;
    296 			}
    297 
    298 			/*
    299 			 * Cross-check the native and compatibility tables.
    300 			 */
    301 			if (callp->sy_callc == nosys ||
    302 			    sysent[callnum].sy_callc == nosys)
    303 				continue;
    304 			/*
    305 			 * If only one or the other slot is loadable, then
    306 			 * there's an error -- they should match!
    307 			 */
    308 			if ((callp->sy_callc == loadable_syscall) ^
    309 			    (sysent[callnum].sy_callc == loadable_syscall)) {
    310 				cmn_err(CE_WARN, "sysent[%d] loadable?",
    311 				    callnum);
    312 			}
    313 			/*
    314 			 * This is more of a heuristic test -- if the
    315 			 * system call returns two values in the 32-bit
    316 			 * world, it should probably return two 32-bit
    317 			 * values in the 64-bit world too.
    318 			 */
    319 			if (((callp->sy_flags & SE_32RVAL2) == 0) ^
    320 			    ((sysent[callnum].sy_flags & SE_32RVAL2) == 0)) {
    321 				cmn_err(CE_WARN, "sysent[%d] rval2 mismatch!",
    322 				    callnum);
    323 			}
    324 skip:;
    325 #endif	/* DEBUG */
    326 		}
    327 	}
    328 #endif	/* _SYSCALL32_IMPL */
    329 
    330 	/*
    331 	 * Allocate loadable exec locks.  (Assumes all execs are loadable)
    332 	 */
    333 	for (exectype = 0; exectype < nexectype; exectype++) {
    334 		execsw[exectype].exec_lock =
    335 		    kobj_zalloc(sizeof (krwlock_t), KM_SLEEP);
    336 		rw_init(execsw[exectype].exec_lock, NULL, RW_DEFAULT, NULL);
    337 	}
    338 
    339 	read_class_file();
    340 
    341 	/* init thread specific structure for mod_uninstall_all */
    342 	tsd_create(&mod_autounload_key, NULL);
    343 }
    344 
    345 static int
    346 modctl_modload(int use_path, char *filename, int *rvp)
    347 {
    348 	struct modctl *modp;
    349 	int retval = 0;
    350 	char *filenamep;
    351 	int modid;
    352 
    353 	filenamep = kmem_zalloc(MOD_MAXPATH, KM_SLEEP);
    354 
    355 	if (copyinstr(filename, filenamep, MOD_MAXPATH, 0)) {
    356 		retval = EFAULT;
    357 		goto out;
    358 	}
    359 
    360 	filenamep[MOD_MAXPATH - 1] = 0;
    361 	modp = mod_hold_installed_mod(filenamep, use_path, 0, &retval);
    362 
    363 	if (modp == NULL)
    364 		goto out;
    365 
    366 	modp->mod_loadflags |= MOD_NOAUTOUNLOAD;
    367 	modid = modp->mod_id;
    368 	mod_release_mod(modp);
    369 	CPU_STATS_ADDQ(CPU, sys, modload, 1);
    370 	if (rvp != NULL && copyout(&modid, rvp, sizeof (modid)) != 0)
    371 		retval = EFAULT;
    372 out:
    373 	kmem_free(filenamep, MOD_MAXPATH);
    374 
    375 	return (retval);
    376 }
    377 
    378 static int
    379 modctl_modunload(modid_t id)
    380 {
    381 	int rval = 0;
    382 
    383 	if (id == 0) {
    384 #ifdef DEBUG
    385 		/*
    386 		 * Turn on mod_uninstall_daemon
    387 		 */
    388 		if (mod_uninstall_interval == 0) {
    389 			mod_uninstall_interval = 60;
    390 			modreap();
    391 			return (rval);
    392 		}
    393 #endif
    394 		mod_uninstall_all();
    395 	} else {
    396 		rval = modunload(id);
    397 	}
    398 	return (rval);
    399 }
    400 
    401 static int
    402 modctl_modinfo(modid_t id, struct modinfo *umodi)
    403 {
    404 	int retval;
    405 	struct modinfo modi;
    406 #if defined(_SYSCALL32_IMPL)
    407 	int nobase;
    408 	struct modinfo32 modi32;
    409 #endif
    410 
    411 	if (get_udatamodel() == DATAMODEL_NATIVE) {
    412 		if (copyin(umodi, &modi, sizeof (struct modinfo)) != 0)
    413 			return (EFAULT);
    414 	}
    415 #ifdef _SYSCALL32_IMPL
    416 	else {
    417 		bzero(&modi, sizeof (modi));
    418 		if (copyin(umodi, &modi32, sizeof (struct modinfo32)) != 0)
    419 			return (EFAULT);
    420 		modi.mi_info = modi32.mi_info;
    421 		modi.mi_id = modi32.mi_id;
    422 		modi.mi_nextid = modi32.mi_nextid;
    423 		nobase = modi.mi_info & MI_INFO_NOBASE;
    424 	}
    425 #endif
    426 	/*
    427 	 * This flag is -only- for the kernels use.
    428 	 */
    429 	modi.mi_info &= ~MI_INFO_LINKAGE;
    430 
    431 	retval = modinfo(id, &modi);
    432 	if (retval)
    433 		return (retval);
    434 
    435 	if (get_udatamodel() == DATAMODEL_NATIVE) {
    436 		if (copyout(&modi, umodi, sizeof (struct modinfo)) != 0)
    437 			retval = EFAULT;
    438 #ifdef _SYSCALL32_IMPL
    439 	} else {
    440 		int i;
    441 
    442 		if (!nobase && (uintptr_t)modi.mi_base > UINT32_MAX)
    443 			return (EOVERFLOW);
    444 
    445 		modi32.mi_info = modi.mi_info;
    446 		modi32.mi_state = modi.mi_state;
    447 		modi32.mi_id = modi.mi_id;
    448 		modi32.mi_nextid = modi.mi_nextid;
    449 		modi32.mi_base = (caddr32_t)(uintptr_t)modi.mi_base;
    450 		modi32.mi_size = modi.mi_size;
    451 		modi32.mi_rev = modi.mi_rev;
    452 		modi32.mi_loadcnt = modi.mi_loadcnt;
    453 		bcopy(modi.mi_name, modi32.mi_name, sizeof (modi32.mi_name));
    454 		for (i = 0; i < MODMAXLINK32; i++) {
    455 			modi32.mi_msinfo[i].msi_p0 = modi.mi_msinfo[i].msi_p0;
    456 			bcopy(modi.mi_msinfo[i].msi_linkinfo,
    457 			    modi32.mi_msinfo[i].msi_linkinfo,
    458 			    sizeof (modi32.mi_msinfo[0].msi_linkinfo));
    459 		}
    460 		if (copyout(&modi32, umodi, sizeof (struct modinfo32)) != 0)
    461 			retval = EFAULT;
    462 #endif
    463 	}
    464 
    465 	return (retval);
    466 }
    467 
    468 /*
    469  * Return the last major number in the range of permissible major numbers.
    470  */
    471 /*ARGSUSED*/
    472 static int
    473 modctl_modreserve(modid_t id, int *data)
    474 {
    475 	if (copyout(&devcnt, data, sizeof (devcnt)) != 0)
    476 		return (EFAULT);
    477 	return (0);
    478 }
    479 
    480 /* Add/Remove driver and binding aliases */
    481 static int
    482 modctl_update_driver_aliases(int add, int *data)
    483 {
    484 	struct modconfig	mc;
    485 	int			i, n, rv = 0;
    486 	struct aliases		alias;
    487 	struct aliases		*ap;
    488 	char			name[MAXMODCONFNAME];
    489 	char			cname[MAXMODCONFNAME];
    490 	char			*drvname;
    491 	int			resid;
    492 	struct alias_info {
    493 		char	*alias_name;
    494 		int	alias_resid;
    495 	} *aliases, *aip;
    496 
    497 	bzero(&mc, sizeof (struct modconfig));
    498 	if (get_udatamodel() == DATAMODEL_NATIVE) {
    499 		if (copyin(data, &mc, sizeof (struct modconfig)) != 0)
    500 			return (EFAULT);
    501 	}
    502 #ifdef _SYSCALL32_IMPL
    503 	else {
    504 		struct modconfig32 modc32;
    505 		if (copyin(data, &modc32, sizeof (struct modconfig32)) != 0)
    506 			return (EFAULT);
    507 		else {
    508 			bcopy(modc32.drvname, mc.drvname,
    509 			    sizeof (modc32.drvname));
    510 			bcopy(modc32.drvclass, mc.drvclass,
    511 			    sizeof (modc32.drvclass));
    512 			mc.major = modc32.major;
    513 			mc.flags = modc32.flags;
    514 			mc.num_aliases = modc32.num_aliases;
    515 			mc.ap = (struct aliases *)(uintptr_t)modc32.ap;
    516 		}
    517 	}
    518 #endif
    519 
    520 	/*
    521 	 * If the driver is already in the mb_hashtab, and the name given
    522 	 * doesn't match that driver's name, fail.  Otherwise, pass, since
    523 	 * we may be adding aliases.
    524 	 */
    525 	drvname = mod_major_to_name(mc.major);
    526 	if ((drvname != NULL) && strcmp(drvname, mc.drvname) != 0)
    527 		return (EINVAL);
    528 
    529 	/*
    530 	 * Precede alias removal by unbinding as many devices as possible.
    531 	 */
    532 	if (add == 0) {
    533 		(void) i_ddi_unload_drvconf(mc.major);
    534 		i_ddi_unbind_devs(mc.major);
    535 	}
    536 
    537 	/*
    538 	 * Add/remove each supplied driver alias to/from mb_hashtab
    539 	 */
    540 	ap = mc.ap;
    541 	if (mc.num_aliases > 0)
    542 		aliases = kmem_zalloc(
    543 		    mc.num_aliases * sizeof (struct alias_info), KM_SLEEP);
    544 	aip = aliases;
    545 	for (i = 0; i < mc.num_aliases; i++) {
    546 		bzero(&alias, sizeof (struct aliases));
    547 		if (get_udatamodel() == DATAMODEL_NATIVE) {
    548 			if (copyin(ap, &alias, sizeof (struct aliases)) != 0) {
    549 				rv = EFAULT;
    550 				goto error;
    551 			}
    552 			if (alias.a_len > MAXMODCONFNAME) {
    553 				rv = EINVAL;
    554 				goto error;
    555 			}
    556 			if (copyin(alias.a_name, name, alias.a_len) != 0) {
    557 				rv = EFAULT;
    558 				goto error;
    559 			}
    560 			if (name[alias.a_len - 1] != '\0') {
    561 				rv = EINVAL;
    562 				goto error;
    563 			}
    564 		}
    565 #ifdef _SYSCALL32_IMPL
    566 		else {
    567 			struct aliases32 al32;
    568 			bzero(&al32, sizeof (struct aliases32));
    569 			if (copyin(ap, &al32, sizeof (struct aliases32)) != 0) {
    570 				rv = EFAULT;
    571 				goto error;
    572 			}
    573 			if (al32.a_len > MAXMODCONFNAME) {
    574 				rv = EINVAL;
    575 				goto error;
    576 			}
    577 			if (copyin((void *)(uintptr_t)al32.a_name,
    578 			    name, al32.a_len) != 0) {
    579 				rv = EFAULT;
    580 				goto error;
    581 			}
    582 			if (name[al32.a_len - 1] != '\0') {
    583 				rv = EINVAL;
    584 				goto error;
    585 			}
    586 			alias.a_next = (void *)(uintptr_t)al32.a_next;
    587 		}
    588 #endif
    589 		check_esc_sequences(name, cname);
    590 		aip->alias_name = strdup(cname);
    591 		ap = alias.a_next;
    592 		aip++;
    593 	}
    594 
    595 	if (add == 0) {
    596 		ap = mc.ap;
    597 		resid = 0;
    598 		aip = aliases;
    599 		/* attempt to unbind all devices bound to each alias */
    600 		for (i = 0; i < mc.num_aliases; i++) {
    601 			n = i_ddi_unbind_devs_by_alias(
    602 			    mc.major, aip->alias_name);
    603 			resid += n;
    604 			aip->alias_resid = n;
    605 		}
    606 
    607 		/*
    608 		 * If some device bound to an alias remains in use,
    609 		 * and override wasn't specified, no change is made to
    610 		 * the binding state and we fail the operation.
    611 		 */
    612 		if (resid > 0 && ((mc.flags & MOD_UNBIND_OVERRIDE) == 0)) {
    613 			rv = EBUSY;
    614 			goto error;
    615 		}
    616 
    617 		/*
    618 		 * No device remains bound of any of the aliases,
    619 		 * or force was requested.  Mark each alias as
    620 		 * inactive via delete_mbind so no future binds
    621 		 * to this alias take place and that a new
    622 		 * binding can be established.
    623 		 */
    624 		aip = aliases;
    625 		for (i = 0; i < mc.num_aliases; i++) {
    626 			if (moddebug & MODDEBUG_BINDING)
    627 				cmn_err(CE_CONT, "Removing binding for %s "
    628 				    "(%d active references)\n",
    629 				    aip->alias_name, aip->alias_resid);
    630 			delete_mbind(aip->alias_name, mb_hashtab);
    631 			aip++;
    632 		}
    633 		rv = 0;
    634 	} else {
    635 		aip = aliases;
    636 		for (i = 0; i < mc.num_aliases; i++) {
    637 			if (moddebug & MODDEBUG_BINDING)
    638 				cmn_err(CE_NOTE, "Adding binding for '%s'\n",
    639 				    aip->alias_name);
    640 			(void) make_mbind(aip->alias_name,
    641 			    mc.major, NULL, mb_hashtab);
    642 			aip++;
    643 		}
    644 		/*
    645 		 * Try to establish an mbinding for mc.drvname, and add it to
    646 		 * devnames. Add class if any after establishing the major
    647 		 * number.
    648 		 */
    649 		(void) make_mbind(mc.drvname, mc.major, NULL, mb_hashtab);
    650 		if ((rv = make_devname(mc.drvname, mc.major,
    651 		    (mc.flags & MOD_ADDMAJBIND_UPDATE) ?
    652 		    DN_DRIVER_INACTIVE : 0)) != 0) {
    653 			goto error;
    654 		}
    655 
    656 		if (mc.drvclass[0] != '\0')
    657 			add_class(mc.drvname, mc.drvclass);
    658 		if ((mc.flags & MOD_ADDMAJBIND_UPDATE) == 0) {
    659 			(void) i_ddi_load_drvconf(mc.major);
    660 		}
    661 	}
    662 
    663 	/*
    664 	 * Ensure that all nodes are bound to the most appropriate driver
    665 	 * possible, attempting demotion and rebind when a more appropriate
    666 	 * driver now exists.  But not when adding a driver update-only.
    667 	 */
    668 	if ((add == 0) || ((mc.flags & MOD_ADDMAJBIND_UPDATE) == 0)) {
    669 		i_ddi_bind_devs();
    670 		i_ddi_di_cache_invalidate();
    671 	}
    672 
    673 error:
    674 	if (mc.num_aliases > 0) {
    675 		aip = aliases;
    676 		for (i = 0; i < mc.num_aliases; i++) {
    677 			if (aip->alias_name != NULL)
    678 				strfree(aip->alias_name);
    679 			aip++;
    680 		}
    681 		kmem_free(aliases, mc.num_aliases * sizeof (struct alias_info));
    682 	}
    683 	return (rv);
    684 }
    685 
    686 static int
    687 modctl_add_driver_aliases(int *data)
    688 {
    689 	return (modctl_update_driver_aliases(1, data));
    690 }
    691 
    692 static int
    693 modctl_remove_driver_aliases(int *data)
    694 {
    695 	return (modctl_update_driver_aliases(0, data));
    696 }
    697 
    698 static int
    699 modctl_rem_major(major_t major)
    700 {
    701 	struct devnames *dnp;
    702 
    703 	if (major >= devcnt)
    704 		return (EINVAL);
    705 
    706 	/* mark devnames as removed */
    707 	dnp = &devnamesp[major];
    708 	LOCK_DEV_OPS(&dnp->dn_lock);
    709 	if (dnp->dn_name == NULL ||
    710 	    (dnp->dn_flags & (DN_DRIVER_REMOVED | DN_TAKEN_GETUDEV))) {
    711 		UNLOCK_DEV_OPS(&dnp->dn_lock);
    712 		return (EINVAL);
    713 	}
    714 	dnp->dn_flags |= DN_DRIVER_REMOVED;
    715 	pm_driver_removed(major);
    716 	UNLOCK_DEV_OPS(&dnp->dn_lock);
    717 
    718 	(void) i_ddi_unload_drvconf(major);
    719 	i_ddi_unbind_devs(major);
    720 	i_ddi_bind_devs();
    721 	i_ddi_di_cache_invalidate();
    722 
    723 	/* purge all the bindings to this driver */
    724 	purge_mbind(major, mb_hashtab);
    725 	return (0);
    726 }
    727 
    728 static struct vfs *
    729 path_to_vfs(char *name)
    730 {
    731 	vnode_t *vp;
    732 	struct vfs *vfsp;
    733 
    734 	if (lookupname(name, UIO_SYSSPACE, FOLLOW, NULLVPP, &vp))
    735 		return (NULL);
    736 
    737 	vfsp = vp->v_vfsp;
    738 	VN_RELE(vp);
    739 	return (vfsp);
    740 }
    741 
    742 static int
    743 new_vfs_in_modpath()
    744 {
    745 	static int n_modpath = 0;
    746 	static char *modpath_copy;
    747 	static struct pathvfs {
    748 		char *path;
    749 		struct vfs *vfsp;
    750 	} *pathvfs;
    751 
    752 	int i, new_vfs = 0;
    753 	char *tmp, *tmp1;
    754 	struct vfs *vfsp;
    755 
    756 	if (n_modpath != 0) {
    757 		for (i = 0; i < n_modpath; i++) {
    758 			vfsp = path_to_vfs(pathvfs[i].path);
    759 			if (vfsp != pathvfs[i].vfsp) {
    760 				pathvfs[i].vfsp = vfsp;
    761 				if (vfsp)
    762 					new_vfs = 1;
    763 			}
    764 		}
    765 		return (new_vfs);
    766 	}
    767 
    768 	/*
    769 	 * First call, initialize the pathvfs structure
    770 	 */
    771 	modpath_copy = i_ddi_strdup(default_path, KM_SLEEP);
    772 	tmp = modpath_copy;
    773 	n_modpath = 1;
    774 	tmp1 = strchr(tmp, ' ');
    775 	while (tmp1) {
    776 		*tmp1 = '\0';
    777 		n_modpath++;
    778 		tmp = tmp1 + 1;
    779 		tmp1 = strchr(tmp, ' ');
    780 	}
    781 
    782 	pathvfs = kmem_zalloc(n_modpath * sizeof (struct pathvfs), KM_SLEEP);
    783 	tmp = modpath_copy;
    784 	for (i = 0; i < n_modpath; i++) {
    785 		pathvfs[i].path = tmp;
    786 		vfsp = path_to_vfs(tmp);
    787 		pathvfs[i].vfsp = vfsp;
    788 		tmp += strlen(tmp) + 1;
    789 	}
    790 	return (1);	/* always reread driver.conf the first time */
    791 }
    792 
    793 static int
    794 modctl_load_drvconf(major_t major, int flags)
    795 {
    796 	int ret;
    797 
    798 	/*
    799 	 * devfsadm -u - read all new driver.conf files
    800 	 * and bind and configure devices for new drivers.
    801 	 */
    802 	if (flags & MOD_LOADDRVCONF_RECONF) {
    803 		(void) i_ddi_load_drvconf(DDI_MAJOR_T_NONE);
    804 		i_ddi_bind_devs();
    805 		i_ddi_di_cache_invalidate();
    806 		return (0);
    807 	}
    808 
    809 	/*
    810 	 * update_drv <drv> - reload driver.conf for the specified driver
    811 	 */
    812 	if (major != DDI_MAJOR_T_NONE) {
    813 		ret = i_ddi_load_drvconf(major);
    814 		if (ret == 0)
    815 			i_ddi_bind_devs();
    816 		return (ret);
    817 	}
    818 
    819 	/*
    820 	 * We are invoked to rescan new driver.conf files. It is
    821 	 * only necessary if a new file system was mounted in the
    822 	 * module_path. Because rescanning driver.conf files can
    823 	 * take some time on older platforms (sun4m), the following
    824 	 * code skips unnecessary driver.conf rescans to optimize
    825 	 * boot performance.
    826 	 */
    827 	if (new_vfs_in_modpath()) {
    828 		(void) i_ddi_load_drvconf(DDI_MAJOR_T_NONE);
    829 		/*
    830 		 * If we are still initializing io subsystem,
    831 		 * load drivers with ddi-forceattach property
    832 		 */
    833 		if (!i_ddi_io_initialized())
    834 			i_ddi_forceattach_drivers();
    835 	}
    836 	return (0);
    837 }
    838 
    839 /*
    840  * Unload driver.conf file and follow up by attempting
    841  * to rebind devices to more appropriate driver.
    842  */
    843 static int
    844 modctl_unload_drvconf(major_t major)
    845 {
    846 	int ret;
    847 
    848 	if (major >= devcnt)
    849 		return (EINVAL);
    850 
    851 	ret = i_ddi_unload_drvconf(major);
    852 	if (ret != 0)
    853 		return (ret);
    854 	(void) i_ddi_unbind_devs(major);
    855 	i_ddi_bind_devs();
    856 
    857 	return (0);
    858 }
    859 
    860 static void
    861 check_esc_sequences(char *str, char *cstr)
    862 {
    863 	int i;
    864 	size_t len;
    865 	char *p;
    866 
    867 	len = strlen(str);
    868 	for (i = 0; i < len; i++, str++, cstr++) {
    869 		if (*str != '\\') {
    870 			*cstr = *str;
    871 		} else {
    872 			p = str + 1;
    873 			/*
    874 			 * we only handle octal escape sequences for SPACE
    875 			 */
    876 			if (*p++ == '0' && *p++ == '4' && *p == '0') {
    877 				*cstr = ' ';
    878 				str += 3;
    879 			} else {
    880 				*cstr = *str;
    881 			}
    882 		}
    883 	}
    884 	*cstr = 0;
    885 }
    886 
    887 static int
    888 modctl_getmodpathlen(int *data)
    889 {
    890 	int len;
    891 	len = strlen(default_path);
    892 	if (copyout(&len, data, sizeof (len)) != 0)
    893 		return (EFAULT);
    894 	return (0);
    895 }
    896 
    897 static int
    898 modctl_getmodpath(char *data)
    899 {
    900 	if (copyout(default_path, data, strlen(default_path) + 1) != 0)
    901 		return (EFAULT);
    902 	return (0);
    903 }
    904 
    905 static int
    906 modctl_read_sysbinding_file(void)
    907 {
    908 	(void) read_binding_file(sysbind, sb_hashtab, make_mbind);
    909 	return (0);
    910 }
    911 
    912 static int
    913 modctl_getmaj(char *uname, uint_t ulen, int *umajorp)
    914 {
    915 	char name[256];
    916 	int retval;
    917 	major_t major;
    918 
    919 	if (ulen == 0)
    920 		return (EINVAL);
    921 	if ((retval = copyinstr(uname, name,
    922 	    (ulen < 256) ? ulen : 256, 0)) != 0)
    923 		return (retval);
    924 	if ((major = mod_name_to_major(name)) == DDI_MAJOR_T_NONE)
    925 		return (ENODEV);
    926 	if (copyout(&major, umajorp, sizeof (major_t)) != 0)
    927 		return (EFAULT);
    928 	return (0);
    929 }
    930 
    931 static char **
    932 convert_constraint_string(char *constraints, size_t len)
    933 {
    934 	int	i;
    935 	int	n;
    936 	char	*p;
    937 	char	**array;
    938 
    939 	ASSERT(constraints != NULL);
    940 	ASSERT(len > 0);
    941 
    942 	for (i = 0, p = constraints; strlen(p) > 0; i++, p += strlen(p) + 1)
    943 		;
    944 
    945 	n = i;
    946 
    947 	if (n == 0) {
    948 		kmem_free(constraints, len);
    949 		return (NULL);
    950 	}
    951 
    952 	array = kmem_alloc((n + 1) * sizeof (char *), KM_SLEEP);
    953 
    954 	for (i = 0, p = constraints; i < n; i++, p += strlen(p) + 1) {
    955 		array[i] = i_ddi_strdup(p, KM_SLEEP);
    956 	}
    957 	array[n] = NULL;
    958 
    959 	kmem_free(constraints, len);
    960 
    961 	return (array);
    962 }
    963 /*ARGSUSED*/
    964 static int
    965 modctl_retire(char *path, char *uconstraints, size_t ulen)
    966 {
    967 	char	*pathbuf;
    968 	char	*devpath;
    969 	size_t	pathsz;
    970 	int	retval;
    971 	char	*constraints;
    972 	char	**cons_array;
    973 
    974 	if (path == NULL)
    975 		return (EINVAL);
    976 
    977 	if ((uconstraints == NULL) ^ (ulen == 0))
    978 		return (EINVAL);
    979 
    980 	pathbuf = kmem_alloc(MAXPATHLEN, KM_SLEEP);
    981 	retval = copyinstr(path, pathbuf, MAXPATHLEN, &pathsz);
    982 	if (retval != 0) {
    983 		kmem_free(pathbuf, MAXPATHLEN);
    984 		return (retval);
    985 	}
    986 	devpath = i_ddi_strdup(pathbuf, KM_SLEEP);
    987 	kmem_free(pathbuf, MAXPATHLEN);
    988 
    989 	/*
    990 	 * First check if the device is already retired.
    991 	 * If it is, this becomes a NOP
    992 	 */
    993 	if (e_ddi_device_retired(devpath)) {
    994 		cmn_err(CE_NOTE, "Device: already retired: %s", devpath);
    995 		kmem_free(devpath, strlen(devpath) + 1);
    996 		return (0);
    997 	}
    998 
    999 	cons_array = NULL;
   1000 	if (uconstraints) {
   1001 		constraints = kmem_alloc(ulen, KM_SLEEP);
   1002 		if (copyin(uconstraints, constraints, ulen)) {
   1003 			kmem_free(constraints, ulen);
   1004 			kmem_free(devpath, strlen(devpath) + 1);
   1005 			return (EFAULT);
   1006 		}
   1007 		cons_array = convert_constraint_string(constraints, ulen);
   1008 	}
   1009 
   1010 	/*
   1011 	 * Try to retire the device first. The following
   1012 	 * routine will return an error only if the device
   1013 	 * is not retireable i.e. retire constraints forbid
   1014 	 * a retire. A return of success from this routine
   1015 	 * indicates that device is retireable.
   1016 	 */
   1017 	retval = e_ddi_retire_device(devpath, cons_array);
   1018 	if (retval != DDI_SUCCESS) {
   1019 		cmn_err(CE_WARN, "constraints forbid retire: %s", devpath);
   1020 		kmem_free(devpath, strlen(devpath) + 1);
   1021 		return (ENOTSUP);
   1022 	}
   1023 
   1024 	/*
   1025 	 * Ok, the retire succeeded. Persist the retire.
   1026 	 * If retiring a nexus, we need to only persist the
   1027 	 * nexus retire. Any children of a retired nexus
   1028 	 * are automatically covered by the retire store
   1029 	 * code.
   1030 	 */
   1031 	retval = e_ddi_retire_persist(devpath);
   1032 	if (retval != 0) {
   1033 		cmn_err(CE_WARN, "Failed to persist device retire: error %d: "
   1034 		    "%s", retval, devpath);
   1035 		kmem_free(devpath, strlen(devpath) + 1);
   1036 		return (retval);
   1037 	}
   1038 	if (moddebug & MODDEBUG_RETIRE)
   1039 		cmn_err(CE_NOTE, "Persisted retire of device: %s", devpath);
   1040 
   1041 	kmem_free(devpath, strlen(devpath) + 1);
   1042 	return (0);
   1043 }
   1044 
   1045 static int
   1046 modctl_is_retired(char *path, int *statep)
   1047 {
   1048 	char	*pathbuf;
   1049 	char	*devpath;
   1050 	size_t	pathsz;
   1051 	int	error;
   1052 	int	status;
   1053 
   1054 	if (path == NULL || statep == NULL)
   1055 		return (EINVAL);
   1056 
   1057 	pathbuf = kmem_alloc(MAXPATHLEN, KM_SLEEP);
   1058 	error = copyinstr(path, pathbuf, MAXPATHLEN, &pathsz);
   1059 	if (error != 0) {
   1060 		kmem_free(pathbuf, MAXPATHLEN);
   1061 		return (error);
   1062 	}
   1063 	devpath = i_ddi_strdup(pathbuf, KM_SLEEP);
   1064 	kmem_free(pathbuf, MAXPATHLEN);
   1065 
   1066 	if (e_ddi_device_retired(devpath))
   1067 		status = 1;
   1068 	else
   1069 		status = 0;
   1070 	kmem_free(devpath, strlen(devpath) + 1);
   1071 
   1072 	return (copyout(&status, statep, sizeof (status)) ? EFAULT : 0);
   1073 }
   1074 
   1075 static int
   1076 modctl_unretire(char *path)
   1077 {
   1078 	char	*pathbuf;
   1079 	char	*devpath;
   1080 	size_t	pathsz;
   1081 	int	retired;
   1082 	int	retval;
   1083 
   1084 	if (path == NULL)
   1085 		return (EINVAL);
   1086 
   1087 	pathbuf = kmem_alloc(MAXPATHLEN, KM_SLEEP);
   1088 	retval = copyinstr(path, pathbuf, MAXPATHLEN, &pathsz);
   1089 	if (retval != 0) {
   1090 		kmem_free(pathbuf, MAXPATHLEN);
   1091 		return (retval);
   1092 	}
   1093 	devpath = i_ddi_strdup(pathbuf, KM_SLEEP);
   1094 	kmem_free(pathbuf, MAXPATHLEN);
   1095 
   1096 	/*
   1097 	 * We check if a device is retired (first) before
   1098 	 * unpersisting the retire, because we use the
   1099 	 * retire store to determine if a device is retired.
   1100 	 * If we unpersist first, the device will always appear
   1101 	 * to be unretired. For the rationale behind unpersisting
   1102 	 * a device that is not retired, see the next comment.
   1103 	 */
   1104 	retired = e_ddi_device_retired(devpath);
   1105 
   1106 	/*
   1107 	 * We call unpersist unconditionally because the lookup
   1108 	 * for retired devices (e_ddi_device_retired()), skips "bypassed"
   1109 	 * devices. We still want to be able remove "bypassed" entries
   1110 	 * from the persistent store, so we unpersist unconditionally
   1111 	 * i.e. whether or not the entry is found on a lookup.
   1112 	 *
   1113 	 * e_ddi_retire_unpersist() returns 1 if it found and cleared
   1114 	 * an entry from the retire store or 0 otherwise.
   1115 	 */
   1116 	if (e_ddi_retire_unpersist(devpath))
   1117 		if (moddebug & MODDEBUG_RETIRE) {
   1118 			cmn_err(CE_NOTE, "Unpersisted retire of device: %s",
   1119 			    devpath);
   1120 		}
   1121 
   1122 	/*
   1123 	 * Check if the device is already unretired. If so,
   1124 	 * the unretire becomes a NOP
   1125 	 */
   1126 	if (!retired) {
   1127 		cmn_err(CE_NOTE, "Not retired: %s", devpath);
   1128 		kmem_free(devpath, strlen(devpath) + 1);
   1129 		return (0);
   1130 	}
   1131 
   1132 	retval = e_ddi_unretire_device(devpath);
   1133 	if (retval != 0) {
   1134 		cmn_err(CE_WARN, "cannot unretire device: error %d, path %s\n",
   1135 		    retval, devpath);
   1136 	}
   1137 
   1138 	kmem_free(devpath, strlen(devpath) + 1);
   1139 
   1140 	return (retval);
   1141 }
   1142 
   1143 static int
   1144 modctl_getname(char *uname, uint_t ulen, int *umajorp)
   1145 {
   1146 	char *name;
   1147 	major_t major;
   1148 
   1149 	if (copyin(umajorp, &major, sizeof (major)) != 0)
   1150 		return (EFAULT);
   1151 	if ((name = mod_major_to_name(major)) == NULL)
   1152 		return (ENODEV);
   1153 	if ((strlen(name) + 1) > ulen)
   1154 		return (ENOSPC);
   1155 	return (copyoutstr(name, uname, ulen, NULL));
   1156 }
   1157 
   1158 static int
   1159 modctl_devt2instance(dev_t dev, int *uinstancep)
   1160 {
   1161 	int	instance;
   1162 
   1163 	if ((instance = dev_to_instance(dev)) == -1)
   1164 		return (EINVAL);
   1165 
   1166 	return (copyout(&instance, uinstancep, sizeof (int)));
   1167 }
   1168 
   1169 /*
   1170  * Return the sizeof of the device id.
   1171  */
   1172 static int
   1173 modctl_sizeof_devid(dev_t dev, uint_t *len)
   1174 {
   1175 	uint_t		sz;
   1176 	ddi_devid_t	devid;
   1177 
   1178 	/* get device id */
   1179 	if (ddi_lyr_get_devid(dev, &devid) == DDI_FAILURE)
   1180 		return (EINVAL);
   1181 
   1182 	sz = ddi_devid_sizeof(devid);
   1183 	ddi_devid_free(devid);
   1184 
   1185 	/* copyout device id size */
   1186 	if (copyout(&sz, len, sizeof (sz)) != 0)
   1187 		return (EFAULT);
   1188 
   1189 	return (0);
   1190 }
   1191 
   1192 /*
   1193  * Return a copy of the device id.
   1194  */
   1195 static int
   1196 modctl_get_devid(dev_t dev, uint_t len, ddi_devid_t udevid)
   1197 {
   1198 	uint_t		sz;
   1199 	ddi_devid_t	devid;
   1200 	int		err = 0;
   1201 
   1202 	/* get device id */
   1203 	if (ddi_lyr_get_devid(dev, &devid) == DDI_FAILURE)
   1204 		return (EINVAL);
   1205 
   1206 	sz = ddi_devid_sizeof(devid);
   1207 
   1208 	/* Error if device id is larger than space allocated */
   1209 	if (sz > len) {
   1210 		ddi_devid_free(devid);
   1211 		return (ENOSPC);
   1212 	}
   1213 
   1214 	/* copy out device id */
   1215 	if (copyout(devid, udevid, sz) != 0)
   1216 		err = EFAULT;
   1217 	ddi_devid_free(devid);
   1218 	return (err);
   1219 }
   1220 
   1221 /*
   1222  * return the /devices paths associated with the specified devid and
   1223  * minor name.
   1224  */
   1225 /*ARGSUSED*/
   1226 static int
   1227 modctl_devid2paths(ddi_devid_t udevid, char *uminor_name, uint_t flag,
   1228 	size_t *ulensp, char *upaths)
   1229 {
   1230 	ddi_devid_t	devid = NULL;
   1231 	int		devid_len;
   1232 	char		*minor_name = NULL;
   1233 	dev_info_t	*dip = NULL;
   1234 	int		circ;
   1235 	struct ddi_minor_data	*dmdp;
   1236 	char		*path = NULL;
   1237 	int		ulens;
   1238 	int		lens;
   1239 	int		len;
   1240 	dev_t		*devlist = NULL;
   1241 	int		ndevs;
   1242 	int		i;
   1243 	int		ret = 0;
   1244 
   1245 	/*
   1246 	 * If upaths is NULL then we are only computing the amount of space
   1247 	 * needed to hold the paths and returning the value in *ulensp. If we
   1248 	 * are copying out paths then we get the amount of space allocated by
   1249 	 * the caller. If the actual space needed for paths is larger, or
   1250 	 * things are changing out from under us, then we return EAGAIN.
   1251 	 */
   1252 	if (upaths) {
   1253 		if (ulensp == NULL)
   1254 			return (EINVAL);
   1255 		if (copyin(ulensp, &ulens, sizeof (ulens)) != 0)
   1256 			return (EFAULT);
   1257 	}
   1258 
   1259 	/*
   1260 	 * copyin enough of the devid to determine the length then
   1261 	 * reallocate and copy in the entire devid.
   1262 	 */
   1263 	devid_len = ddi_devid_sizeof(NULL);
   1264 	devid = kmem_alloc(devid_len, KM_SLEEP);
   1265 	if (copyin(udevid, devid, devid_len)) {
   1266 		ret = EFAULT;
   1267 		goto out;
   1268 	}
   1269 	len = devid_len;
   1270 	devid_len = ddi_devid_sizeof(devid);
   1271 	kmem_free(devid, len);
   1272 	devid = kmem_alloc(devid_len, KM_SLEEP);
   1273 	if (copyin(udevid, devid, devid_len)) {
   1274 		ret = EFAULT;
   1275 		goto out;
   1276 	}
   1277 
   1278 	/* copyin the minor name if specified. */
   1279 	minor_name = uminor_name;
   1280 	if ((minor_name != DEVID_MINOR_NAME_ALL) &&
   1281 	    (minor_name != DEVID_MINOR_NAME_ALL_CHR) &&
   1282 	    (minor_name != DEVID_MINOR_NAME_ALL_BLK)) {
   1283 		minor_name = kmem_alloc(MAXPATHLEN, KM_SLEEP);
   1284 		if (copyinstr(uminor_name, minor_name, MAXPATHLEN, 0)) {
   1285 			ret = EFAULT;
   1286 			goto out;
   1287 		}
   1288 	}
   1289 
   1290 	/*
   1291 	 * Use existing function to resolve the devid into a devlist.
   1292 	 *
   1293 	 * NOTE: there is a loss of spectype information in the current
   1294 	 * ddi_lyr_devid_to_devlist implementation. We work around this by not
   1295 	 * passing down DEVID_MINOR_NAME_ALL here, but reproducing all minor
   1296 	 * node forms in the loop processing the devlist below. It would be
   1297 	 * best if at some point the use of this interface here was replaced
   1298 	 * with a path oriented call.
   1299 	 */
   1300 	if (ddi_lyr_devid_to_devlist(devid,
   1301 	    (minor_name == DEVID_MINOR_NAME_ALL) ?
   1302 	    DEVID_MINOR_NAME_ALL_CHR : minor_name,
   1303 	    &ndevs, &devlist) != DDI_SUCCESS) {
   1304 		ret = EINVAL;
   1305 		goto out;
   1306 	}
   1307 
   1308 	/*
   1309 	 * loop over the devlist, converting each devt to a path and doing
   1310 	 * a copyout of the path and computation of the amount of space
   1311 	 * needed to hold all the paths
   1312 	 */
   1313 	path = kmem_alloc(MAXPATHLEN, KM_SLEEP);
   1314 	for (i = 0, lens = 0; i < ndevs; i++) {
   1315 
   1316 		/* find the dip associated with the dev_t */
   1317 		if ((dip = e_ddi_hold_devi_by_dev(devlist[i], 0)) == NULL)
   1318 			continue;
   1319 
   1320 		/* loop over all the minor nodes, skipping ones we don't want */
   1321 		ndi_devi_enter(dip, &circ);
   1322 		for (dmdp = DEVI(dip)->devi_minor; dmdp; dmdp = dmdp->next) {
   1323 			if ((dmdp->ddm_dev != devlist[i]) ||
   1324 			    (dmdp->type != DDM_MINOR))
   1325 				continue;
   1326 
   1327 			if ((minor_name != DEVID_MINOR_NAME_ALL) &&
   1328 			    (minor_name != DEVID_MINOR_NAME_ALL_CHR) &&
   1329 			    (minor_name != DEVID_MINOR_NAME_ALL_BLK) &&
   1330 			    strcmp(minor_name, dmdp->ddm_name))
   1331 				continue;
   1332 			else {
   1333 				if ((minor_name == DEVID_MINOR_NAME_ALL_CHR) &&
   1334 				    (dmdp->ddm_spec_type != S_IFCHR))
   1335 					continue;
   1336 				if ((minor_name == DEVID_MINOR_NAME_ALL_BLK) &&
   1337 				    (dmdp->ddm_spec_type != S_IFBLK))
   1338 					continue;
   1339 			}
   1340 
   1341 			(void) ddi_pathname_minor(dmdp, path);
   1342 			len = strlen(path) + 1;
   1343 			*(path + len) = '\0';	/* set double termination */
   1344 			lens += len;
   1345 
   1346 			/* copyout the path with double terminations */
   1347 			if (upaths) {
   1348 				if (lens > ulens) {
   1349 					ret = EAGAIN;
   1350 					goto out;
   1351 				}
   1352 				if (copyout(path, upaths, len + 1)) {
   1353 					ret = EFAULT;
   1354 					goto out;
   1355 				}
   1356 				upaths += len;
   1357 			}
   1358 		}
   1359 		ndi_devi_exit(dip, circ);
   1360 		ddi_release_devi(dip);
   1361 		dip = NULL;
   1362 	}
   1363 	lens++;		/* add one for double termination */
   1364 
   1365 	/* copy out the amount of space needed to hold the paths */
   1366 	if (ulensp && copyout(&lens, ulensp, sizeof (lens))) {
   1367 		ret = EFAULT;
   1368 		goto out;
   1369 	}
   1370 	ret = 0;
   1371 
   1372 out:	if (dip) {
   1373 		ndi_devi_exit(dip, circ);
   1374 		ddi_release_devi(dip);
   1375 	}
   1376 	if (path)
   1377 		kmem_free(path, MAXPATHLEN);
   1378 	if (devlist)
   1379 		ddi_lyr_free_devlist(devlist, ndevs);
   1380 	if (minor_name &&
   1381 	    (minor_name != DEVID_MINOR_NAME_ALL) &&
   1382 	    (minor_name != DEVID_MINOR_NAME_ALL_CHR) &&
   1383 	    (minor_name != DEVID_MINOR_NAME_ALL_BLK))
   1384 		kmem_free(minor_name, MAXPATHLEN);
   1385 	if (devid)
   1386 		kmem_free(devid, devid_len);
   1387 	return (ret);
   1388 }
   1389 
   1390 /*
   1391  * Return the size of the minor name.
   1392  */
   1393 static int
   1394 modctl_sizeof_minorname(dev_t dev, int spectype, uint_t *len)
   1395 {
   1396 	uint_t	sz;
   1397 	char	*name;
   1398 
   1399 	/* get the minor name */
   1400 	if (ddi_lyr_get_minor_name(dev, spectype, &name) == DDI_FAILURE)
   1401 		return (EINVAL);
   1402 
   1403 	sz = strlen(name) + 1;
   1404 	kmem_free(name, sz);
   1405 
   1406 	/* copy out the size of the minor name */
   1407 	if (copyout(&sz, len, sizeof (sz)) != 0)
   1408 		return (EFAULT);
   1409 
   1410 	return (0);
   1411 }
   1412 
   1413 /*
   1414  * Return the minor name.
   1415  */
   1416 static int
   1417 modctl_get_minorname(dev_t dev, int spectype, uint_t len, char *uname)
   1418 {
   1419 	uint_t	sz;
   1420 	char	*name;
   1421 	int	err = 0;
   1422 
   1423 	/* get the minor name */
   1424 	if (ddi_lyr_get_minor_name(dev, spectype, &name) == DDI_FAILURE)
   1425 		return (EINVAL);
   1426 
   1427 	sz = strlen(name) + 1;
   1428 
   1429 	/* Error if the minor name is larger than the space allocated */
   1430 	if (sz > len) {
   1431 		kmem_free(name, sz);
   1432 		return (ENOSPC);
   1433 	}
   1434 
   1435 	/* copy out the minor name */
   1436 	if (copyout(name, uname, sz) != 0)
   1437 		err = EFAULT;
   1438 	kmem_free(name, sz);
   1439 	return (err);
   1440 }
   1441 
   1442 /*
   1443  * Return the size of the (dev_t,spectype) devfspath name.
   1444  */
   1445 static int
   1446 modctl_devfspath_len(dev_t dev, int spectype, uint_t *len)
   1447 {
   1448 	uint_t	sz;
   1449 	char	*name;
   1450 
   1451 	/* get the path name */
   1452 	name = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
   1453 	if (ddi_dev_pathname(dev, spectype, name) == DDI_FAILURE) {
   1454 		kmem_free(name, MAXPATHLEN);
   1455 		return (EINVAL);
   1456 	}
   1457 
   1458 	sz = strlen(name) + 1;
   1459 	kmem_free(name, MAXPATHLEN);
   1460 
   1461 	/* copy out the size of the path name */
   1462 	if (copyout(&sz, len, sizeof (sz)) != 0)
   1463 		return (EFAULT);
   1464 
   1465 	return (0);
   1466 }
   1467 
   1468 /*
   1469  * Return the (dev_t,spectype) devfspath name.
   1470  */
   1471 static int
   1472 modctl_devfspath(dev_t dev, int spectype, uint_t len, char *uname)
   1473 {
   1474 	uint_t	sz;
   1475 	char	*name;
   1476 	int	err = 0;
   1477 
   1478 	/* get the path name */
   1479 	name = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
   1480 	if (ddi_dev_pathname(dev, spectype, name) == DDI_FAILURE) {
   1481 		kmem_free(name, MAXPATHLEN);
   1482 		return (EINVAL);
   1483 	}
   1484 
   1485 	sz = strlen(name) + 1;
   1486 
   1487 	/* Error if the path name is larger than the space allocated */
   1488 	if (sz > len) {
   1489 		kmem_free(name, MAXPATHLEN);
   1490 		return (ENOSPC);
   1491 	}
   1492 
   1493 	/* copy out the path name */
   1494 	if (copyout(name, uname, sz) != 0)
   1495 		err = EFAULT;
   1496 	kmem_free(name, MAXPATHLEN);
   1497 	return (err);
   1498 }
   1499 
   1500 /*
   1501  * Return the size of the (major,instance) devfspath name.
   1502  */
   1503 static int
   1504 modctl_devfspath_mi_len(major_t major, int instance, uint_t *len)
   1505 {
   1506 	uint_t	sz;
   1507 	char	*name;
   1508 
   1509 	/* get the path name */
   1510 	name = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
   1511 	if (e_ddi_majorinstance_to_path(major, instance, name) != DDI_SUCCESS) {
   1512 		kmem_free(name, MAXPATHLEN);
   1513 		return (EINVAL);
   1514 	}
   1515 
   1516 	sz = strlen(name) + 1;
   1517 	kmem_free(name, MAXPATHLEN);
   1518 
   1519 	/* copy out the size of the path name */
   1520 	if (copyout(&sz, len, sizeof (sz)) != 0)
   1521 		return (EFAULT);
   1522 
   1523 	return (0);
   1524 }
   1525 
   1526 /*
   1527  * Return the (major_instance) devfspath name.
   1528  * NOTE: e_ddi_majorinstance_to_path does not require the device to attach to
   1529  * return a path - it uses the instance tree.
   1530  */
   1531 static int
   1532 modctl_devfspath_mi(major_t major, int instance, uint_t len, char *uname)
   1533 {
   1534 	uint_t	sz;
   1535 	char	*name;
   1536 	int	err = 0;
   1537 
   1538 	/* get the path name */
   1539 	name = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
   1540 	if (e_ddi_majorinstance_to_path(major, instance, name) != DDI_SUCCESS) {
   1541 		kmem_free(name, MAXPATHLEN);
   1542 		return (EINVAL);
   1543 	}
   1544 
   1545 	sz = strlen(name) + 1;
   1546 
   1547 	/* Error if the path name is larger than the space allocated */
   1548 	if (sz > len) {
   1549 		kmem_free(name, MAXPATHLEN);
   1550 		return (ENOSPC);
   1551 	}
   1552 
   1553 	/* copy out the path name */
   1554 	if (copyout(name, uname, sz) != 0)
   1555 		err = EFAULT;
   1556 	kmem_free(name, MAXPATHLEN);
   1557 	return (err);
   1558 }
   1559 
   1560 static int
   1561 modctl_get_fbname(char *path)
   1562 {
   1563 	extern dev_t fbdev;
   1564 	char *pathname = NULL;
   1565 	int rval = 0;
   1566 
   1567 	/* make sure fbdev is set before we plunge in */
   1568 	if (fbdev == NODEV)
   1569 		return (ENODEV);
   1570 
   1571 	pathname = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
   1572 	if ((rval = ddi_dev_pathname(fbdev, S_IFCHR,
   1573 	    pathname)) == DDI_SUCCESS) {
   1574 		if (copyout(pathname, path, strlen(pathname)+1) != 0) {
   1575 			rval = EFAULT;
   1576 		}
   1577 	}
   1578 	kmem_free(pathname, MAXPATHLEN);
   1579 	return (rval);
   1580 }
   1581 
   1582 /*
   1583  * modctl_reread_dacf()
   1584  *	Reread the dacf rules database from the named binding file.
   1585  *	If NULL is specified, pass along the NULL, it means 'use the default'.
   1586  */
   1587 static int
   1588 modctl_reread_dacf(char *path)
   1589 {
   1590 	int rval = 0;
   1591 	char *filename, *filenamep;
   1592 
   1593 	filename = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
   1594 
   1595 	if (path == NULL) {
   1596 		filenamep = NULL;
   1597 	} else {
   1598 		if (copyinstr(path, filename, MAXPATHLEN, 0) != 0) {
   1599 			rval = EFAULT;
   1600 			goto out;
   1601 		}
   1602 		filenamep = filename;
   1603 		filenamep[MAXPATHLEN - 1] = '\0';
   1604 	}
   1605 
   1606 	rval = read_dacf_binding_file(filenamep);
   1607 out:
   1608 	kmem_free(filename, MAXPATHLEN);
   1609 	return (rval);
   1610 }
   1611 
   1612 /*ARGSUSED*/
   1613 static int
   1614 modctl_modevents(int subcmd, uintptr_t a2, uintptr_t a3, uintptr_t a4,
   1615     uint_t flag)
   1616 {
   1617 	int error = 0;
   1618 	char *filenamep;
   1619 
   1620 	switch (subcmd) {
   1621 
   1622 	case MODEVENTS_FLUSH:
   1623 		/* flush all currently queued events */
   1624 		log_sysevent_flushq(subcmd, flag);
   1625 		break;
   1626 
   1627 	case MODEVENTS_SET_DOOR_UPCALL_FILENAME:
   1628 		/*
   1629 		 * bind door_upcall to filename
   1630 		 * this should only be done once per invocation
   1631 		 * of the event daemon.
   1632 		 */
   1633 
   1634 		filenamep = kmem_zalloc(MOD_MAXPATH, KM_SLEEP);
   1635 
   1636 		if (copyinstr((char *)a2, filenamep, MOD_MAXPATH, 0)) {
   1637 			error = EFAULT;
   1638 		} else {
   1639 			error = log_sysevent_filename(filenamep);
   1640 		}
   1641 		kmem_free(filenamep, MOD_MAXPATH);
   1642 		break;
   1643 
   1644 	case MODEVENTS_GETDATA:
   1645 		error = log_sysevent_copyout_data((sysevent_id_t *)a2,
   1646 		    (size_t)a3, (caddr_t)a4);
   1647 		break;
   1648 
   1649 	case MODEVENTS_FREEDATA:
   1650 		error = log_sysevent_free_data((sysevent_id_t *)a2);
   1651 		break;
   1652 	case MODEVENTS_POST_EVENT:
   1653 		error = log_usr_sysevent((sysevent_t *)a2, (uint32_t)a3,
   1654 		    (sysevent_id_t *)a4);
   1655 		break;
   1656 	case MODEVENTS_REGISTER_EVENT:
   1657 		error = log_sysevent_register((char *)a2, (char *)a3,
   1658 		    (se_pubsub_t *)a4);
   1659 		break;
   1660 	default:
   1661 		error = EINVAL;
   1662 	}
   1663 
   1664 	return (error);
   1665 }
   1666 
   1667 static void
   1668 free_mperm(mperm_t *mp)
   1669 {
   1670 	int len;
   1671 
   1672 	if (mp->mp_minorname) {
   1673 		len = strlen(mp->mp_minorname) + 1;
   1674 		kmem_free(mp->mp_minorname, len);
   1675 	}
   1676 	kmem_free(mp, sizeof (mperm_t));
   1677 }
   1678 
   1679 #define	MP_NO_DRV_ERR	\
   1680 	"/etc/minor_perm: no driver for %s\n"
   1681 
   1682 #define	MP_EMPTY_MINOR	\
   1683 	"/etc/minor_perm: empty minor name for driver %s\n"
   1684 
   1685 #define	MP_NO_MINOR	\
   1686 	"/etc/minor_perm: no minor matching %s for driver %s\n"
   1687 
   1688 /*
   1689  * Remove mperm entry with matching minorname
   1690  */
   1691 static void
   1692 rem_minorperm(major_t major, char *drvname, mperm_t *mp, int is_clone)
   1693 {
   1694 	mperm_t **mp_head;
   1695 	mperm_t *freemp = NULL;
   1696 	struct devnames *dnp = &devnamesp[major];
   1697 	mperm_t **wildmp;
   1698 
   1699 	ASSERT(mp->mp_minorname && strlen(mp->mp_minorname) > 0);
   1700 
   1701 	LOCK_DEV_OPS(&dnp->dn_lock);
   1702 	if (strcmp(mp->mp_minorname, "*") == 0) {
   1703 		wildmp = ((is_clone == 0) ?
   1704 		    &dnp->dn_mperm_wild : &dnp->dn_mperm_clone);
   1705 		if (*wildmp)
   1706 			freemp = *wildmp;
   1707 		*wildmp = NULL;
   1708 	} else {
   1709 		mp_head = &dnp->dn_mperm;
   1710 		while (*mp_head) {
   1711 			if (strcmp((*mp_head)->mp_minorname,
   1712 			    mp->mp_minorname) != 0) {
   1713 				mp_head = &(*mp_head)->mp_next;
   1714 				continue;
   1715 			}
   1716 			/* remove the entry */
   1717 			freemp = *mp_head;
   1718 			*mp_head = freemp->mp_next;
   1719 			break;
   1720 		}
   1721 	}
   1722 	if (freemp) {
   1723 		if (moddebug & MODDEBUG_MINORPERM) {
   1724 			cmn_err(CE_CONT, "< %s %s 0%o %d %d\n",
   1725 			    drvname, freemp->mp_minorname,
   1726 			    freemp->mp_mode & 0777,
   1727 			    freemp->mp_uid, freemp->mp_gid);
   1728 		}
   1729 		free_mperm(freemp);
   1730 	} else {
   1731 		if (moddebug & MODDEBUG_MINORPERM) {
   1732 			cmn_err(CE_CONT, MP_NO_MINOR,
   1733 			    drvname, mp->mp_minorname);
   1734 		}
   1735 	}
   1736 
   1737 	UNLOCK_DEV_OPS(&dnp->dn_lock);
   1738 }
   1739 
   1740 /*
   1741  * Add minor perm entry
   1742  */
   1743 static void
   1744 add_minorperm(major_t major, char *drvname, mperm_t *mp, int is_clone)
   1745 {
   1746 	mperm_t **mp_head;
   1747 	mperm_t *freemp = NULL;
   1748 	struct devnames *dnp = &devnamesp[major];
   1749 	mperm_t **wildmp;
   1750 
   1751 	ASSERT(mp->mp_minorname && strlen(mp->mp_minorname) > 0);
   1752 
   1753 	/*
   1754 	 * Note that update_drv replace semantics require
   1755 	 * replacing matching entries with the new permissions.
   1756 	 */
   1757 	LOCK_DEV_OPS(&dnp->dn_lock);
   1758 	if (strcmp(mp->mp_minorname, "*") == 0) {
   1759 		wildmp = ((is_clone == 0) ?
   1760 		    &dnp->dn_mperm_wild : &dnp->dn_mperm_clone);
   1761 		if (*wildmp)
   1762 			freemp = *wildmp;
   1763 		*wildmp = mp;
   1764 	} else {
   1765 		mperm_t *p, *v = NULL;
   1766 		for (p = dnp->dn_mperm; p; v = p, p = p->mp_next) {
   1767 			if (strcmp(p->mp_minorname, mp->mp_minorname) == 0) {
   1768 				if (v == NULL)
   1769 					dnp->dn_mperm = mp;
   1770 				else
   1771 					v->mp_next = mp;
   1772 				mp->mp_next = p->mp_next;
   1773 				freemp = p;
   1774 				goto replaced;
   1775 			}
   1776 		}
   1777 		if (p == NULL) {
   1778 			mp_head = &dnp->dn_mperm;
   1779 			if (*mp_head == NULL) {
   1780 				*mp_head = mp;
   1781 			} else {
   1782 				mp->mp_next = *mp_head;
   1783 				*mp_head = mp;
   1784 			}
   1785 		}
   1786 	}
   1787 replaced:
   1788 	if (freemp) {
   1789 		if (moddebug & MODDEBUG_MINORPERM) {
   1790 			cmn_err(CE_CONT, "< %s %s 0%o %d %d\n",
   1791 			    drvname, freemp->mp_minorname,
   1792 			    freemp->mp_mode & 0777,
   1793 			    freemp->mp_uid, freemp->mp_gid);
   1794 		}
   1795 		free_mperm(freemp);
   1796 	}
   1797 	if (moddebug & MODDEBUG_MINORPERM) {
   1798 		cmn_err(CE_CONT, "> %s %s 0%o %d %d\n",
   1799 		    drvname, mp->mp_minorname, mp->mp_mode & 0777,
   1800 		    mp->mp_uid, mp->mp_gid);
   1801 	}
   1802 	UNLOCK_DEV_OPS(&dnp->dn_lock);
   1803 }
   1804 
   1805 
   1806 static int
   1807 process_minorperm(int cmd, nvlist_t *nvl)
   1808 {
   1809 	char *minor;
   1810 	major_t major;
   1811 	mperm_t *mp;
   1812 	nvpair_t *nvp;
   1813 	char *name;
   1814 	int is_clone;
   1815 	major_t minmaj;
   1816 
   1817 	ASSERT(cmd == MODLOADMINORPERM ||
   1818 	    cmd == MODADDMINORPERM || cmd == MODREMMINORPERM);
   1819 
   1820 	nvp = NULL;
   1821 	while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
   1822 		name = nvpair_name(nvp);
   1823 
   1824 		is_clone = 0;
   1825 		(void) nvpair_value_string(nvp, &minor);
   1826 		major = ddi_name_to_major(name);
   1827 		if (major != DDI_MAJOR_T_NONE) {
   1828 			mp = kmem_zalloc(sizeof (*mp), KM_SLEEP);
   1829 			if (minor == NULL || strlen(minor) == 0) {
   1830 				if (moddebug & MODDEBUG_MINORPERM) {
   1831 					cmn_err(CE_CONT, MP_EMPTY_MINOR, name);
   1832 				}
   1833 				minor = "*";
   1834 			}
   1835 
   1836 			/*
   1837 			 * The minor name of a node using the clone
   1838 			 * driver must be the driver name.  To avoid
   1839 			 * multiple searches, we map entries in the form
   1840 			 * clone:<driver> to <driver>:*.  This also allows us
   1841 			 * to filter out some of the litter in /etc/minor_perm.
   1842 			 * Minor perm alias entries where the name is not
   1843 			 * the driver kept on the clone list itself.
   1844 			 * This all seems very fragile as a driver could
   1845 			 * be introduced with an existing alias name.
   1846 			 */
   1847 			if (strcmp(name, "clone") == 0) {
   1848 				minmaj = ddi_name_to_major(minor);
   1849 				if (minmaj != DDI_MAJOR_T_NONE) {
   1850 					if (moddebug & MODDEBUG_MINORPERM) {
   1851 						cmn_err(CE_CONT,
   1852 						    "mapping %s:%s to %s:*\n",
   1853 						    name, minor, minor);
   1854 					}
   1855 					major = minmaj;
   1856 					name = minor;
   1857 					minor = "*";
   1858 					is_clone = 1;
   1859 				}
   1860 			}
   1861 
   1862 			if (mp) {
   1863 				mp->mp_minorname =
   1864 				    i_ddi_strdup(minor, KM_SLEEP);
   1865 			}
   1866 		} else {
   1867 			mp = NULL;
   1868 			if (moddebug & MODDEBUG_MINORPERM) {
   1869 				cmn_err(CE_CONT, MP_NO_DRV_ERR, name);
   1870 			}
   1871 		}
   1872 
   1873 		/* mode */
   1874 		nvp = nvlist_next_nvpair(nvl, nvp);
   1875 		ASSERT(strcmp(nvpair_name(nvp), "mode") == 0);
   1876 		if (mp)
   1877 			(void) nvpair_value_int32(nvp, (int *)&mp->mp_mode);
   1878 		/* uid */
   1879 		nvp = nvlist_next_nvpair(nvl, nvp);
   1880 		ASSERT(strcmp(nvpair_name(nvp), "uid") == 0);
   1881 		if (mp)
   1882 			(void) nvpair_value_uint32(nvp, &mp->mp_uid);
   1883 		/* gid */
   1884 		nvp = nvlist_next_nvpair(nvl, nvp);
   1885 		ASSERT(strcmp(nvpair_name(nvp), "gid") == 0);
   1886 		if (mp) {
   1887 			(void) nvpair_value_uint32(nvp, &mp->mp_gid);
   1888 
   1889 			if (cmd == MODREMMINORPERM) {
   1890 				rem_minorperm(major, name, mp, is_clone);
   1891 				free_mperm(mp);
   1892 			} else {
   1893 				add_minorperm(major, name, mp, is_clone);
   1894 			}
   1895 		}
   1896 	}
   1897 
   1898 	if (cmd == MODLOADMINORPERM)
   1899 		minorperm_loaded = 1;
   1900 
   1901 	/*
   1902 	 * Reset permissions of cached dv_nodes
   1903 	 */
   1904 	(void) devfs_reset_perm(DV_RESET_PERM);
   1905 
   1906 	return (0);
   1907 }
   1908 
   1909 static int
   1910 modctl_minorperm(int cmd, char *usrbuf, size_t buflen)
   1911 {
   1912 	int error;
   1913 	nvlist_t *nvl;
   1914 	char *buf = kmem_alloc(buflen, KM_SLEEP);
   1915 
   1916 	if ((error = ddi_copyin(usrbuf, buf, buflen, 0)) != 0) {
   1917 		kmem_free(buf, buflen);
   1918 		return (error);
   1919 	}
   1920 
   1921 	error = nvlist_unpack(buf, buflen, &nvl, KM_SLEEP);
   1922 	kmem_free(buf, buflen);
   1923 	if (error)
   1924 		return (error);
   1925 
   1926 	error = process_minorperm(cmd, nvl);
   1927 	nvlist_free(nvl);
   1928 	return (error);
   1929 }
   1930 
   1931 struct walk_args {
   1932 	char		*wa_drvname;
   1933 	list_t		wa_pathlist;
   1934 };
   1935 
   1936 struct path_elem {
   1937 	char		*pe_dir;
   1938 	char		*pe_nodename;
   1939 	list_node_t	pe_node;
   1940 	int		pe_dirlen;
   1941 };
   1942 
   1943 /*ARGSUSED*/
   1944 static int
   1945 modctl_inst_walker(const char *path, in_node_t *np, in_drv_t *dp, void *arg)
   1946 {
   1947 	struct walk_args *wargs = (struct walk_args *)arg;
   1948 	struct path_elem *pe;
   1949 	char *nodename;
   1950 
   1951 	/*
   1952 	 * Search may be restricted to a single driver in the case of rem_drv
   1953 	 */
   1954 	if (wargs->wa_drvname &&
   1955 	    strcmp(dp->ind_driver_name, wargs->wa_drvname) != 0)
   1956 		return (INST_WALK_CONTINUE);
   1957 
   1958 	pe = kmem_zalloc(sizeof (*pe), KM_SLEEP);
   1959 	pe->pe_dir = i_ddi_strdup((char *)path, KM_SLEEP);
   1960 	pe->pe_dirlen = strlen(pe->pe_dir) + 1;
   1961 	ASSERT(strrchr(pe->pe_dir, '/') != NULL);
   1962 	nodename = strrchr(pe->pe_dir, '/');
   1963 	*nodename++ = 0;
   1964 	pe->pe_nodename = nodename;
   1965 	list_insert_tail(&wargs->wa_pathlist, pe);
   1966 
   1967 	return (INST_WALK_CONTINUE);
   1968 }
   1969 
   1970 /*
   1971  * /devices attribute nodes clean-up optionally performed
   1972  * when removing a driver (rem_drv -C).
   1973  *
   1974  * Removing attribute nodes allows a machine to be reprovisioned
   1975  * without the side-effect of inadvertently picking up stale
   1976  * device node ownership or permissions.
   1977  *
   1978  * Preserving attributes (not performing cleanup) allows devices
   1979  * attribute changes to be preserved across upgrades, as
   1980  * upgrade rather heavy-handedly does a rem_drv/add_drv cycle.
   1981  */
   1982 static int
   1983 modctl_remdrv_cleanup(const char *u_drvname)
   1984 {
   1985 	struct walk_args *wargs;
   1986 	struct path_elem *pe;
   1987 	char *drvname;
   1988 	int err, rval = 0;
   1989 
   1990 	drvname = kmem_alloc(MAXMODCONFNAME, KM_SLEEP);
   1991 	if ((err = copyinstr(u_drvname, drvname, MAXMODCONFNAME, 0))) {
   1992 		kmem_free(drvname, MAXMODCONFNAME);
   1993 		return (err);
   1994 	}
   1995 
   1996 	/*
   1997 	 * First go through the instance database.  For each
   1998 	 * instance of a device bound to the driver being
   1999 	 * removed, remove any underlying devfs attribute nodes.
   2000 	 *
   2001 	 * This is a two-step process.	First we go through
   2002 	 * the instance data itself, constructing a list of
   2003 	 * the nodes discovered.  The second step is then
   2004 	 * to find and remove any devfs attribute nodes
   2005 	 * for the instances discovered in the first step.
   2006 	 * The two-step process avoids any difficulties
   2007 	 * which could arise by holding the instance data
   2008 	 * lock with simultaneous devfs operations.
   2009 	 */
   2010 	wargs = kmem_zalloc(sizeof (*wargs), KM_SLEEP);
   2011 
   2012 	wargs->wa_drvname = drvname;
   2013 	list_create(&wargs->wa_pathlist,
   2014 	    sizeof (struct path_elem), offsetof(struct path_elem, pe_node));
   2015 
   2016 	(void) e_ddi_walk_instances(modctl_inst_walker, (void *)wargs);
   2017 
   2018 	for (pe = list_head(&wargs->wa_pathlist); pe != NULL;
   2019 	    pe = list_next(&wargs->wa_pathlist, pe)) {
   2020 		err = devfs_remdrv_cleanup((const char *)pe->pe_dir,
   2021 		    (const char *)pe->pe_nodename);
   2022 		if (rval == 0)
   2023 			rval = err;
   2024 	}
   2025 
   2026 	while ((pe = list_head(&wargs->wa_pathlist)) != NULL) {
   2027 		list_remove(&wargs->wa_pathlist, pe);
   2028 		kmem_free(pe->pe_dir, pe->pe_dirlen);
   2029 		kmem_free(pe, sizeof (*pe));
   2030 	}
   2031 	kmem_free(wargs, sizeof (*wargs));
   2032 
   2033 	/*
   2034 	 * Pseudo nodes aren't recorded in the instance database
   2035 	 * so any such nodes need to be handled separately.
   2036 	 */
   2037 	err = devfs_remdrv_cleanup("pseudo", (const char *)drvname);
   2038 	if (rval == 0)
   2039 		rval = err;
   2040 
   2041 	kmem_free(drvname, MAXMODCONFNAME);
   2042 	return (rval);
   2043 }
   2044 
   2045 /*
   2046  * Perform a cleanup of non-existent /devices attribute nodes,
   2047  * similar to rem_drv -C, but for all drivers/devices.
   2048  * This is also optional, performed as part of devfsadm -C.
   2049  */
   2050 void
   2051 dev_devices_cleanup()
   2052 {
   2053 	struct walk_args *wargs;
   2054 	struct path_elem *pe;
   2055 	dev_info_t *devi;
   2056 	char *path;
   2057 	int err;
   2058 
   2059 	/*
   2060 	 * It's expected that all drivers have been loaded and
   2061 	 * module unloading disabled while performing cleanup.
   2062 	 */
   2063 	ASSERT(modunload_disable_count > 0);
   2064 
   2065 	wargs = kmem_zalloc(sizeof (*wargs), KM_SLEEP);
   2066 	wargs->wa_drvname = NULL;
   2067 	list_create(&wargs->wa_pathlist,
   2068 	    sizeof (struct path_elem), offsetof(struct path_elem, pe_node));
   2069 
   2070 	(void) e_ddi_walk_instances(modctl_inst_walker, (void *)wargs);
   2071 
   2072 	path = kmem_alloc(MAXPATHLEN, KM_SLEEP);
   2073 
   2074 	for (pe = list_head(&wargs->wa_pathlist); pe != NULL;
   2075 	    pe = list_next(&wargs->wa_pathlist, pe)) {
   2076 		(void) snprintf(path, MAXPATHLEN, "%s/%s",
   2077 		    pe->pe_dir, pe->pe_nodename);
   2078 		devi = e_ddi_hold_devi_by_path(path, 0);
   2079 		if (devi != NULL) {
   2080 			ddi_release_devi(devi);
   2081 		} else {
   2082 			err = devfs_remdrv_cleanup((const char *)pe->pe_dir,
   2083 			    (const char *)pe->pe_nodename);
   2084 			if (err) {
   2085 				cmn_err(CE_CONT,
   2086 				    "devfs: %s: clean-up error %d\n",
   2087 				    path, err);
   2088 			}
   2089 		}
   2090 	}
   2091 
   2092 	while ((pe = list_head(&wargs->wa_pathlist)) != NULL) {
   2093 		list_remove(&wargs->wa_pathlist, pe);
   2094 		kmem_free(pe->pe_dir, pe->pe_dirlen);
   2095 		kmem_free(pe, sizeof (*pe));
   2096 	}
   2097 	kmem_free(wargs, sizeof (*wargs));
   2098 	kmem_free(path, MAXPATHLEN);
   2099 }
   2100 
   2101 static int
   2102 modctl_allocpriv(const char *name)
   2103 {
   2104 	char *pstr = kmem_alloc(PRIVNAME_MAX, KM_SLEEP);
   2105 	int error;
   2106 
   2107 	if ((error = copyinstr(name, pstr, PRIVNAME_MAX, 0))) {
   2108 		kmem_free(pstr, PRIVNAME_MAX);
   2109 		return (error);
   2110 	}
   2111 	error = priv_getbyname(pstr, PRIV_ALLOC);
   2112 	if (error < 0)
   2113 		error = -error;
   2114 	else
   2115 		error = 0;
   2116 	kmem_free(pstr, PRIVNAME_MAX);
   2117 	return (error);
   2118 }
   2119 
   2120 static int
   2121 modctl_devexists(const char *upath, int pathlen)
   2122 {
   2123 	char	*path;
   2124 	int	ret;
   2125 
   2126 	/*
   2127 	 * copy in the path, including the terminating null
   2128 	 */
   2129 	pathlen++;
   2130 	if (pathlen <= 1 || pathlen > MAXPATHLEN)
   2131 		return (EINVAL);
   2132 	path = kmem_zalloc(pathlen + 1, KM_SLEEP);
   2133 	if ((ret = copyinstr(upath, path, pathlen, NULL)) == 0) {
   2134 		ret = sdev_modctl_devexists(path);
   2135 	}
   2136 
   2137 	kmem_free(path, pathlen + 1);
   2138 	return (ret);
   2139 }
   2140 
   2141 static int
   2142 modctl_devreaddir(const char *udir, int udirlen,
   2143     char *upaths, int64_t *ulensp)
   2144 {
   2145 	char	*paths = NULL;
   2146 	char	**dirlist = NULL;
   2147 	char	*dir;
   2148 	int64_t	ulens;
   2149 	int64_t	lens;
   2150 	int	i, n;
   2151 	int	ret = 0;
   2152 	char	*p;
   2153 	int	npaths;
   2154 	int	npaths_alloc;
   2155 
   2156 	/*
   2157 	 * If upaths is NULL then we are only computing the amount of space
   2158 	 * needed to return the paths, with the value returned in *ulensp. If we
   2159 	 * are copying out paths then we get the amount of space allocated by
   2160 	 * the caller. If the actual space needed for paths is larger, or
   2161 	 * things are changing out from under us, then we return EAGAIN.
   2162 	 */
   2163 	if (upaths) {
   2164 		if (ulensp == NULL)
   2165 			return (EINVAL);
   2166 		if (copyin(ulensp, &ulens, sizeof (ulens)) != 0)
   2167 			return (EFAULT);
   2168 	}
   2169 
   2170 	/*
   2171 	 * copyin the /dev path including terminating null
   2172 	 */
   2173 	udirlen++;
   2174 	if (udirlen <= 1 || udirlen > MAXPATHLEN)
   2175 		return (EINVAL);
   2176 	dir = kmem_zalloc(udirlen + 1, KM_SLEEP);
   2177 	if ((ret = copyinstr(udir, dir, udirlen, NULL)) != 0)
   2178 		goto err;
   2179 
   2180 	if ((ret = sdev_modctl_readdir(dir, &dirlist,
   2181 	    &npaths, &npaths_alloc, 0)) != 0) {
   2182 		ASSERT(dirlist == NULL);
   2183 		goto err;
   2184 	}
   2185 
   2186 	lens = 0;
   2187 	for (i = 0; i < npaths; i++) {
   2188 		lens += strlen(dirlist[i]) + 1;
   2189 	}
   2190 	lens++;		/* add one for double termination */
   2191 
   2192 	if (upaths) {
   2193 		if (lens > ulens) {
   2194 			ret = EAGAIN;
   2195 			goto out;
   2196 		}
   2197 
   2198 		paths = kmem_alloc(lens, KM_SLEEP);
   2199 
   2200 		p = paths;
   2201 		for (i = 0; i < npaths; i++) {
   2202 			n = strlen(dirlist[i]) + 1;
   2203 			bcopy(dirlist[i], p, n);
   2204 			p += n;
   2205 		}
   2206 		*p = 0;
   2207 
   2208 		if (copyout(paths, upaths, lens)) {
   2209 			ret = EFAULT;
   2210 			goto err;
   2211 		}
   2212 	}
   2213 
   2214 out:
   2215 	/* copy out the amount of space needed to hold the paths */
   2216 	if (copyout(&lens, ulensp, sizeof (lens)))
   2217 		ret = EFAULT;
   2218 
   2219 err:
   2220 	if (dirlist)
   2221 		sdev_modctl_readdir_free(dirlist, npaths, npaths_alloc);
   2222 	if (paths)
   2223 		kmem_free(paths, lens);
   2224 	kmem_free(dir, udirlen + 1);
   2225 	return (ret);
   2226 }
   2227 
   2228 static int
   2229 modctl_devemptydir(const char *udir, int udirlen, int *uempty)
   2230 {
   2231 	char	*dir;
   2232 	int	ret;
   2233 	char	**dirlist = NULL;
   2234 	int	npaths;
   2235 	int	npaths_alloc;
   2236 	int	empty;
   2237 
   2238 	/*
   2239 	 * copyin the /dev path including terminating null
   2240 	 */
   2241 	udirlen++;
   2242 	if (udirlen <= 1 || udirlen > MAXPATHLEN)
   2243 		return (EINVAL);
   2244 	dir = kmem_zalloc(udirlen + 1, KM_SLEEP);
   2245 	if ((ret = copyinstr(udir, dir, udirlen, NULL)) != 0)
   2246 		goto err;
   2247 
   2248 	if ((ret = sdev_modctl_readdir(dir, &dirlist,
   2249 	    &npaths, &npaths_alloc, 1)) != 0) {
   2250 		goto err;
   2251 	}
   2252 
   2253 	empty = npaths ? 0 : 1;
   2254 	if (copyout(&empty, uempty, sizeof (empty)))
   2255 		ret = EFAULT;
   2256 
   2257 err:
   2258 	if (dirlist)
   2259 		sdev_modctl_readdir_free(dirlist, npaths, npaths_alloc);
   2260 	kmem_free(dir, udirlen + 1);
   2261 	return (ret);
   2262 }
   2263 
   2264 static int
   2265 modctl_hp(int subcmd, const char *path, char *cn_name, uintptr_t arg,
   2266     uintptr_t rval)
   2267 {
   2268 	int error = 0;
   2269 	size_t pathsz, namesz;
   2270 	char *devpath, *cn_name_str;
   2271 
   2272 	if (path == NULL)
   2273 		return (EINVAL);
   2274 
   2275 	devpath = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
   2276 	error = copyinstr(path, devpath, MAXPATHLEN, &pathsz);
   2277 	if (error != 0) {
   2278 		kmem_free(devpath, MAXPATHLEN);
   2279 		return (EFAULT);
   2280 	}
   2281 
   2282 	cn_name_str = kmem_zalloc(MAXNAMELEN, KM_SLEEP);
   2283 	error = copyinstr(cn_name, cn_name_str, MAXNAMELEN, &namesz);
   2284 	if (error != 0) {
   2285 		kmem_free(devpath, MAXPATHLEN);
   2286 		kmem_free(cn_name_str, MAXNAMELEN);
   2287 
   2288 		return (EFAULT);
   2289 	}
   2290 
   2291 	switch (subcmd) {
   2292 	case MODHPOPS_CHANGE_STATE:
   2293 		error = ddihp_modctl(DDI_HPOP_CN_CHANGE_STATE, devpath,
   2294 		    cn_name_str, arg, NULL);
   2295 		break;
   2296 	case MODHPOPS_CREATE_PORT:
   2297 		/* Create an empty PORT */
   2298 		error = ddihp_modctl(DDI_HPOP_CN_CREATE_PORT, devpath,
   2299 		    cn_name_str, NULL, NULL);
   2300 		break;
   2301 	case MODHPOPS_REMOVE_PORT:
   2302 		/* Remove an empty PORT */
   2303 		error = ddihp_modctl(DDI_HPOP_CN_REMOVE_PORT, devpath,
   2304 		    cn_name_str, NULL, NULL);
   2305 		break;
   2306 	case MODHPOPS_BUS_GET:
   2307 		error = ddihp_modctl(DDI_HPOP_CN_GET_PROPERTY, devpath,
   2308 		    cn_name_str, arg, rval);
   2309 		break;
   2310 	case MODHPOPS_BUS_SET:
   2311 		error = ddihp_modctl(DDI_HPOP_CN_SET_PROPERTY, devpath,
   2312 		    cn_name_str, arg, rval);
   2313 		break;
   2314 	default:
   2315 		error = ENOTSUP;
   2316 		break;
   2317 	}
   2318 
   2319 	kmem_free(devpath, MAXPATHLEN);
   2320 	kmem_free(cn_name_str, MAXNAMELEN);
   2321 
   2322 	return (error);
   2323 }
   2324 
   2325 int
   2326 modctl_moddevname(int subcmd, uintptr_t a1, uintptr_t a2)
   2327 {
   2328 	int error = 0;
   2329 
   2330 	switch (subcmd) {
   2331 	case MODDEVNAME_LOOKUPDOOR:
   2332 		error = devname_filename_register((char *)a1);
   2333 		break;
   2334 	case MODDEVNAME_PROFILE:
   2335 		error = devname_profile_update((char *)a1, (size_t)a2);
   2336 		break;
   2337 	case MODDEVNAME_RECONFIG:
   2338 		i_ddi_set_reconfig();
   2339 		break;
   2340 	case MODDEVNAME_SYSAVAIL:
   2341 		i_ddi_set_sysavail();
   2342 		break;
   2343 	default:
   2344 		error = EINVAL;
   2345 		break;
   2346 	}
   2347 
   2348 	return (error);
   2349 }
   2350 
   2351 /*ARGSUSED5*/
   2352 int
   2353 modctl(int cmd, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4,
   2354     uintptr_t a5)
   2355 {
   2356 	int	error = EINVAL;
   2357 	dev_t	dev;
   2358 
   2359 	if (secpolicy_modctl(CRED(), cmd) != 0)
   2360 		return (set_errno(EPERM));
   2361 
   2362 	switch (cmd) {
   2363 	case MODLOAD:		/* load a module */
   2364 		error = modctl_modload((int)a1, (char *)a2, (int *)a3);
   2365 		break;
   2366 
   2367 	case MODUNLOAD:		/* unload a module */
   2368 		error = modctl_modunload((modid_t)a1);
   2369 		break;
   2370 
   2371 	case MODINFO:		/* get module status */
   2372 		error = modctl_modinfo((modid_t)a1, (struct modinfo *)a2);
   2373 		break;
   2374 
   2375 	case MODRESERVED:	/* get last major number in range */
   2376 		error = modctl_modreserve((modid_t)a1, (int *)a2);
   2377 		break;
   2378 
   2379 	case MODSETMINIROOT:	/* we are running in miniroot */
   2380 		isminiroot = 1;
   2381 		error = 0;
   2382 		break;
   2383 
   2384 	case MODADDMAJBIND:	/* add major / driver alias bindings */
   2385 		error = modctl_add_driver_aliases((int *)a2);
   2386 		break;
   2387 
   2388 	case MODGETPATHLEN:	/* get modpath length */
   2389 		error = modctl_getmodpathlen((int *)a2);
   2390 		break;
   2391 
   2392 	case MODGETPATH:	/* get modpath */
   2393 		error = modctl_getmodpath((char *)a2);
   2394 		break;
   2395 
   2396 	case MODREADSYSBIND:	/* read system call binding file */
   2397 		error = modctl_read_sysbinding_file();
   2398 		break;
   2399 
   2400 	case MODGETMAJBIND:	/* get major number for named device */
   2401 		error = modctl_getmaj((char *)a1, (uint_t)a2, (int *)a3);
   2402 		break;
   2403 
   2404 	case MODGETNAME:	/* get name of device given major number */
   2405 		error = modctl_getname((char *)a1, (uint_t)a2, (int *)a3);
   2406 		break;
   2407 
   2408 	case MODDEVT2INSTANCE:
   2409 		if (get_udatamodel() == DATAMODEL_NATIVE) {
   2410 			dev = (dev_t)a1;
   2411 		}
   2412 #ifdef _SYSCALL32_IMPL
   2413 		else {
   2414 			dev = expldev(a1);
   2415 		}
   2416 #endif
   2417 		error = modctl_devt2instance(dev, (int *)a2);
   2418 		break;
   2419 
   2420 	case MODSIZEOF_DEVID:	/* sizeof device id of device given dev_t */
   2421 		if (get_udatamodel() == DATAMODEL_NATIVE) {
   2422 			dev = (dev_t)a1;
   2423 		}
   2424 #ifdef _SYSCALL32_IMPL
   2425 		else {
   2426 			dev = expldev(a1);
   2427 		}
   2428 #endif
   2429 		error = modctl_sizeof_devid(dev, (uint_t *)a2);
   2430 		break;
   2431 
   2432 	case MODGETDEVID:	/* get device id of device given dev_t */
   2433 		if (get_udatamodel() == DATAMODEL_NATIVE) {
   2434 			dev = (dev_t)a1;
   2435 		}
   2436 #ifdef _SYSCALL32_IMPL
   2437 		else {
   2438 			dev = expldev(a1);
   2439 		}
   2440 #endif
   2441 		error = modctl_get_devid(dev, (uint_t)a2, (ddi_devid_t)a3);
   2442 		break;
   2443 
   2444 	case MODSIZEOF_MINORNAME:	/* sizeof minor nm (dev_t,spectype) */
   2445 		if (get_udatamodel() == DATAMODEL_NATIVE) {
   2446 			error = modctl_sizeof_minorname((dev_t)a1, (int)a2,
   2447 			    (uint_t *)a3);
   2448 		}
   2449 #ifdef _SYSCALL32_IMPL
   2450 		else {
   2451 			error = modctl_sizeof_minorname(expldev(a1), (int)a2,
   2452 			    (uint_t *)a3);
   2453 		}
   2454 
   2455 #endif
   2456 		break;
   2457 
   2458 	case MODGETMINORNAME:		/* get minor name of (dev_t,spectype) */
   2459 		if (get_udatamodel() == DATAMODEL_NATIVE) {
   2460 			error = modctl_get_minorname((dev_t)a1, (int)a2,
   2461 			    (uint_t)a3, (char *)a4);
   2462 		}
   2463 #ifdef _SYSCALL32_IMPL
   2464 		else {
   2465 			error = modctl_get_minorname(expldev(a1), (int)a2,
   2466 			    (uint_t)a3, (char *)a4);
   2467 		}
   2468 #endif
   2469 		break;
   2470 
   2471 	case MODGETDEVFSPATH_LEN:	/* sizeof path nm of (dev_t,spectype) */
   2472 		if (get_udatamodel() == DATAMODEL_NATIVE) {
   2473 			error = modctl_devfspath_len((dev_t)a1, (int)a2,
   2474 			    (uint_t *)a3);
   2475 		}
   2476 #ifdef _SYSCALL32_IMPL
   2477 		else {
   2478 			error = modctl_devfspath_len(expldev(a1), (int)a2,
   2479 			    (uint_t *)a3);
   2480 		}
   2481 
   2482 #endif
   2483 		break;
   2484 
   2485 	case MODGETDEVFSPATH:		/* get path name of (dev_t,spec) type */
   2486 		if (get_udatamodel() == DATAMODEL_NATIVE) {
   2487 			error = modctl_devfspath((dev_t)a1, (int)a2,
   2488 			    (uint_t)a3, (char *)a4);
   2489 		}
   2490 #ifdef _SYSCALL32_IMPL
   2491 		else {
   2492 			error = modctl_devfspath(expldev(a1), (int)a2,
   2493 			    (uint_t)a3, (char *)a4);
   2494 		}
   2495 #endif
   2496 		break;
   2497 
   2498 	case MODGETDEVFSPATH_MI_LEN:	/* sizeof path nm of (major,instance) */
   2499 		error = modctl_devfspath_mi_len((major_t)a1, (int)a2,
   2500 		    (uint_t *)a3);
   2501 		break;
   2502 
   2503 	case MODGETDEVFSPATH_MI:	/* get path name of (major,instance) */
   2504 		error = modctl_devfspath_mi((major_t)a1, (int)a2,
   2505 		    (uint_t)a3, (char *)a4);
   2506 		break;
   2507 
   2508 
   2509 	case MODEVENTS:
   2510 		error = modctl_modevents((int)a1, a2, a3, a4, (uint_t)a5);
   2511 		break;
   2512 
   2513 	case MODGETFBNAME:	/* get the framebuffer name */
   2514 		error = modctl_get_fbname((char *)a1);
   2515 		break;
   2516 
   2517 	case MODREREADDACF:	/* reread dacf rule database from given file */
   2518 		error = modctl_reread_dacf((char *)a1);
   2519 		break;
   2520 
   2521 	case MODLOADDRVCONF:	/* load driver.conf file for major */
   2522 		error = modctl_load_drvconf((major_t)a1, (int)a2);
   2523 		break;
   2524 
   2525 	case MODUNLOADDRVCONF:	/* unload driver.conf file for major */
   2526 		error = modctl_unload_drvconf((major_t)a1);
   2527 		break;
   2528 
   2529 	case MODREMMAJBIND:	/* remove a major binding */
   2530 		error = modctl_rem_major((major_t)a1);
   2531 		break;
   2532 
   2533 	case MODREMDRVALIAS:	/* remove a major/alias binding */
   2534 		error = modctl_remove_driver_aliases((int *)a2);
   2535 		break;
   2536 
   2537 	case MODDEVID2PATHS:	/* get paths given devid */
   2538 		error = modctl_devid2paths((ddi_devid_t)a1, (char *)a2,
   2539 		    (uint_t)a3, (size_t *)a4, (char *)a5);
   2540 		break;
   2541 
   2542 	case MODSETDEVPOLICY:	/* establish device policy */
   2543 		error = devpolicy_load((int)a1, (size_t)a2, (devplcysys_t *)a3);
   2544 		break;
   2545 
   2546 	case MODGETDEVPOLICY:	/* get device policy */
   2547 		error = devpolicy_get((int *)a1, (size_t)a2,
   2548 		    (devplcysys_t *)a3);
   2549 		break;
   2550 
   2551 	case MODALLOCPRIV:
   2552 		error = modctl_allocpriv((const char *)a1);
   2553 		break;
   2554 
   2555 	case MODGETDEVPOLICYBYNAME:
   2556 		error = devpolicy_getbyname((size_t)a1,
   2557 		    (devplcysys_t *)a2, (char *)a3);
   2558 		break;
   2559 
   2560 	case MODLOADMINORPERM:
   2561 	case MODADDMINORPERM:
   2562 	case MODREMMINORPERM:
   2563 		error = modctl_minorperm(cmd, (char *)a1, (size_t)a2);
   2564 		break;
   2565 
   2566 	case MODREMDRVCLEANUP:
   2567 		error = modctl_remdrv_cleanup((const char *)a1);
   2568 		break;
   2569 
   2570 	case MODDEVEXISTS:	/* non-reconfiguring /dev lookup */
   2571 		error = modctl_devexists((const char *)a1, (size_t)a2);
   2572 		break;
   2573 
   2574 	case MODDEVREADDIR:	/* non-reconfiguring /dev readdir */
   2575 		error = modctl_devreaddir((const char *)a1, (size_t)a2,
   2576 		    (char *)a3, (int64_t *)a4);
   2577 		break;
   2578 
   2579 	case MODDEVEMPTYDIR:	/* non-reconfiguring /dev emptydir */
   2580 		error = modctl_devemptydir((const char *)a1, (size_t)a2,
   2581 		    (int *)a3);
   2582 		break;
   2583 
   2584 	case MODDEVNAME:
   2585 		error = modctl_moddevname((int)a1, a2, a3);
   2586 		break;
   2587 
   2588 	case MODRETIRE:	/* retire device named by physpath a1 */
   2589 		error = modctl_retire((char *)a1, (char *)a2, (size_t)a3);
   2590 		break;
   2591 
   2592 	case MODISRETIRED:  /* check if a device is retired. */
   2593 		error = modctl_is_retired((char *)a1, (int *)a2);
   2594 		break;
   2595 
   2596 	case MODUNRETIRE:	/* unretire device named by physpath a1 */
   2597 		error = modctl_unretire((char *)a1);
   2598 		break;
   2599 
   2600 	case MODHPOPS:	/* hotplug operations */
   2601 		/* device named by physpath a2 and Connection name a3 */
   2602 		error = modctl_hp((int)a1, (char *)a2, (char *)a3, a4, a5);
   2603 		break;
   2604 
   2605 	default:
   2606 		error = EINVAL;
   2607 		break;
   2608 	}
   2609 
   2610 	return (error ? set_errno(error) : 0);
   2611 }
   2612 
   2613 /*
   2614  * Calls to kobj_load_module()() are handled off to this routine in a
   2615  * separate thread.
   2616  */
   2617 static void
   2618 modload_thread(struct loadmt *ltp)
   2619 {
   2620 	/* load the module and signal the creator of this thread */
   2621 	kmutex_t	cpr_lk;
   2622 	callb_cpr_t	cpr_i;
   2623 
   2624 	mutex_init(&cpr_lk, NULL, MUTEX_DEFAULT, NULL);
   2625 	CALLB_CPR_INIT(&cpr_i, &cpr_lk, callb_generic_cpr, "modload");
   2626 	/* borrow the devi lock from thread which invoked us */
   2627 	pm_borrow_lock(ltp->owner);
   2628 	ltp->retval = kobj_load_module(ltp->mp, ltp->usepath);
   2629 	pm_return_lock();
   2630 	sema_v(&ltp->sema);
   2631 	mutex_enter(&cpr_lk);
   2632 	CALLB_CPR_EXIT(&cpr_i);
   2633 	mutex_destroy(&cpr_lk);
   2634 	thread_exit();
   2635 }
   2636 
   2637 /*
   2638  * load a module, adding a reference if caller specifies rmodp.  If rmodp
   2639  * is specified then an errno is returned, otherwise a module index is
   2640  * returned (-1 on error).
   2641  */
   2642 static int
   2643 modrload(const char *subdir, const char *filename, struct modctl **rmodp)
   2644 {
   2645 	struct modctl *modp;
   2646 	size_t size;
   2647 	char *fullname;
   2648 	int retval = EINVAL;
   2649 	int id = -1;
   2650 
   2651 	if (rmodp)
   2652 		*rmodp = NULL;			/* avoid garbage */
   2653 
   2654 	if (subdir != NULL) {
   2655 		/*
   2656 		 * refuse / in filename to prevent "../" escapes.
   2657 		 */
   2658 		if (strchr(filename, '/') != NULL)
   2659 			return (rmodp ? retval : id);
   2660 
   2661 		/*
   2662 		 * allocate enough space for <subdir>/<filename><NULL>
   2663 		 */
   2664 		size = strlen(subdir) + strlen(filename) + 2;
   2665 		fullname = kmem_zalloc(size, KM_SLEEP);
   2666 		(void) sprintf(fullname, "%s/%s", subdir, filename);
   2667 	} else {
   2668 		fullname = (char *)filename;
   2669 	}
   2670 
   2671 	modp = mod_hold_installed_mod(fullname, 1, 0, &retval);
   2672 	if (modp != NULL) {
   2673 		id = modp->mod_id;
   2674 		if (rmodp) {
   2675 			/* add mod_ref and return *rmodp */
   2676 			mutex_enter(&mod_lock);
   2677 			modp->mod_ref++;
   2678 			mutex_exit(&mod_lock);
   2679 			*rmodp = modp;
   2680 		}
   2681 		mod_release_mod(modp);
   2682 		CPU_STATS_ADDQ(CPU, sys, modload, 1);
   2683 	}
   2684 
   2685 done:	if (subdir != NULL)
   2686 		kmem_free(fullname, size);
   2687 	return (rmodp ? retval : id);
   2688 }
   2689 
   2690 /*
   2691  * This is the primary kernel interface to load a module. It loads and
   2692  * installs the named module.  It does not hold mod_ref of the module, so
   2693  * a module unload attempt can occur at any time - it is up to the
   2694  * _fini/mod_remove implementation to determine if unload will succeed.
   2695  */
   2696 int
   2697 modload(const char *subdir, const char *filename)
   2698 {
   2699 	return (modrload(subdir, filename, NULL));
   2700 }
   2701 
   2702 /*
   2703  * Load a module using a series of qualified names from most specific to least
   2704  * specific, e.g. for subdir "foo", p1 "bar", p2 "baz", we might try:
   2705  *			Value returned in *chosen
   2706  * foo/bar.baz.1.2.3	3
   2707  * foo/bar.baz.1.2	2
   2708  * foo/bar.baz.1	1
   2709  * foo/bar.baz		0
   2710  *
   2711  * Return the module ID on success; -1 if no module was loaded.  On success
   2712  * and if 'chosen' is not NULL we also return the number of suffices that
   2713  * were in the module we chose to load.
   2714  */
   2715 int
   2716 modload_qualified(const char *subdir, const char *p1,
   2717     const char *p2, const char *delim, uint_t suffv[], int suffc, int *chosen)
   2718 {
   2719 	char path[MOD_MAXPATH];
   2720 	size_t n, resid = sizeof (path);
   2721 	char *p = path;
   2722 
   2723 	char **dotv;
   2724 	int i, rc, id;
   2725 	modctl_t *mp;
   2726 
   2727 	if (p2 != NULL)
   2728 		n = snprintf(p, resid, "%s/%s%s%s", subdir, p1, delim, p2);
   2729 	else
   2730 		n = snprintf(p, resid, "%s/%s", subdir, p1);
   2731 
   2732 	if (n >= resid)
   2733 		return (-1);
   2734 
   2735 	p += n;
   2736 	resid -= n;
   2737 	dotv = kmem_alloc(sizeof (char *) * (suffc + 1), KM_SLEEP);
   2738 
   2739 	for (i = 0; i < suffc; i++) {
   2740 		dotv[i] = p;
   2741 		n = snprintf(p, resid, "%s%u", delim, suffv[i]);
   2742 
   2743 		if (n >= resid) {
   2744 			kmem_free(dotv, sizeof (char *) * (suffc + 1));
   2745 			return (-1);
   2746 		}
   2747 
   2748 		p += n;
   2749 		resid -= n;
   2750 	}
   2751 
   2752 	dotv[suffc] = p;
   2753 
   2754 	for (i = suffc; i >= 0; i--) {
   2755 		dotv[i][0] = '\0';
   2756 		mp = mod_hold_installed_mod(path, 1, 1, &rc);
   2757 
   2758 		if (mp != NULL) {
   2759 			kmem_free(dotv, sizeof (char *) * (suffc + 1));
   2760 			id = mp->mod_id;
   2761 			mod_release_mod(mp);
   2762 			if (chosen != NULL)
   2763 				*chosen = i;
   2764 			return (id);
   2765 		}
   2766 	}
   2767 
   2768 	kmem_free(dotv, sizeof (char *) * (suffc + 1));
   2769 	return (-1);
   2770 }
   2771 
   2772 /*
   2773  * Load a module.
   2774  */
   2775 int
   2776 modloadonly(const char *subdir, const char *filename)
   2777 {
   2778 	struct modctl *modp;
   2779 	char *fullname;
   2780 	size_t size;
   2781 	int id, retval;
   2782 
   2783 	if (subdir != NULL) {
   2784 		/*
   2785 		 * allocate enough space for <subdir>/<filename><NULL>
   2786 		 */
   2787 		size = strlen(subdir) + strlen(filename) + 2;
   2788 		fullname = kmem_zalloc(size, KM_SLEEP);
   2789 		(void) sprintf(fullname, "%s/%s", subdir, filename);
   2790 	} else {
   2791 		fullname = (char *)filename;
   2792 	}
   2793 
   2794 	modp = mod_hold_loaded_mod(NULL, fullname, &retval);
   2795 	if (modp) {
   2796 		id = modp->mod_id;
   2797 		mod_release_mod(modp);
   2798 	}
   2799 
   2800 	if (subdir != NULL)
   2801 		kmem_free(fullname, size);
   2802 
   2803 	if (retval == 0)
   2804 		return (id);
   2805 	return (-1);
   2806 }
   2807 
   2808 /*
   2809  * Try to uninstall and unload a module, removing a reference if caller
   2810  * specifies rmodp.
   2811  */
   2812 static int
   2813 modunrload(modid_t id, struct modctl **rmodp, int unload)
   2814 {
   2815 	struct modctl	*modp;
   2816 	int		retval;
   2817 
   2818 	if (rmodp)
   2819 		*rmodp = NULL;			/* avoid garbage */
   2820 
   2821 	if ((modp = mod_hold_by_id((modid_t)id)) == NULL)
   2822 		return (EINVAL);
   2823 
   2824 	if (rmodp) {
   2825 		mutex_enter(&mod_lock);
   2826 		modp->mod_ref--;
   2827 		mutex_exit(&mod_lock);
   2828 		*rmodp = modp;
   2829 	}
   2830 
   2831 	if (unload) {
   2832 		retval = moduninstall(modp);
   2833 		if (retval == 0) {
   2834 			mod_unload(modp);
   2835 			CPU_STATS_ADDQ(CPU, sys, modunload, 1);
   2836 		} else if (retval == EALREADY)
   2837 			retval = 0;	/* already unloaded, not an error */
   2838 	} else
   2839 		retval = 0;
   2840 
   2841 	mod_release_mod(modp);
   2842 	return (retval);
   2843 }
   2844 
   2845 /*
   2846  * Uninstall and unload a module.
   2847  */
   2848 int
   2849 modunload(modid_t id)
   2850 {
   2851 	int		retval;
   2852 
   2853 	/* synchronize with any active modunload_disable() */
   2854 	modunload_begin();
   2855 	if (ddi_root_node())
   2856 		(void) devfs_clean(ddi_root_node(), NULL, 0);
   2857 	retval = modunrload(id, NULL, 1);
   2858 	modunload_end();
   2859 	return (retval);
   2860 }
   2861 
   2862 /*
   2863  * Return status of a loaded module.
   2864  */
   2865 static int
   2866 modinfo(modid_t id, struct modinfo *modinfop)
   2867 {
   2868 	struct modctl	*modp;
   2869 	modid_t		mid;
   2870 	int		i;
   2871 
   2872 	mid = modinfop->mi_id;
   2873 	if (modinfop->mi_info & MI_INFO_ALL) {
   2874 		while ((modp = mod_hold_next_by_id(mid++)) != NULL) {
   2875 			if ((modinfop->mi_info & MI_INFO_CNT) ||
   2876 			    modp->mod_installed)
   2877 				break;
   2878 			mod_release_mod(modp);
   2879 		}
   2880 		if (modp == NULL)
   2881 			return (EINVAL);
   2882 	} else {
   2883 		modp = mod_hold_by_id(id);
   2884 		if (modp == NULL)
   2885 			return (EINVAL);
   2886 		if (!(modinfop->mi_info & MI_INFO_CNT) &&
   2887 		    (modp->mod_installed == 0)) {
   2888 			mod_release_mod(modp);
   2889 			return (EINVAL);
   2890 		}
   2891 	}
   2892 
   2893 	modinfop->mi_rev = 0;
   2894 	modinfop->mi_state = 0;
   2895 	for (i = 0; i < MODMAXLINK; i++) {
   2896 		modinfop->mi_msinfo[i].msi_p0 = -1;
   2897 		modinfop->mi_msinfo[i].msi_linkinfo[0] = 0;
   2898 	}
   2899 	if (modp->mod_loaded) {
   2900 		modinfop->mi_state = MI_LOADED;
   2901 		kobj_getmodinfo(modp->mod_mp, modinfop);
   2902 	}
   2903 	if (modp->mod_installed) {
   2904 		modinfop->mi_state |= MI_INSTALLED;
   2905 
   2906 		(void) mod_getinfo(modp, modinfop);
   2907 	}
   2908 
   2909 	modinfop->mi_id = modp->mod_id;
   2910 	modinfop->mi_loadcnt = modp->mod_loadcnt;
   2911 	(void) strcpy(modinfop->mi_name, modp->mod_modname);
   2912 
   2913 	mod_release_mod(modp);
   2914 	return (0);
   2915 }
   2916 
   2917 static char mod_stub_err[] = "mod_hold_stub: Couldn't load stub module %s";
   2918 static char no_err[] = "No error function for weak stub %s";
   2919 
   2920 /*
   2921  * used by the stubs themselves to load and hold a module.
   2922  * Returns  0 if the module is successfully held;
   2923  *	    the stub needs to call mod_release_stub().
   2924  *	    -1 if the stub should just call the err_fcn.
   2925  * Note that this code is stretched out so that we avoid subroutine calls
   2926  * and optimize for the most likely case.  That is, the case where the
   2927  * module is loaded and installed and not held.  In that case we just inc
   2928  * the mod_ref count and continue.
   2929  */
   2930 int
   2931 mod_hold_stub(struct mod_stub_info *stub)
   2932 {
   2933 	struct modctl *mp;
   2934 	struct mod_modinfo *mip;
   2935 
   2936 	mip = stub->mods_modinfo;
   2937 
   2938 	mutex_enter(&mod_lock);
   2939 
   2940 	/* we do mod_hold_by_modctl inline for speed */
   2941 
   2942 mod_check_again:
   2943 	if ((mp = mip->mp) != NULL) {
   2944 		if (mp->mod_busy == 0) {
   2945 			if (mp->mod_installed) {
   2946 				/* increment the reference count */
   2947 				mp->mod_ref++;
   2948 				ASSERT(mp->mod_ref && mp->mod_installed);
   2949 				mutex_exit(&mod_lock);
   2950 				return (0);
   2951 			} else {
   2952 				mp->mod_busy = 1;
   2953 				mp->mod_inprogress_thread =
   2954 				    (curthread == NULL ?
   2955 				    (kthread_id_t)-1 : curthread);
   2956 			}
   2957 		} else {
   2958 			/*
   2959 			 * wait one time and then go see if someone
   2960 			 * else has resolved the stub (set mip->mp).
   2961 			 */
   2962 			if (mod_hold_by_modctl(mp,
   2963 			    MOD_WAIT_ONCE | MOD_LOCK_HELD))
   2964 				goto mod_check_again;
   2965 
   2966 			/*
   2967 			 * what we have now may have been unloaded!, in
   2968 			 * that case, mip->mp will be NULL, we'll hit this
   2969 			 * module and load again..
   2970 			 */
   2971 			cmn_err(CE_PANIC, "mod_hold_stub should have blocked");
   2972 		}
   2973 		mutex_exit(&mod_lock);
   2974 	} else {
   2975 		/* first time we've hit this module */
   2976 		mutex_exit(&mod_lock);
   2977 		mp = mod_hold_by_name(mip->modm_module_name);
   2978 		mip->mp = mp;
   2979 	}
   2980 
   2981 	/*
   2982 	 * If we are here, it means that the following conditions
   2983 	 * are satisfied.
   2984 	 *
   2985 	 * mip->mp != NULL
   2986 	 * this thread has set the mp->mod_busy = 1
   2987 	 * mp->mod_installed = 0
   2988 	 *
   2989 	 */
   2990 	ASSERT(mp != NULL);
   2991 	ASSERT(mp->mod_busy == 1);
   2992 
   2993 	if (mp->mod_installed == 0) {
   2994 		/* Module not loaded, if weak stub don't load it */
   2995 		if (stub->mods_flag & MODS_WEAK) {
   2996 			if (stub->mods_errfcn == NULL) {
   2997 				mod_release_mod(mp);
   2998 				cmn_err(CE_PANIC, no_err,
   2999 				    mip->modm_module_name);
   3000 			}
   3001 		} else {
   3002 			/* Not a weak stub so load the module */
   3003 
   3004 			if (mod_load(mp, 1) != 0 || modinstall(mp) != 0) {
   3005 				/*
   3006 				 * If mod_load() was successful
   3007 				 * and modinstall() failed, then
   3008 				 * unload the module.
   3009 				 */
   3010 				if (mp->mod_loaded)
   3011 					mod_unload(mp);
   3012 
   3013 				mod_release_mod(mp);
   3014 				if (stub->mods_errfcn == NULL) {
   3015 					cmn_err(CE_PANIC, mod_stub_err,
   3016 					    mip->modm_module_name);
   3017 				} else {
   3018 					return (-1);
   3019 				}
   3020 			}
   3021 		}
   3022 	}
   3023 
   3024 	/*
   3025 	 * At this point module is held and loaded. Release
   3026 	 * the mod_busy and mod_inprogress_thread before
   3027 	 * returning. We actually call mod_release() here so
   3028 	 * that if another stub wants to access this module,
   3029 	 * it can do so. mod_ref is incremented before mod_release()
   3030 	 * is called to prevent someone else from snatching the
   3031 	 * module from this thread.
   3032 	 */
   3033 	mutex_enter(&mod_lock);
   3034 	mp->mod_ref++;
   3035 	ASSERT(mp->mod_ref &&
   3036 	    (mp->mod_loaded || (stub->mods_flag & MODS_WEAK)));
   3037 	mod_release(mp);
   3038 	mutex_exit(&mod_lock);
   3039 	return (0);
   3040 }
   3041 
   3042 void
   3043 mod_release_stub(struct mod_stub_info *stub)
   3044 {
   3045 	struct modctl *mp = stub->mods_modinfo->mp;
   3046 
   3047 	/* inline mod_release_mod */
   3048 	mutex_enter(&mod_lock);
   3049 	ASSERT(mp->mod_ref &&
   3050 	    (mp->mod_loaded || (stub->mods_flag & MODS_WEAK)));
   3051 	mp->mod_ref--;
   3052 	if (mp->mod_want) {
   3053 		mp->mod_want = 0;
   3054 		cv_broadcast(&mod_cv);
   3055 	}
   3056 	mutex_exit(&mod_lock);
   3057 }
   3058 
   3059 static struct modctl *
   3060 mod_hold_loaded_mod(struct modctl *dep, char *filename, int *status)
   3061 {
   3062 	struct modctl *modp;
   3063 	int retval;
   3064 
   3065 	/*
   3066 	 * Hold the module.
   3067 	 */
   3068 	modp = mod_hold_by_name_requisite(dep, filename);
   3069 	if (modp) {
   3070 		retval = mod_load(modp, 1);
   3071 		if (retval != 0) {
   3072 			mod_release_mod(modp);
   3073 			modp = NULL;
   3074 		}
   3075 		*status = retval;
   3076 	} else {
   3077 		*status = ENOSPC;
   3078 	}
   3079 
   3080 	/*
   3081 	 * if dep is not NULL, clear the module dependency information.
   3082 	 * This information is set in mod_hold_by_name_common().
   3083 	 */
   3084 	if (dep != NULL && dep->mod_requisite_loading != NULL) {
   3085 		ASSERT(dep->mod_busy);
   3086 		dep->mod_requisite_loading = NULL;
   3087 	}
   3088 
   3089 	return (modp);
   3090 }
   3091 
   3092 /*
   3093  * hold, load, and install the named module
   3094  */
   3095 static struct modctl *
   3096 mod_hold_installed_mod(char *name, int usepath, int forcecheck, int *r)
   3097 {
   3098 	struct modctl *modp;
   3099 	int retval;
   3100 
   3101 	/*
   3102 	 * Verify that that module in question actually exists on disk
   3103 	 * before allocation of module structure by mod_hold_by_name.
   3104 	 */
   3105 	if (modrootloaded && swaploaded || forcecheck) {
   3106 		if (!kobj_path_exists(name, usepath)) {
   3107 			*r = ENOENT;
   3108 			return (NULL);
   3109 		}
   3110 	}
   3111 
   3112 	/*
   3113 	 * Hold the module.
   3114 	 */
   3115 	modp = mod_hold_by_name(name);
   3116 	if (modp) {
   3117 		retval = mod_load(modp, usepath);
   3118 		if (retval != 0) {
   3119 			mod_release_mod(modp);
   3120 			modp = NULL;
   3121 			*r = retval;
   3122 		} else {
   3123 			if ((*r = modinstall(modp)) != 0) {
   3124 				/*
   3125 				 * We loaded it, but failed to _init() it.
   3126 				 * Be kind to developers -- force it
   3127 				 * out of memory now so that the next
   3128 				 * attempt to use the module will cause
   3129 				 * a reload.  See 1093793.
   3130 				 */
   3131 				mod_unload(modp);
   3132 				mod_release_mod(modp);
   3133 				modp = NULL;
   3134 			}
   3135 		}
   3136 	} else {
   3137 		*r = ENOSPC;
   3138 	}
   3139 	return (modp);
   3140 }
   3141 
   3142 static char mod_excl_msg[] =
   3143 	"module %s(%s) is EXCLUDED and will not be loaded\n";
   3144 static char mod_init_msg[] = "loadmodule:%s(%s): _init() error %d\n";
   3145 
   3146 /*
   3147  * This routine is needed for dependencies.  Users specify dependencies
   3148  * by declaring a character array initialized to filenames of dependents.
   3149  * So the code that handles dependents deals with filenames (and not
   3150  * module names) because that's all it has.  We load by filename and once
   3151  * we've loaded a file we can get the module name.
   3152  * Unfortunately there isn't a single unified filename/modulename namespace.
   3153  * C'est la vie.
   3154  *
   3155  * We allow the name being looked up to be prepended by an optional
   3156  * subdirectory e.g. we can lookup (NULL, "fs/ufs") or ("fs", "ufs")
   3157  */
   3158 struct modctl *
   3159 mod_find_by_filename(char *subdir, char *filename)
   3160 {
   3161 	struct modctl	*mp;
   3162 	size_t		sublen;
   3163 
   3164 	ASSERT(!MUTEX_HELD(&mod_lock));
   3165 	if (subdir != NULL)
   3166 		sublen = strlen(subdir);
   3167 	else
   3168 		sublen = 0;
   3169 
   3170 	mutex_enter(&mod_lock);
   3171 	mp = &modules;
   3172 	do {
   3173 		if (sublen) {
   3174 			char *mod_filename = mp->mod_filename;
   3175 
   3176 			if (strncmp(subdir, mod_filename, sublen) == 0 &&
   3177 			    mod_filename[sublen] == '/' &&
   3178 			    strcmp(filename, &mod_filename[sublen + 1]) == 0) {
   3179 				mutex_exit(&mod_lock);
   3180 				return (mp);
   3181 			}
   3182 		} else if (strcmp(filename, mp->mod_filename) == 0) {
   3183 			mutex_exit(&mod_lock);
   3184 			return (mp);
   3185 		}
   3186 	} while ((mp = mp->mod_next) != &modules);
   3187 	mutex_exit(&mod_lock);
   3188 	return (NULL);
   3189 }
   3190 
   3191 /*
   3192  * Check for circular dependencies.  This is called from do_dependents()
   3193  * in kobj.c.  If we are the thread already loading this module, then
   3194  * we're trying to load a dependent that we're already loading which
   3195  * means the user specified circular dependencies.
   3196  */
   3197 static int
   3198 mod_circdep(struct modctl *modp)
   3199 {
   3200 	struct modctl	*rmod;
   3201 
   3202 	ASSERT(MUTEX_HELD(&mod_lock));
   3203 
   3204 	/*
   3205 	 * Check the mod_inprogress_thread first.
   3206 	 * mod_inprogress_thread is used in mod_hold_stub()
   3207 	 * directly to improve performance.
   3208 	 */
   3209 	if (modp->mod_inprogress_thread == curthread)
   3210 		return (1);
   3211 
   3212 	/*
   3213 	 * Check the module circular dependencies.
   3214 	 */
   3215 	for (rmod = modp; rmod != NULL; rmod = rmod->mod_requisite_loading) {
   3216 		/*
   3217 		 * Check if there is a module circular dependency.
   3218 		 */
   3219 		if (rmod->mod_requisite_loading == modp)
   3220 			return (1);
   3221 	}
   3222 	return (0);
   3223 }
   3224 
   3225 static int
   3226 mod_getinfo(struct modctl *modp, struct modinfo *modinfop)
   3227 {
   3228 	int (*func)(struct modinfo *);
   3229 	int retval;
   3230 
   3231 	ASSERT(modp->mod_busy);
   3232 
   3233 	/* primary modules don't do getinfo */
   3234 	if (modp->mod_prim)
   3235 		return (0);
   3236 
   3237 	func = (int (*)(struct modinfo *))kobj_lookup(modp->mod_mp, "_info");
   3238 
   3239 	if (kobj_addrcheck(modp->mod_mp, (caddr_t)func)) {
   3240 		cmn_err(CE_WARN, "_info() not defined properly in %s",
   3241 		    modp->mod_filename);
   3242 		/*
   3243 		 * The semantics of mod_info(9F) are that 0 is failure
   3244 		 * and non-zero is success.
   3245 		 */
   3246 		retval = 0;
   3247 	} else
   3248 		retval = (*func)(modinfop);	/* call _info() function */
   3249 
   3250 	if (moddebug & MODDEBUG_USERDEBUG)
   3251 		printf("Returned from _info, retval = %x\n", retval);
   3252 
   3253 	return (retval);
   3254 }
   3255 
   3256 static void
   3257 modadd(struct modctl *mp)
   3258 {
   3259 	ASSERT(MUTEX_HELD(&mod_lock));
   3260 
   3261 	mp->mod_id = last_module_id++;
   3262 	mp->mod_next = &modules;
   3263 	mp->mod_prev = modules.mod_prev;
   3264 	modules.mod_prev->mod_next = mp;
   3265 	modules.mod_prev = mp;
   3266 }
   3267 
   3268 /*ARGSUSED*/
   3269 static struct modctl *
   3270 allocate_modp(const char *filename, const char *modname)
   3271 {
   3272 	struct modctl *mp;
   3273 
   3274 	mp = kobj_zalloc(sizeof (*mp), KM_SLEEP);
   3275 	mp->mod_modname = kobj_zalloc(strlen(modname) + 1, KM_SLEEP);
   3276 	(void) strcpy(mp->mod_modname, modname);
   3277 	return (mp);
   3278 }
   3279 
   3280 /*
   3281  * Get the value of a symbol.  This is a wrapper routine that
   3282  * calls kobj_getsymvalue().  kobj_getsymvalue() may go away but this
   3283  * wrapper will prevent callers from noticing.
   3284  */
   3285 uintptr_t
   3286 modgetsymvalue(char *name, int kernelonly)
   3287 {
   3288 	return (kobj_getsymvalue(name, kernelonly));
   3289 }
   3290 
   3291 /*
   3292  * Get the symbol nearest an address.  This is a wrapper routine that
   3293  * calls kobj_getsymname().  kobj_getsymname() may go away but this
   3294  * wrapper will prevent callers from noticing.
   3295  */
   3296 char *
   3297 modgetsymname(uintptr_t value, ulong_t *offset)
   3298 {
   3299 	return (kobj_getsymname(value, offset));
   3300 }
   3301 
   3302 /*
   3303  * Lookup a symbol in a specified module.  These are wrapper routines that
   3304  * call kobj_lookup().	kobj_lookup() may go away but these wrappers will
   3305  * prevent callers from noticing.
   3306  */
   3307 uintptr_t
   3308 modlookup(const char *modname, const char *symname)
   3309 {
   3310 	struct modctl *modp;
   3311 	uintptr_t val;
   3312 
   3313 	if ((modp = mod_hold_by_name(modname)) == NULL)
   3314 		return (0);
   3315 	val = kobj_lookup(modp->mod_mp, symname);
   3316 	mod_release_mod(modp);
   3317 	return (val);
   3318 }
   3319 
   3320 uintptr_t
   3321 modlookup_by_modctl(modctl_t *modp, const char *symname)
   3322 {
   3323 	ASSERT(modp->mod_ref > 0 || modp->mod_busy);
   3324 
   3325 	return (kobj_lookup(modp->mod_mp, symname));
   3326 }
   3327 
   3328 /*
   3329  * Ask the user for the name of the system file and the default path
   3330  * for modules.
   3331  */
   3332 void
   3333 mod_askparams()
   3334 {
   3335 	static char s0[64];
   3336 	intptr_t fd;
   3337 
   3338 	if ((fd = kobj_open(systemfile)) != -1L)
   3339 		kobj_close(fd);
   3340 	else
   3341 		systemfile = NULL;
   3342 
   3343 	/*CONSTANTCONDITION*/
   3344 	while (1) {
   3345 		printf("Name of system file [%s]:  ",
   3346 		    systemfile ? systemfile : "/dev/null");
   3347 
   3348 		console_gets(s0, sizeof (s0));
   3349 
   3350 		if (s0[0] == '\0')
   3351 			break;
   3352 		else if (strcmp(s0, "/dev/null") == 0) {
   3353 			systemfile = NULL;
   3354 			break;
   3355 		} else {
   3356 			if ((fd = kobj_open(s0)) != -1L) {
   3357 				kobj_close(fd);
   3358 				systemfile = s0;
   3359 				break;
   3360 			}
   3361 		}
   3362 		printf("can't find file %s\n", s0);
   3363 	}
   3364 }
   3365 
   3366 static char loading_msg[] = "loading '%s' id %d\n";
   3367 static char load_msg[] = "load '%s' id %d loaded @ 0x%p/0x%p size %d/%d\n";
   3368 
   3369 /*
   3370  * Common code for loading a module (but not installing it).
   3371  * Handoff the task of module loading to a separate thread
   3372  * with a large stack if possible, since this code may recurse a few times.
   3373  * Return zero if there are no errors or an errno value.
   3374  */
   3375 static int
   3376 mod_load(struct modctl *mp, int usepath)
   3377 {
   3378 	int		retval;
   3379 	struct modinfo	*modinfop = NULL;
   3380 	struct loadmt	lt;
   3381 
   3382 	ASSERT(MUTEX_NOT_HELD(&mod_lock));
   3383 	ASSERT(mp->mod_busy);
   3384 
   3385 	if (mp->mod_loaded)
   3386 		return (0);
   3387 
   3388 	if (mod_sysctl(SYS_CHECK_EXCLUDE, mp->mod_modname) != 0 ||
   3389 	    mod_sysctl(SYS_CHECK_EXCLUDE, mp->mod_filename) != 0) {
   3390 		if (moddebug & MODDEBUG_LOADMSG) {
   3391 			printf(mod_excl_msg, mp->mod_filename,
   3392 			    mp->mod_modname);
   3393 		}
   3394 		return (ENXIO);
   3395 	}
   3396 	if (moddebug & MODDEBUG_LOADMSG2)
   3397 		printf(loading_msg, mp->mod_filename, mp->mod_id);
   3398 
   3399 	if (curthread != &t0) {
   3400 		lt.mp = mp;
   3401 		lt.usepath = usepath;
   3402 		lt.owner = curthread;
   3403 		sema_init(&lt.sema, 0, NULL, SEMA_DEFAULT, NULL);
   3404 
   3405 		/* create thread to hand of call to */
   3406 		(void) thread_create(NULL, DEFAULTSTKSZ * 2,
   3407 		    modload_thread, &lt, 0, &p0, TS_RUN, maxclsyspri);
   3408 
   3409 		/* wait for thread to complete kobj_load_module */
   3410 		sema_p(&lt.sema);
   3411 
   3412 		sema_destroy(&lt.sema);
   3413 		retval = lt.retval;
   3414 	} else
   3415 		retval = kobj_load_module(mp, usepath);
   3416 
   3417 	if (mp->mod_mp) {
   3418 		ASSERT(retval == 0);
   3419 		mp->mod_loaded = 1;
   3420 		mp->mod_loadcnt++;
   3421 		if (moddebug & MODDEBUG_LOADMSG) {
   3422 			printf(load_msg, mp->mod_filename, mp->mod_id,
   3423 			    (void *)((struct module *)mp->mod_mp)->text,
   3424 			    (void *)((struct module *)mp->mod_mp)->data,
   3425 			    ((struct module *)mp->mod_mp)->text_size,
   3426 			    ((struct module *)mp->mod_mp)->data_size);
   3427 		}
   3428 
   3429 		/*
   3430 		 * XXX - There should be a better way to get this.
   3431 		 */
   3432 		modinfop = kmem_zalloc(sizeof (struct modinfo), KM_SLEEP);
   3433 		modinfop->mi_info = MI_INFO_LINKAGE;
   3434 		if (mod_getinfo(mp, modinfop) == 0)
   3435 			mp->mod_linkage = NULL;
   3436 		else {
   3437 			mp->mod_linkage = (void *)modinfop->mi_base;
   3438 			ASSERT(mp->mod_linkage->ml_rev == MODREV_1);
   3439 		}
   3440 
   3441 		/*
   3442 		 * DCS: bootstrapping code. If the driver is loaded
   3443 		 * before root mount, it is assumed that the driver
   3444 		 * may be used before mounting root. In order to
   3445 		 * access mappings of global to local minor no.'s
   3446 		 * during installation/open of the driver, we load
   3447 		 * them into memory here while the BOP_interfaces
   3448 		 * are still up.
   3449 		 */
   3450 		if ((cluster_bootflags & CLUSTER_BOOTED) && !modrootloaded) {
   3451 			retval = clboot_modload(mp);
   3452 		}
   3453 
   3454 		kmem_free(modinfop, sizeof (struct modinfo));
   3455 		(void) mod_sysctl(SYS_SET_MVAR, (void *)mp);
   3456 		retval = install_stubs_by_name(mp, mp->mod_modname);
   3457 
   3458 		/*
   3459 		 * Now that the module is loaded, we need to give DTrace
   3460 		 * a chance to notify its providers.  This is done via
   3461 		 * the dtrace_modload function pointer.
   3462 		 */
   3463 		if (strcmp(mp->mod_modname, "dtrace") != 0) {
   3464 			struct modctl *dmp = mod_hold_by_name("dtrace");
   3465 
   3466 			if (dmp != NULL && dtrace_modload != NULL)
   3467 				(*dtrace_modload)(mp);
   3468 
   3469 			mod_release_mod(dmp);
   3470 		}
   3471 
   3472 	} else {
   3473 		/*
   3474 		 * If load failed then we need to release any requisites
   3475 		 * that we had established.
   3476 		 */
   3477 		ASSERT(retval);
   3478 		mod_release_requisites(mp);
   3479 
   3480 		if (moddebug & MODDEBUG_ERRMSG)
   3481 			printf("error loading '%s', error %d\n",
   3482 			    mp->mod_filename, retval);
   3483 	}
   3484 	return (retval);
   3485 }
   3486 
   3487 static char unload_msg[] = "unloading %s, module id %d, loadcnt %d.\n";
   3488 
   3489 static void
   3490 mod_unload(struct modctl *mp)
   3491 {
   3492 	ASSERT(MUTEX_NOT_HELD(&mod_lock));
   3493 	ASSERT(mp->mod_busy);
   3494 	ASSERT((mp->mod_loaded && (mp->mod_installed == 0)) &&
   3495 	    ((mp->mod_prim == 0) && (mp->mod_ref >= 0)));
   3496 
   3497 	if (moddebug & MODDEBUG_LOADMSG)
   3498 		printf(unload_msg, mp->mod_modname,
   3499 		    mp->mod_id, mp->mod_loadcnt);
   3500 
   3501 	/*
   3502 	 * If mod_ref is not zero, it means some modules might still refer
   3503 	 * to this module. Then you can't unload this module right now.
   3504 	 * Instead, set 1 to mod_delay_unload to notify the system of
   3505 	 * unloading this module later when it's not required any more.
   3506 	 */
   3507 	if (mp->mod_ref > 0) {
   3508 		mp->mod_delay_unload = 1;
   3509 		if (moddebug & MODDEBUG_LOADMSG2) {
   3510 			printf("module %s not unloaded,"
   3511 			    " non-zero reference count (%d)",
   3512 			    mp->mod_modname, mp->mod_ref);
   3513 		}
   3514 		return;
   3515 	}
   3516 
   3517 	if (((mp->mod_loaded == 0) || mp->mod_installed) ||
   3518 	    (mp->mod_ref || mp->mod_prim)) {
   3519 		/*
   3520 		 * A DEBUG kernel would ASSERT panic above, the code is broken
   3521 		 * if we get this warning.
   3522 		 */
   3523 		cmn_err(CE_WARN, "mod_unload: %s in incorrect state: %d %d %d",
   3524 		    mp->mod_filename, mp->mod_installed, mp->mod_loaded,
   3525 		    mp->mod_ref);
   3526 		return;
   3527 	}
   3528 
   3529 	/* reset stub functions to call the binder again */
   3530 	reset_stubs(mp);
   3531 
   3532 	/*
   3533 	 * mark module as unloaded before the modctl structure is freed.
   3534 	 * This is required not to reuse the modctl structure before
   3535 	 * the module is marked as unloaded.
   3536 	 */
   3537 	mp->mod_loaded = 0;
   3538 	mp->mod_linkage = NULL;
   3539 
   3540 	/* free the memory */
   3541 	kobj_unload_module(mp);
   3542 
   3543 	if (mp->mod_delay_unload) {
   3544 		mp->mod_delay_unload = 0;
   3545 		if (moddebug & MODDEBUG_LOADMSG2) {
   3546 			printf("deferred unload of module %s"
   3547 			    " (id %d) successful",
   3548 			    mp->mod_modname, mp->mod_id);
   3549 		}
   3550 	}
   3551 
   3552 	/* release hold on requisites */
   3553 	mod_release_requisites(mp);
   3554 
   3555 	/*
   3556 	 * Now that the module is gone, we need to give DTrace a chance to
   3557 	 * remove any probes that it may have had in the module.  This is
   3558 	 * done via the dtrace_modunload function pointer.
   3559 	 */
   3560 	if (strcmp(mp->mod_modname, "dtrace") != 0) {
   3561 		struct modctl *dmp = mod_hold_by_name("dtrace");
   3562 
   3563 		if (dmp != NULL && dtrace_modunload != NULL)
   3564 			(*dtrace_modunload)(mp);
   3565 
   3566 		mod_release_mod(dmp);
   3567 	}
   3568 }
   3569 
   3570 static int
   3571 modinstall(struct modctl *mp)
   3572 {
   3573 	int val;
   3574 	int (*func)(void);
   3575 
   3576 	ASSERT(MUTEX_NOT_HELD(&mod_lock));
   3577 	ASSERT(mp->mod_busy && mp->mod_loaded);
   3578 
   3579 	if (mp->mod_installed)
   3580 		return (0);
   3581 	/*
   3582 	 * If mod_delay_unload is on, it means the system chose the deferred
   3583 	 * unload for this module. Then you can't install this module until
   3584 	 * it's unloaded from the system.
   3585 	 */
   3586 	if (mp->mod_delay_unload)
   3587 		return (ENXIO);
   3588 
   3589 	if (moddebug & MODDEBUG_LOADMSG)
   3590 		printf("installing %s, module id %d.\n",
   3591 		    mp->mod_modname, mp->mod_id);
   3592 
   3593 	ASSERT(mp->mod_mp != NULL);
   3594 	if (mod_install_requisites(mp) != 0) {
   3595 		/*
   3596 		 * Note that we can't call mod_unload(mp) here since
   3597 		 * if modinstall() was called by mod_install_requisites(),
   3598 		 * we won't be able to hold the dependent modules
   3599 		 * (otherwise there would be a deadlock).
   3600 		 */
   3601 		return (ENXIO);
   3602 	}
   3603 
   3604 	if (moddebug & MODDEBUG_ERRMSG) {
   3605 		printf("init '%s' id %d loaded @ 0x%p/0x%p size %lu/%lu\n",
   3606 		    mp->mod_filename, mp->mod_id,
   3607 		    (void *)((struct module *)mp->mod_mp)->text,
   3608 		    (void *)((struct module *)mp->mod_mp)->data,
   3609 		    ((struct module *)mp->mod_mp)->text_size,
   3610 		    ((struct module *)mp->mod_mp)->data_size);
   3611 	}
   3612 
   3613 	func = (int (*)())kobj_lookup(mp->mod_mp, "_init");
   3614 
   3615 	if (kobj_addrcheck(mp->mod_mp, (caddr_t)func)) {
   3616 		cmn_err(CE_WARN, "_init() not defined properly in %s",
   3617 		    mp->mod_filename);
   3618 		return (EFAULT);
   3619 	}
   3620 
   3621 	if (moddebug & MODDEBUG_USERDEBUG) {
   3622 		printf("breakpoint before calling %s:_init()\n",
   3623 		    mp->mod_modname);
   3624 		if (DEBUGGER_PRESENT)
   3625 			debug_enter("_init");
   3626 	}
   3627 
   3628 	ASSERT(MUTEX_NOT_HELD(&mod_lock));
   3629 	ASSERT(mp->mod_busy && mp->mod_loaded);
   3630 	val = (*func)();		/* call _init */
   3631 
   3632 	if (moddebug & MODDEBUG_USERDEBUG)
   3633 		printf("Returned from _init, val = %x\n", val);
   3634 
   3635 	if (val == 0) {
   3636 		/*
   3637 		 * Set the MODS_INSTALLED flag to enable this module
   3638 		 * being called now.
   3639 		 */
   3640 		install_stubs(mp);
   3641 		mp->mod_installed = 1;
   3642 	} else if (moddebug & MODDEBUG_ERRMSG)
   3643 		printf(mod_init_msg, mp->mod_filename, mp->mod_modname, val);
   3644 
   3645 	return (val);
   3646 }
   3647 
   3648 int	detach_driver_unconfig = 0;
   3649 
   3650 static int
   3651 detach_driver(char *name)
   3652 {
   3653 	major_t major;
   3654 	int error;
   3655 
   3656 	/*
   3657 	 * If being called from mod_uninstall_all() then the appropriate
   3658 	 * driver detaches (leaf only) have already been done.
   3659 	 */
   3660 	if (mod_in_autounload())
   3661 		return (0);
   3662 
   3663 	major = ddi_name_to_major(name);
   3664 	if (major == DDI_MAJOR_T_NONE)
   3665 		return (0);
   3666 
   3667 	error = ndi_devi_unconfig_driver(ddi_root_node(),
   3668 	    NDI_DETACH_DRIVER | detach_driver_unconfig, major);
   3669 	return (error == NDI_SUCCESS ? 0 : -1);
   3670 }
   3671 
   3672 static char finiret_msg[] = "Returned from _fini for %s, status = %x\n";
   3673 
   3674 static int
   3675 moduninstall(struct modctl *mp)
   3676 {
   3677 	int status = 0;
   3678 	int (*func)(void);
   3679 
   3680 	ASSERT(MUTEX_NOT_HELD(&mod_lock));
   3681 	ASSERT(mp->mod_busy);
   3682 
   3683 	/*
   3684 	 * Verify that we need to do something and can uninstall the module.
   3685 	 *
   3686 	 * If we should not uninstall the module or if the module is not in
   3687 	 * the correct state to start an uninstall we return EBUSY to prevent
   3688 	 * us from progressing to mod_unload.  If the module has already been
   3689 	 * uninstalled and unloaded we return EALREADY.
   3690 	 */
   3691 	if (mp->mod_prim || mp->mod_ref || mp->mod_nenabled != 0)
   3692 		return (EBUSY);
   3693 	if ((mp->mod_installed == 0) || (mp->mod_loaded == 0))
   3694 		return (EALREADY);
   3695 
   3696 	/*
   3697 	 * To avoid devinfo / module deadlock we must release this module
   3698 	 * prior to initiating the detach_driver, otherwise the detach_driver
   3699 	 * might deadlock on a devinfo node held by another thread
   3700 	 * coming top down and involving the module we have locked.
   3701 	 *
   3702 	 * When we regrab the module we must reverify that it is OK
   3703 	 * to proceed with the uninstall operation.
   3704 	 */
   3705 	mod_release_mod(mp);
   3706 	status = detach_driver(mp->mod_modname);
   3707 	(void) mod_hold_by_modctl(mp, MOD_WAIT_FOREVER | MOD_LOCK_NOT_HELD);
   3708 
   3709 	/* check detach status and reverify state with lock */
   3710 	mutex_enter(&mod_lock);
   3711 	if ((status != 0) || mp->mod_prim || mp->mod_ref) {
   3712 		mutex_exit(&mod_lock);
   3713 		return (EBUSY);
   3714 	}
   3715 	if ((mp->mod_installed == 0) || (mp->mod_loaded == 0)) {
   3716 		mutex_exit(&mod_lock);
   3717 		return (EALREADY);
   3718 	}
   3719 	mutex_exit(&mod_lock);
   3720 
   3721 	if (moddebug & MODDEBUG_LOADMSG2)
   3722 		printf("uninstalling %s\n", mp->mod_modname);
   3723 
   3724 	/*
   3725 	 * lookup _fini, return EBUSY if not defined.
   3726 	 *
   3727 	 * The MODDEBUG_FINI_EBUSY is usefull in resolving leaks in
   3728 	 * detach(9E) - it allows bufctl addresses to be resolved.
   3729 	 */
   3730 	func = (int (*)())kobj_lookup(mp->mod_mp, "_fini");
   3731 	if ((func == NULL) || (mp->mod_loadflags & MOD_NOUNLOAD) ||
   3732 	    (moddebug & MODDEBUG_FINI_EBUSY))
   3733 		return (EBUSY);
   3734 
   3735 	/* verify that _fini is in this module */
   3736 	if (kobj_addrcheck(mp->mod_mp, (caddr_t)func)) {
   3737 		cmn_err(CE_WARN, "_fini() not defined properly in %s",
   3738 		    mp->mod_filename);
   3739 		return (EFAULT);
   3740 	}
   3741 
   3742 	/* call _fini() */
   3743 	ASSERT(MUTEX_NOT_HELD(&mod_lock));
   3744 	ASSERT(mp->mod_busy && mp->mod_loaded && mp->mod_installed);
   3745 
   3746 	status = (*func)();
   3747 
   3748 	if (status == 0) {
   3749 		/* _fini returned success, the module is no longer installed */
   3750 		if (moddebug & MODDEBUG_LOADMSG)
   3751 			printf("uninstalled %s\n", mp->mod_modname);
   3752 
   3753 		/*
   3754 		 * Even though we only set mod_installed to zero here, a zero
   3755 		 * return value means we are committed to a code path were
   3756 		 * mod_loaded will also end up as zero - we have no other
   3757 		 * way to get the module data and bss back to the pre _init
   3758 		 * state except a reload. To ensure this, after return,
   3759 		 * mod_busy must stay set until mod_loaded is cleared.
   3760 		 */
   3761 		mp->mod_installed = 0;
   3762 
   3763 		/*
   3764 		 * Clear the MODS_INSTALLED flag not to call functions
   3765 		 * in the module directly from now on.
   3766 		 */
   3767 		uninstall_stubs(mp);
   3768 	} else {
   3769 		if (moddebug & MODDEBUG_USERDEBUG)
   3770 			printf(finiret_msg, mp->mod_filename, status);
   3771 		/*
   3772 		 * By definition _fini is only allowed to return EBUSY or the
   3773 		 * result of mod_remove (EBUSY or EINVAL).  In the off chance
   3774 		 * that a driver returns EALREADY we convert this to EINVAL
   3775 		 * since to our caller EALREADY means module was already
   3776 		 * removed.
   3777 		 */
   3778 		if (status == EALREADY)
   3779 			status = EINVAL;
   3780 	}
   3781 
   3782 	return (status);
   3783 }
   3784 
   3785 /*
   3786  * Uninstall all modules.
   3787  */
   3788 static void
   3789 mod_uninstall_all(void)
   3790 {
   3791 	struct modctl	*mp;
   3792 	modid_t		modid = 0;
   3793 
   3794 	/* synchronize with any active modunload_disable() */
   3795 	modunload_begin();
   3796 
   3797 	/* mark this thread as doing autounloading */
   3798 	(void) tsd_set(mod_autounload_key, (void *)1);
   3799 
   3800 	(void) devfs_clean(ddi_root_node(), NULL, 0);
   3801 	(void) ndi_devi_unconfig(ddi_root_node(), NDI_AUTODETACH);
   3802 
   3803 	while ((mp = mod_hold_next_by_id(modid)) != NULL) {
   3804 		modid = mp->mod_id;
   3805 		/*
   3806 		 * Skip modules with the MOD_NOAUTOUNLOAD flag set
   3807 		 */
   3808 		if (mp->mod_loadflags & MOD_NOAUTOUNLOAD) {
   3809 			mod_release_mod(mp);
   3810 			continue;
   3811 		}
   3812 
   3813 		if (moduninstall(mp) == 0) {
   3814 			mod_unload(mp);
   3815 			CPU_STATS_ADDQ(CPU, sys, modunload, 1);
   3816 		}
   3817 		mod_release_mod(mp);
   3818 	}
   3819 
   3820 	(void) tsd_set(mod_autounload_key, NULL);
   3821 	modunload_end();
   3822 }
   3823 
   3824 /* wait for unloads that have begun before registering disable */
   3825 void
   3826 modunload_disable(void)
   3827 {
   3828 	mutex_enter(&modunload_wait_mutex);
   3829 	while (modunload_active_count) {
   3830 		modunload_wait++;
   3831 		cv_wait(&modunload_wait_cv, &modunload_wait_mutex);
   3832 		modunload_wait--;
   3833 	}
   3834 	modunload_disable_count++;
   3835 	mutex_exit(&modunload_wait_mutex);
   3836 }
   3837 
   3838 /* mark end of disable and signal waiters */
   3839 void
   3840 modunload_enable(void)
   3841 {
   3842 	mutex_enter(&modunload_wait_mutex);
   3843 	modunload_disable_count--;
   3844 	if ((modunload_disable_count == 0) && modunload_wait)
   3845 		cv_broadcast(&modunload_wait_cv);
   3846 	mutex_exit(&modunload_wait_mutex);
   3847 }
   3848 
   3849 /* wait for disables to complete before begining unload */
   3850 void
   3851 modunload_begin()
   3852 {
   3853 	mutex_enter(&modunload_wait_mutex);
   3854 	while (modunload_disable_count) {
   3855 		modunload_wait++;
   3856 		cv_wait(&modunload_wait_cv, &modunload_wait_mutex);
   3857 		modunload_wait--;
   3858 	}
   3859 	modunload_active_count++;
   3860 	mutex_exit(&modunload_wait_mutex);
   3861 }
   3862 
   3863 /* mark end of unload and signal waiters */
   3864 void
   3865 modunload_end()
   3866 {
   3867 	mutex_enter(&modunload_wait_mutex);
   3868 	modunload_active_count--;
   3869 	if ((modunload_active_count == 0) && modunload_wait)
   3870 		cv_broadcast(&modunload_wait_cv);
   3871 	mutex_exit(&modunload_wait_mutex);
   3872 }
   3873 
   3874 void
   3875 mod_uninstall_daemon(void)
   3876 {
   3877 	callb_cpr_t	cprinfo;
   3878 	clock_t		ticks;
   3879 
   3880 	mod_aul_thread = curthread;
   3881 
   3882 	CALLB_CPR_INIT(&cprinfo, &mod_uninstall_lock, callb_generic_cpr, "mud");
   3883 	for (;;) {
   3884 		mutex_enter(&mod_uninstall_lock);
   3885 		CALLB_CPR_SAFE_BEGIN(&cprinfo);
   3886 		/*
   3887 		 * In DEBUG kernels, unheld drivers are uninstalled periodically
   3888 		 * every mod_uninstall_interval seconds.  Periodic uninstall can
   3889 		 * be disabled by setting mod_uninstall_interval to 0 which is
   3890 		 * the default for a non-DEBUG kernel.
   3891 		 */
   3892 		if (mod_uninstall_interval) {
   3893 			ticks = drv_usectohz(mod_uninstall_interval * 1000000);
   3894 			(void) cv_reltimedwait(&mod_uninstall_cv,
   3895 			    &mod_uninstall_lock, ticks, TR_CLOCK_TICK);
   3896 		} else {
   3897 			cv_wait(&mod_uninstall_cv, &mod_uninstall_lock);
   3898 		}
   3899 		/*
   3900 		 * The whole daemon is safe for CPR except we don't want
   3901 		 * the daemon to run if FREEZE is issued and this daemon
   3902 		 * wakes up from the cv_wait above. In this case, it'll be
   3903 		 * blocked in CALLB_CPR_SAFE_END until THAW is issued.
   3904 		 *
   3905 		 * The reason of calling CALLB_CPR_SAFE_BEGIN twice is that
   3906 		 * mod_uninstall_lock is used to protect cprinfo and
   3907 		 * CALLB_CPR_SAFE_BEGIN assumes that this lock is held when
   3908 		 * called.
   3909 		 */
   3910 		CALLB_CPR_SAFE_END(&cprinfo, &mod_uninstall_lock);
   3911 		CALLB_CPR_SAFE_BEGIN(&cprinfo);
   3912 		mutex_exit(&mod_uninstall_lock);
   3913 		if ((modunload_disable_count == 0) &&
   3914 		    ((moddebug & MODDEBUG_NOAUTOUNLOAD) == 0)) {
   3915 			mod_uninstall_all();
   3916 		}
   3917 	}
   3918 }
   3919 
   3920 /*
   3921  * Unload all uninstalled modules.
   3922  */
   3923 void
   3924 modreap(void)
   3925 {
   3926 	mutex_enter(&mod_uninstall_lock);
   3927 	cv_broadcast(&mod_uninstall_cv);
   3928 	mutex_exit(&mod_uninstall_lock);
   3929 }
   3930 
   3931 /*
   3932  * Hold the specified module. This is the module holding primitive.
   3933  *
   3934  * If MOD_LOCK_HELD then the caller already holds the mod_lock.
   3935  *
   3936  * Return values:
   3937  *	 0 ==> the module is held
   3938  *	 1 ==> the module is not held and the MOD_WAIT_ONCE caller needs
   3939  *		to determine how to retry.
   3940  */
   3941 int
   3942 mod_hold_by_modctl(struct modctl *mp, int f)
   3943 {
   3944 	ASSERT((f & (MOD_WAIT_ONCE | MOD_WAIT_FOREVER)) &&
   3945 	    ((f & (MOD_WAIT_ONCE | MOD_WAIT_FOREVER)) !=
   3946 	    (MOD_WAIT_ONCE | MOD_WAIT_FOREVER)));
   3947 	ASSERT((f & (MOD_LOCK_HELD | MOD_LOCK_NOT_HELD)) &&
   3948 	    ((f & (MOD_LOCK_HELD | MOD_LOCK_NOT_HELD)) !=
   3949 	    (MOD_LOCK_HELD | MOD_LOCK_NOT_HELD)));
   3950 	ASSERT((f & MOD_LOCK_NOT_HELD) || MUTEX_HELD(&mod_lock));
   3951 
   3952 	if (f & MOD_LOCK_NOT_HELD)
   3953 		mutex_enter(&mod_lock);
   3954 
   3955 	while (mp->mod_busy) {
   3956 		mp->mod_want = 1;
   3957 		cv_wait(&mod_cv, &mod_lock);
   3958 		/*
   3959 		 * Module may be unloaded by daemon.
   3960 		 * Nevertheless, modctl structure is still in linked list
   3961 		 * (i.e., off &modules), not freed!
   3962 		 * Caller is not supposed to assume "mp" is valid, but there
   3963 		 * is no reasonable way to detect this but using
   3964 		 * mp->mod_modinfo->mp == NULL check (follow the back pointer)
   3965 		 *   (or similar check depending on calling context)
   3966 		 * DON'T free modctl structure, it will be very very
   3967 		 * problematic.
   3968 		 */
   3969 		if (f & MOD_WAIT_ONCE) {
   3970 			if (f & MOD_LOCK_NOT_HELD)
   3971 				mutex_exit(&mod_lock);
   3972 			return (1);	/* caller decides how to retry */
   3973 		}
   3974 	}
   3975 
   3976 	mp->mod_busy = 1;
   3977 	mp->mod_inprogress_thread =
   3978 	    (curthread == NULL ? (kthread_id_t)-1 : curthread);
   3979 
   3980 	if (f & MOD_LOCK_NOT_HELD)
   3981 		mutex_exit(&mod_lock);
   3982 	return (0);
   3983 }
   3984 
   3985 static struct modctl *
   3986 mod_hold_by_name_common(struct modctl *dep, const char *filename)
   3987 {
   3988 	const char	*modname;
   3989 	struct modctl	*mp;
   3990 	char		*curname, *newname;
   3991 	int		found = 0;
   3992 
   3993 	mutex_enter(&mod_lock);
   3994 
   3995 	if ((modname = strrchr(filename, '/')) == NULL)
   3996 		modname = filename;
   3997 	else
   3998 		modname++;
   3999 
   4000 	mp = &modules;
   4001 	do {
   4002 		if (strcmp(modname, mp->mod_modname) == 0) {
   4003 			found = 1;
   4004 			break;
   4005 		}
   4006 	} while ((mp = mp->mod_next) != &modules);
   4007 
   4008 	if (found == 0) {
   4009 		mp = allocate_modp(filename, modname);
   4010 		modadd(mp);
   4011 	}
   4012 
   4013 	/*
   4014 	 * if dep is not NULL, set the mp in mod_requisite_loading for
   4015 	 * the module circular dependency check. This field is used in
   4016 	 * mod_circdep(), but it's cleard in mod_hold_loaded_mod().
   4017 	 */
   4018 	if (dep != NULL) {
   4019 		ASSERT(dep->mod_busy && dep->mod_requisite_loading == NULL);
   4020 		dep->mod_requisite_loading = mp;
   4021 	}
   4022 
   4023 	/*
   4024 	 * If the module was held, then it must be us who has it held.
   4025 	 */
   4026 	if (mod_circdep(mp))
   4027 		mp = NULL;
   4028 	else {
   4029 		(void) mod_hold_by_modctl(mp, MOD_WAIT_FOREVER | MOD_LOCK_HELD);
   4030 
   4031 		/*
   4032 		 * If the name hadn't been set or has changed, allocate
   4033 		 * space and set it.  Free space used by previous name.
   4034 		 *
   4035 		 * Do not change the name of primary modules, for primary
   4036 		 * modules the mod_filename was allocated in standalone mode:
   4037 		 * it is illegal to kobj_alloc in standalone mode and kobj_free
   4038 		 * in non-standalone mode.
   4039 		 */
   4040 		curname = mp->mod_filename;
   4041 		if (curname == NULL ||
   4042 		    ((mp->mod_prim == 0) &&
   4043 		    (curname != filename) &&
   4044 		    (modname != filename) &&
   4045 		    (strcmp(curname, filename) != 0))) {
   4046 			newname = kobj_zalloc(strlen(filename) + 1, KM_SLEEP);
   4047 			(void) strcpy(newname, filename);
   4048 			mp->mod_filename = newname;
   4049 			if (curname != NULL)
   4050 				kobj_free(curname, strlen(curname) + 1);
   4051 		}
   4052 	}
   4053 
   4054 	mutex_exit(&mod_lock);
   4055 	if (mp && moddebug & MODDEBUG_LOADMSG2)
   4056 		printf("Holding %s\n", mp->mod_filename);
   4057 	if (mp == NULL && moddebug & MODDEBUG_LOADMSG2)
   4058 		printf("circular dependency loading %s\n", filename);
   4059 	return (mp);
   4060 }
   4061 
   4062 static struct modctl *
   4063 mod_hold_by_name_requisite(struct modctl *dep, char *filename)
   4064 {
   4065 	return (mod_hold_by_name_common(dep, filename));
   4066 }
   4067 
   4068 struct modctl *
   4069 mod_hold_by_name(const char *filename)
   4070 {
   4071 	return (mod_hold_by_name_common(NULL, filename));
   4072 }
   4073 
   4074 struct modctl *
   4075 mod_hold_by_id(modid_t modid)
   4076 {
   4077 	struct modctl	*mp;
   4078 	int		found = 0;
   4079 
   4080 	mutex_enter(&mod_lock);
   4081 	mp = &modules;
   4082 	do {
   4083 		if (mp->mod_id == modid) {
   4084 			found = 1;
   4085 			break;
   4086 		}
   4087 	} while ((mp = mp->mod_next) != &modules);
   4088 
   4089 	if ((found == 0) || mod_circdep(mp))
   4090 		mp = NULL;
   4091 	else
   4092 		(void) mod_hold_by_modctl(mp, MOD_WAIT_FOREVER | MOD_LOCK_HELD);
   4093 
   4094 	mutex_exit(&mod_lock);
   4095 	return (mp);
   4096 }
   4097 
   4098 static struct modctl *
   4099 mod_hold_next_by_id(modid_t modid)
   4100 {
   4101 	struct modctl	*mp;
   4102 	int		found = 0;
   4103 
   4104 	if (modid < -1)
   4105 		return (NULL);
   4106 
   4107 	mutex_enter(&mod_lock);
   4108 
   4109 	mp = &modules;
   4110 	do {
   4111 		if (mp->mod_id > modid) {
   4112 			found = 1;
   4113 			break;
   4114 		}
   4115 	} while ((mp = mp->mod_next) != &modules);
   4116 
   4117 	if ((found == 0) || mod_circdep(mp))
   4118 		mp = NULL;
   4119 	else
   4120 		(void) mod_hold_by_modctl(mp, MOD_WAIT_FOREVER | MOD_LOCK_HELD);
   4121 
   4122 	mutex_exit(&mod_lock);
   4123 	return (mp);
   4124 }
   4125 
   4126 static void
   4127 mod_release(struct modctl *mp)
   4128 {
   4129 	ASSERT(MUTEX_HELD(&mod_lock));
   4130 	ASSERT(mp->mod_busy);
   4131 
   4132 	mp->mod_busy = 0;
   4133 	mp->mod_inprogress_thread = NULL;
   4134 	if (mp->mod_want) {
   4135 		mp->mod_want = 0;
   4136 		cv_broadcast(&mod_cv);
   4137 	}
   4138 }
   4139 
   4140 void
   4141 mod_release_mod(struct modctl *mp)
   4142 {
   4143 	if (moddebug & MODDEBUG_LOADMSG2)
   4144 		printf("Releasing %s\n", mp->mod_filename);
   4145 	mutex_enter(&mod_lock);
   4146 	mod_release(mp);
   4147 	mutex_exit(&mod_lock);
   4148 }
   4149 
   4150 modid_t
   4151 mod_name_to_modid(char *filename)
   4152 {
   4153 	char		*modname;
   4154 	struct modctl	*mp;
   4155 
   4156 	mutex_enter(&mod_lock);
   4157 
   4158 	if ((modname = strrchr(filename, '/')) == NULL)
   4159 		modname = filename;
   4160 	else
   4161 		modname++;
   4162 
   4163 	mp = &modules;
   4164 	do {
   4165 		if (strcmp(modname, mp->mod_modname) == 0) {
   4166 			mutex_exit(&mod_lock);
   4167 			return (mp->mod_id);
   4168 		}
   4169 	} while ((mp = mp->mod_next) != &modules);
   4170 
   4171 	mutex_exit(&mod_lock);
   4172 	return (-1);
   4173 }
   4174 
   4175 
   4176 int
   4177 mod_remove_by_name(char *name)
   4178 {
   4179 	struct modctl *mp;
   4180 	int retval;
   4181 
   4182 	mp = mod_hold_by_name(name);
   4183 
   4184 	if (mp == NULL)
   4185 		return (EINVAL);
   4186 
   4187 	if (mp->mod_loadflags & MOD_NOAUTOUNLOAD) {
   4188 		/*
   4189 		 * Do not unload forceloaded modules
   4190 		 */
   4191 		mod_release_mod(mp);
   4192 		return (0);
   4193 	}
   4194 
   4195 	if ((retval = moduninstall(mp)) == 0) {
   4196 		mod_unload(mp);
   4197 		CPU_STATS_ADDQ(CPU, sys, modunload, 1);
   4198 	} else if (retval == EALREADY)
   4199 		retval = 0;		/* already unloaded, not an error */
   4200 	mod_release_mod(mp);
   4201 	return (retval);
   4202 }
   4203 
   4204 /*
   4205  * Record that module "dep" is dependent on module "on_mod."
   4206  */
   4207 static void
   4208 mod_make_requisite(struct modctl *dependent, struct modctl *on_mod)
   4209 {
   4210 	struct modctl_list **pmlnp;	/* previous next pointer */
   4211 	struct modctl_list *mlp;
   4212 	struct modctl_list *new;
   4213 
   4214 	ASSERT(dependent->mod_busy && on_mod->mod_busy);
   4215 	mutex_enter(&mod_lock);
   4216 
   4217 	/*
   4218 	 * Search dependent's requisite list to see if on_mod is recorded.
   4219 	 * List is ordered by id.
   4220 	 */
   4221 	for (pmlnp = &dependent->mod_requisites, mlp = *pmlnp;
   4222 	    mlp; pmlnp = &mlp->modl_next, mlp = *pmlnp)
   4223 		if (mlp->modl_modp->mod_id >= on_mod->mod_id)
   4224 			break;
   4225 
   4226 	/* Create and insert if not already recorded */
   4227 	if ((mlp == NULL) || (mlp->modl_modp->mod_id != on_mod->mod_id)) {
   4228 		new = kobj_zalloc(sizeof (*new), KM_SLEEP);
   4229 		new->modl_modp = on_mod;
   4230 		new->modl_next = mlp;
   4231 		*pmlnp = new;
   4232 
   4233 		/*
   4234 		 * Increment the mod_ref count in our new requisite module.
   4235 		 * This is what keeps a module that has other modules
   4236 		 * which are dependent on it from being uninstalled and
   4237 		 * unloaded. "on_mod"'s mod_ref count decremented in
   4238 		 * mod_release_requisites when the "dependent" module
   4239 		 * unload is complete.	"on_mod" must be loaded, but may not
   4240 		 * yet be installed.
   4241 		 */
   4242 		on_mod->mod_ref++;
   4243 		ASSERT(on_mod->mod_ref && on_mod->mod_loaded);
   4244 	}
   4245 
   4246 	mutex_exit(&mod_lock);
   4247 }
   4248 
   4249 /*
   4250  * release the hold associated with mod_make_requisite mod_ref++
   4251  * as part of unload.
   4252  */
   4253 void
   4254 mod_release_requisites(struct modctl *modp)
   4255 {
   4256 	struct modctl_list *modl;
   4257 	struct modctl_list *next;
   4258 	struct modctl *req;
   4259 	struct modctl_list *start = NULL, *mod_garbage;
   4260 
   4261 	ASSERT(!quiesce_active);
   4262 	ASSERT(modp->mod_busy);
   4263 	ASSERT(MUTEX_NOT_HELD(&mod_lock));
   4264 
   4265 	mutex_enter(&mod_lock);		/* needed for manipulation of req */
   4266 	for (modl = modp->mod_requisites; modl; modl = next) {
   4267 		next = modl->modl_next;
   4268 		req = modl->modl_modp;
   4269 		ASSERT(req->mod_ref >= 1 && req->mod_loaded);
   4270 		req->mod_ref--;
   4271 
   4272 		/*
   4273 		 * Check if the module has to be unloaded or not.
   4274 		 */
   4275 		if (req->mod_ref == 0 && req->mod_delay_unload) {
   4276 			struct modctl_list *new;
   4277 			/*
   4278 			 * Allocate the modclt_list holding the garbage
   4279 			 * module which should be unloaded later.
   4280 			 */
   4281 			new = kobj_zalloc(sizeof (struct modctl_list),
   4282 			    KM_SLEEP);
   4283 			new->modl_modp = req;
   4284 
   4285 			if (start == NULL)
   4286 				mod_garbage = start = new;
   4287 			else {
   4288 				mod_garbage->modl_next = new;
   4289 				mod_garbage = new;
   4290 			}
   4291 		}
   4292 
   4293 		/* free the list as we go */
   4294 		kobj_free(modl, sizeof (*modl));
   4295 	}
   4296 	modp->mod_requisites = NULL;
   4297 	mutex_exit(&mod_lock);
   4298 
   4299 	/*
   4300 	 * Unload the garbage modules.
   4301 	 */
   4302 	for (mod_garbage = start; mod_garbage != NULL; /* nothing */) {
   4303 		struct modctl_list *old = mod_garbage;
   4304 		struct modctl *mp = mod_garbage->modl_modp;
   4305 		ASSERT(mp != NULL);
   4306 
   4307 		/*
   4308 		 * Hold this module until it's unloaded completely.
   4309 		 */
   4310 		(void) mod_hold_by_modctl(mp,
   4311 		    MOD_WAIT_FOREVER | MOD_LOCK_NOT_HELD);
   4312 		/*
   4313 		 * Check if the module is not unloaded yet and nobody requires
   4314 		 * the module. If it's unloaded already or somebody still
   4315 		 * requires the module, don't unload it now.
   4316 		 */
   4317 		if (mp->mod_loaded && mp->mod_ref == 0)
   4318 			mod_unload(mp);
   4319 		ASSERT((mp->mod_loaded == 0 && mp->mod_delay_unload == 0) ||
   4320 		    (mp->mod_ref > 0));
   4321 		mod_release_mod(mp);
   4322 
   4323 		mod_garbage = mod_garbage->modl_next;
   4324 		kobj_free(old, sizeof (struct modctl_list));
   4325 	}
   4326 }
   4327 
   4328 /*
   4329  * Process dependency of the module represented by "dep" on the
   4330  * module named by "on."
   4331  *
   4332  * Called from kobj_do_dependents() to load a module "on" on which
   4333  * "dep" depends.
   4334  */
   4335 struct modctl *
   4336 mod_load_requisite(struct modctl *dep, char *on)
   4337 {
   4338 	struct modctl *on_mod;
   4339 	int retval;
   4340 
   4341 	if ((on_mod = mod_hold_loaded_mod(dep, on, &retval)) != NULL) {
   4342 		mod_make_requisite(dep, on_mod);
   4343 	} else if (moddebug & MODDEBUG_ERRMSG) {
   4344 		printf("error processing %s on which module %s depends\n",
   4345 		    on, dep->mod_modname);
   4346 	}
   4347 	return (on_mod);
   4348 }
   4349 
   4350 static int
   4351 mod_install_requisites(struct modctl *modp)
   4352 {
   4353 	struct modctl_list *modl;
   4354 	struct modctl *req;
   4355 	int status = 0;
   4356 
   4357 	ASSERT(MUTEX_NOT_HELD(&mod_lock));
   4358 	ASSERT(modp->mod_busy);
   4359 
   4360 	for (modl = modp->mod_requisites; modl; modl = modl->modl_next) {
   4361 		req = modl->modl_modp;
   4362 		(void) mod_hold_by_modctl(req,
   4363 		    MOD_WAIT_FOREVER | MOD_LOCK_NOT_HELD);
   4364 		status = modinstall(req);
   4365 		mod_release_mod(req);
   4366 
   4367 		if (status != 0)
   4368 			break;
   4369 	}
   4370 	return (status);
   4371 }
   4372 
   4373 /*
   4374  * returns 1 if this thread is doing autounload, 0 otherwise.
   4375  * see mod_uninstall_all.
   4376  */
   4377 int
   4378 mod_in_autounload()
   4379 {
   4380 	return ((int)(uintptr_t)tsd_get(mod_autounload_key));
   4381 }
   4382 
   4383 /*
   4384  * gmatch adapted from libc, stripping the wchar stuff
   4385  */
   4386 #define	popchar(p, c)	{ \
   4387 		c = *p++; \
   4388 		if (c == 0) { \
   4389 			return (0); \
   4390 		} \
   4391 	}
   4392 
   4393 int
   4394 gmatch(const char *s, const char *p)
   4395 {
   4396 	int c, sc;
   4397 	int ok, lc, notflag;
   4398 
   4399 	sc = *s++;
   4400 	c = *p++;
   4401 	if (c == 0)
   4402 		return (sc == c);	/* nothing matches nothing */
   4403 
   4404 	switch (c) {
   4405 	case '\\':
   4406 		/* skip to quoted character */
   4407 		popchar(p, c);
   4408 		/*FALLTHRU*/
   4409 
   4410 	default:
   4411 		/* straight comparison */
   4412 		if (c != sc)
   4413 			return (0);
   4414 		/*FALLTHRU*/
   4415 
   4416 	case '?':
   4417 		/* first char matches, move to remainder */
   4418 		return (sc != '\0' ? gmatch(s, p) : 0);
   4419 
   4420 
   4421 	case '*':
   4422 		while (*p == '*')
   4423 			p++;
   4424 
   4425 		/* * matches everything */
   4426 		if (*p == 0)
   4427 			return (1);
   4428 
   4429 		/* undo skip at the beginning & iterate over substrings */
   4430 		--s;
   4431 		while (*s) {
   4432 			if (gmatch(s, p))
   4433 				return (1);
   4434 			s++;
   4435 		}
   4436 		return (0);
   4437 
   4438 	case '[':
   4439 		/* match any char within [] */
   4440 		if (sc == 0)
   4441 			return (0);
   4442 
   4443 		ok = lc = notflag = 0;
   4444 
   4445 		if (*p == '!') {
   4446 			notflag = 1;
   4447 			p++;
   4448 		}
   4449 		popchar(p, c);
   4450 
   4451 		do {
   4452 			if (c == '-' && lc && *p != ']') {
   4453 				/* test sc against range [c1-c2] */
   4454 				popchar(p, c);
   4455 				if (c == '\\') {
   4456 					popchar(p, c);
   4457 				}
   4458 
   4459 				if (notflag) {
   4460 					/* return 0 on mismatch */
   4461 					if (lc <= sc && sc <= c)
   4462 						return (0);
   4463 					ok++;
   4464 				} else if (lc <= sc && sc <= c) {
   4465 					ok++;
   4466 				}
   4467 				/* keep going, may get a match next */
   4468 			} else if (c == '\\') {
   4469 				/* skip to quoted character */
   4470 				popchar(p, c);
   4471 			}
   4472 			lc = c;
   4473 			if (notflag) {
   4474 				if (sc == lc)
   4475 					return (0);
   4476 				ok++;
   4477 			} else if (sc == lc) {
   4478 				ok++;
   4479 			}
   4480 			popchar(p, c);
   4481 		} while (c != ']');
   4482 
   4483 		/* recurse on remainder of string */
   4484 		return (ok ? gmatch(s, p) : 0);
   4485 	}
   4486 	/*NOTREACHED*/
   4487 }
   4488 
   4489 
   4490 /*
   4491  * Get default perm for device from /etc/minor_perm. Return 0 if match found.
   4492  *
   4493  * Pure wild-carded patterns are handled separately so the ordering of
   4494  * these patterns doesn't matter.  We're still dependent on ordering
   4495  * however as the first matching entry is the one returned.
   4496  * Not ideal but all existing examples and usage do imply this
   4497  * ordering implicitly.
   4498  *
   4499  * Drivers using the clone driver are always good for some entertainment.
   4500  * Clone nodes under pseudo have the form clone@0:<driver>.  Some minor
   4501  * perm entries have the form clone:<driver>, others use <driver>:*
   4502  * Examples are clone:llc1 vs. llc2:*, for example.
   4503  *
   4504  * Minor perms in the clone:<driver> form are mapped to the drivers's
   4505  * mperm list, not the clone driver, as wildcard entries for clone
   4506  * reference only.  In other words, a clone wildcard will match
   4507  * references for clone@0:<driver> but never <driver>@<minor>.
   4508  *
   4509  * Additional minor perms in the standard form are also supported,
   4510  * for mixed usage, ie a node with an entry clone:<driver> could
   4511  * provide further entries <driver>:<minor>.
   4512  *
   4513  * Finally, some uses of clone use an alias as the minor name rather
   4514  * than the driver name, with the alias as the minor perm entry.
   4515  * This case is handled by attaching the driver to bring its
   4516  * minor list into existence, then discover the alias via DDI_ALIAS.
   4517  * The clone device's minor perm list can then be searched for
   4518  * that alias.
   4519  */
   4520 
   4521 static int
   4522 dev_alias_minorperm(dev_info_t *dip, char *minor_name, mperm_t *rmp)
   4523 {
   4524 	major_t			major;
   4525 	struct devnames		*dnp;
   4526 	mperm_t			*mp;
   4527 	char			*alias = NULL;
   4528 	dev_info_t		*cdevi;
   4529 	int			circ;
   4530 	struct ddi_minor_data	*dmd;
   4531 
   4532 	major = ddi_name_to_major(minor_name);
   4533 
   4534 	ASSERT(dip == clone_dip);
   4535 	ASSERT(major != DDI_MAJOR_T_NONE);
   4536 
   4537 	/*
   4538 	 * Attach the driver named by the minor node, then
   4539 	 * search its first instance's minor list for an
   4540 	 * alias node.
   4541 	 */
   4542 	if (ddi_hold_installed_driver(major) == NULL)
   4543 		return (1);
   4544 
   4545 	dnp = &devnamesp[major];
   4546 	LOCK_DEV_OPS(&dnp->dn_lock);
   4547 
   4548 	if ((cdevi = dnp->dn_head) != NULL) {
   4549 		ndi_devi_enter(cdevi, &circ);
   4550 		for (dmd = DEVI(cdevi)->devi_minor; dmd; dmd = dmd->next) {
   4551 			if (dmd->type == DDM_ALIAS) {
   4552 				alias = i_ddi_strdup(dmd->ddm_name, KM_SLEEP);
   4553 				break;
   4554 			}
   4555 		}
   4556 		ndi_devi_exit(cdevi, circ);
   4557 	}
   4558 
   4559 	UNLOCK_DEV_OPS(&dnp->dn_lock);
   4560 	ddi_rele_driver(major);
   4561 
   4562 	if (alias == NULL) {
   4563 		if (moddebug & MODDEBUG_MINORPERM)
   4564 			cmn_err(CE_CONT, "dev_minorperm: "
   4565 			    "no alias for %s\n", minor_name);
   4566 		return (1);
   4567 	}
   4568 
   4569 	major = ddi_driver_major(clone_dip);
   4570 	dnp = &devnamesp[major];
   4571 	LOCK_DEV_OPS(&dnp->dn_lock);
   4572 
   4573 	/*
   4574 	 * Go through the clone driver's mperm list looking
   4575 	 * for a match for the specified alias.
   4576 	 */
   4577 	for (mp = dnp->dn_mperm; mp; mp = mp->mp_next) {
   4578 		if (strcmp(alias, mp->mp_minorname) == 0) {
   4579 			break;
   4580 		}
   4581 	}
   4582 
   4583 	if (mp) {
   4584 		if (moddebug & MODDEBUG_MP_MATCH) {
   4585 			cmn_err(CE_CONT,
   4586 			    "minor perm defaults: %s %s 0%o %d %d (aliased)\n",
   4587 			    minor_name, alias, mp->mp_mode,
   4588 			    mp->mp_uid, mp->mp_gid);
   4589 		}
   4590 		rmp->mp_uid = mp->mp_uid;
   4591 		rmp->mp_gid = mp->mp_gid;
   4592 		rmp->mp_mode = mp->mp_mode;
   4593 	}
   4594 	UNLOCK_DEV_OPS(&dnp->dn_lock);
   4595 
   4596 	kmem_free(alias, strlen(alias)+1);
   4597 
   4598 	return (mp == NULL);
   4599 }
   4600 
   4601 int
   4602 dev_minorperm(dev_info_t *dip, char *name, mperm_t *rmp)
   4603 {
   4604 	major_t major;
   4605 	char *minor_name;
   4606 	struct devnames *dnp;
   4607 	mperm_t *mp;
   4608 	int is_clone = 0;
   4609 
   4610 	if (!minorperm_loaded) {
   4611 		if (moddebug & MODDEBUG_MINORPERM)
   4612 			cmn_err(CE_CONT,
   4613 			    "%s: minor perm not yet loaded\n", name);
   4614 		return (1);
   4615 	}
   4616 
   4617 	minor_name = strchr(name, ':');
   4618 	if (minor_name == NULL)
   4619 		return (1);
   4620 	minor_name++;
   4621 
   4622 	/*
   4623 	 * If it's the clone driver, search the driver as named
   4624 	 * by the minor.  All clone minor perm entries other than
   4625 	 * alias nodes are actually installed on the real driver's list.
   4626 	 */
   4627 	if (dip == clone_dip) {
   4628 		major = ddi_name_to_major(minor_name);
   4629 		if (major == DDI_MAJOR_T_NONE) {
   4630 			if (moddebug & MODDEBUG_MINORPERM)
   4631 				cmn_err(CE_CONT, "dev_minorperm: "
   4632 				    "%s: no such driver\n", minor_name);
   4633 			return (1);
   4634 		}
   4635 		is_clone = 1;
   4636 	} else {
   4637 		major = ddi_driver_major(dip);
   4638 		ASSERT(major != DDI_MAJOR_T_NONE);
   4639 	}
   4640 
   4641 	dnp = &devnamesp[major];
   4642 	LOCK_DEV_OPS(&dnp->dn_lock);
   4643 
   4644 	/*
   4645 	 * Go through the driver's mperm list looking for
   4646 	 * a match for the specified minor.  If there's
   4647 	 * no matching pattern, use the wild card.
   4648 	 * Defer to the clone wild for clone if specified,
   4649 	 * otherwise fall back to the normal form.
   4650 	 */
   4651 	for (mp = dnp->dn_mperm; mp; mp = mp->mp_next) {
   4652 		if (gmatch(minor_name, mp->mp_minorname) != 0) {
   4653 			break;
   4654 		}
   4655 	}
   4656 	if (mp == NULL) {
   4657 		if (is_clone)
   4658 			mp = dnp->dn_mperm_clone;
   4659 		if (mp == NULL)
   4660 			mp = dnp->dn_mperm_wild;
   4661 	}
   4662 
   4663 	if (mp) {
   4664 		if (moddebug & MODDEBUG_MP_MATCH) {
   4665 			cmn_err(CE_CONT,
   4666 			    "minor perm defaults: %s %s 0%o %d %d\n",
   4667 			    name, mp->mp_minorname, mp->mp_mode,
   4668 			    mp->mp_uid, mp->mp_gid);
   4669 		}
   4670 		rmp->mp_uid = mp->mp_uid;
   4671 		rmp->mp_gid = mp->mp_gid;
   4672 		rmp->mp_mode = mp->mp_mode;
   4673 	}
   4674 	UNLOCK_DEV_OPS(&dnp->dn_lock);
   4675 
   4676 	/*
   4677 	 * If no match can be found for a clone node,
   4678 	 * search for a possible match for an alias.
   4679 	 * One such example is /dev/ptmx -> /devices/pseudo/clone@0:ptm,
   4680 	 * with minor perm entry clone:ptmx.
   4681 	 */
   4682 	if (mp == NULL && is_clone) {
   4683 		return (dev_alias_minorperm(dip, minor_name, rmp));
   4684 	}
   4685 
   4686 	return (mp == NULL);
   4687 }
   4688 
   4689 /*
   4690  * dynamicaly reference load a dl module/library, returning handle
   4691  */
   4692 /*ARGSUSED*/
   4693 ddi_modhandle_t
   4694 ddi_modopen(const char *modname, int mode, int *errnop)
   4695 {
   4696 	char		*subdir;
   4697 	char		*mod;
   4698 	int		subdirlen;
   4699 	struct modctl	*hmodp = NULL;
   4700 	int		retval = EINVAL;
   4701 
   4702 	ASSERT(modname && (mode == KRTLD_MODE_FIRST));
   4703 	if ((modname == NULL) || (mode != KRTLD_MODE_FIRST))
   4704 		goto out;
   4705 
   4706 	/* find last '/' in modname */
   4707 	mod = strrchr(modname, '/');
   4708 
   4709 	if (mod) {
   4710 		/* for subdir string without modification to argument */
   4711 		mod++;
   4712 		subdirlen = mod - modname;
   4713 		subdir = kmem_alloc(subdirlen, KM_SLEEP);
   4714 		(void) strlcpy(subdir, modname, subdirlen);
   4715 	} else {
   4716 		subdirlen = 0;
   4717 		subdir = "misc";
   4718 		mod = (char *)modname;
   4719 	}
   4720 
   4721 	/* reference load with errno return value */
   4722 	retval = modrload(subdir, mod, &hmodp);
   4723 
   4724 	if (subdirlen)
   4725 		kmem_free(subdir, subdirlen);
   4726 
   4727 out:	if (errnop)
   4728 		*errnop = retval;
   4729 
   4730 	if (moddebug & MODDEBUG_DDI_MOD)
   4731 		printf("ddi_modopen %s mode %x: %s %p %d\n",
   4732 		    modname ? modname : "<unknown>", mode,
   4733 		    hmodp ? hmodp->mod_filename : "<unknown>",
   4734 		    (void *)hmodp, retval);
   4735 
   4736 	return ((ddi_modhandle_t)hmodp);
   4737 }
   4738 
   4739 /* lookup "name" in open dl module/library */
   4740 void *
   4741 ddi_modsym(ddi_modhandle_t h, const char *name, int *errnop)
   4742 {
   4743 	struct modctl	*hmodp = (struct modctl *)h;
   4744 	void		*f;
   4745 	int		retval;
   4746 
   4747 	ASSERT(hmodp && name && hmodp->mod_installed && (hmodp->mod_ref >= 1));
   4748 	if ((hmodp == NULL) || (name == NULL) ||
   4749 	    (hmodp->mod_installed == 0) || (hmodp->mod_ref < 1)) {
   4750 		f = NULL;
   4751 		retval = EINVAL;
   4752 	} else {
   4753 		f = (void *)kobj_lookup(hmodp->mod_mp, (char *)name);
   4754 		if (f)
   4755 			retval = 0;
   4756 		else
   4757 			retval = ENOTSUP;
   4758 	}
   4759 
   4760 	if (moddebug & MODDEBUG_DDI_MOD)
   4761 		printf("ddi_modsym in %s of %s: %d %p\n",
   4762 		    hmodp ? hmodp->mod_modname : "<unknown>",
   4763 		    name ? name : "<unknown>", retval, f);
   4764 
   4765 	if (errnop)
   4766 		*errnop = retval;
   4767 	return (f);
   4768 }
   4769 
   4770 /* dynamic (un)reference unload of an open dl module/library */
   4771 int
   4772 ddi_modclose(ddi_modhandle_t h)
   4773 {
   4774 	struct modctl	*hmodp = (struct modctl *)h;
   4775 	struct modctl	*modp = NULL;
   4776 	int		retval;
   4777 
   4778 	ASSERT(hmodp && hmodp->mod_installed && (hmodp->mod_ref >= 1));
   4779 	if ((hmodp == NULL) ||
   4780 	    (hmodp->mod_installed == 0) || (hmodp->mod_ref < 1)) {
   4781 		retval = EINVAL;
   4782 		goto out;
   4783 	}
   4784 
   4785 	retval = modunrload(hmodp->mod_id, &modp, ddi_modclose_unload);
   4786 	if (retval == EBUSY)
   4787 		retval = 0;	/* EBUSY is not an error */
   4788 
   4789 	if (retval == 0) {
   4790 		ASSERT(hmodp == modp);
   4791 		if (hmodp != modp)
   4792 			retval = EINVAL;
   4793 	}
   4794 
   4795 out:	if (moddebug & MODDEBUG_DDI_MOD)
   4796 		printf("ddi_modclose %s: %d\n",
   4797 		    hmodp ? hmodp->mod_modname : "<unknown>", retval);
   4798 
   4799 	return (retval);
   4800 }
   4801