xref: /onnv-gate/usr/src/uts/common/io/vcons_conf.c (revision 12195:cf3a8ea2dcfd)
17688SAaron.Zang@Sun.COM /*
27688SAaron.Zang@Sun.COM  * CDDL HEADER START
37688SAaron.Zang@Sun.COM  *
47688SAaron.Zang@Sun.COM  * The contents of this file are subject to the terms of the
57688SAaron.Zang@Sun.COM  * Common Development and Distribution License (the "License").
67688SAaron.Zang@Sun.COM  * You may not use this file except in compliance with the License.
77688SAaron.Zang@Sun.COM  *
87688SAaron.Zang@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97688SAaron.Zang@Sun.COM  * or http://www.opensolaris.org/os/licensing.
107688SAaron.Zang@Sun.COM  * See the License for the specific language governing permissions
117688SAaron.Zang@Sun.COM  * and limitations under the License.
127688SAaron.Zang@Sun.COM  *
137688SAaron.Zang@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
147688SAaron.Zang@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157688SAaron.Zang@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
167688SAaron.Zang@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
177688SAaron.Zang@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
187688SAaron.Zang@Sun.COM  *
197688SAaron.Zang@Sun.COM  * CDDL HEADER END
207688SAaron.Zang@Sun.COM  */
217688SAaron.Zang@Sun.COM /*
22*12195SAaron.Zang@Sun.COM  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
237688SAaron.Zang@Sun.COM  */
247688SAaron.Zang@Sun.COM 
257688SAaron.Zang@Sun.COM #include <sys/types.h>
267688SAaron.Zang@Sun.COM #include <sys/param.h>
277688SAaron.Zang@Sun.COM #include <sys/termios.h>
287688SAaron.Zang@Sun.COM #include <sys/stream.h>
297688SAaron.Zang@Sun.COM #include <sys/stropts.h>
307688SAaron.Zang@Sun.COM #include <sys/kmem.h>
317688SAaron.Zang@Sun.COM #include <sys/stat.h>
327688SAaron.Zang@Sun.COM #include <sys/sunddi.h>
337688SAaron.Zang@Sun.COM #include <sys/ddi.h>
347688SAaron.Zang@Sun.COM #include <sys/bitmap.h>
357688SAaron.Zang@Sun.COM #include <sys/sysmacros.h>
367688SAaron.Zang@Sun.COM #include <sys/ddi_impldefs.h>
377688SAaron.Zang@Sun.COM #include <sys/zone.h>
387688SAaron.Zang@Sun.COM #include <sys/thread.h>
397688SAaron.Zang@Sun.COM #ifdef DEBUG
407688SAaron.Zang@Sun.COM #include <sys/strlog.h>
417688SAaron.Zang@Sun.COM #endif
427688SAaron.Zang@Sun.COM 
437688SAaron.Zang@Sun.COM #include <sys/consdev.h>
447688SAaron.Zang@Sun.COM #include <sys/console.h>
457688SAaron.Zang@Sun.COM #include <sys/wscons.h>
467688SAaron.Zang@Sun.COM #include <sys/vt_impl.h>
477688SAaron.Zang@Sun.COM #include <sys/note.h>
487688SAaron.Zang@Sun.COM #include <sys/avl.h>
497688SAaron.Zang@Sun.COM 
507688SAaron.Zang@Sun.COM /* set if console driver is attached */
517688SAaron.Zang@Sun.COM dev_info_t *wc_dip = NULL;
527688SAaron.Zang@Sun.COM /* active virtual console minor number */
537688SAaron.Zang@Sun.COM minor_t vc_active_console = VT_MINOR_INVALID;
54*12195SAaron.Zang@Sun.COM /*
55*12195SAaron.Zang@Sun.COM  * console_user symbol link minor number.
56*12195SAaron.Zang@Sun.COM  * VT_MINOR_INVALID	:	/dev/console
57*12195SAaron.Zang@Sun.COM  * 	N		: 	/dev/vt/N
58*12195SAaron.Zang@Sun.COM  */
59*12195SAaron.Zang@Sun.COM minor_t vc_cons_user = VT_MINOR_INVALID;
607688SAaron.Zang@Sun.COM /* vc_state_t AVL tree */
617688SAaron.Zang@Sun.COM avl_tree_t vc_avl_root;
627688SAaron.Zang@Sun.COM /* virtual console global lock */
637688SAaron.Zang@Sun.COM kmutex_t vc_lock;
647688SAaron.Zang@Sun.COM 
_NOTE(MUTEX_PROTECTS_DATA (vc_lock,wc_dip vc_avl_root vc_active_console vc_cons_user))65*12195SAaron.Zang@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(vc_lock, wc_dip vc_avl_root vc_active_console
66*12195SAaron.Zang@Sun.COM vc_cons_user))
677688SAaron.Zang@Sun.COM 
687688SAaron.Zang@Sun.COM /*
697688SAaron.Zang@Sun.COM  * Called from vt devname part. Checks if dip is attached. If it is,
707688SAaron.Zang@Sun.COM  * return its major number.
717688SAaron.Zang@Sun.COM  */
727688SAaron.Zang@Sun.COM major_t
737688SAaron.Zang@Sun.COM vt_wc_attached(void)
747688SAaron.Zang@Sun.COM {
757688SAaron.Zang@Sun.COM 	major_t maj = (major_t)-1;
767688SAaron.Zang@Sun.COM 
777688SAaron.Zang@Sun.COM 	mutex_enter(&vc_lock);
787688SAaron.Zang@Sun.COM 
797688SAaron.Zang@Sun.COM 	if (wc_dip)
807688SAaron.Zang@Sun.COM 		maj = ddi_driver_major(wc_dip);
817688SAaron.Zang@Sun.COM 
827688SAaron.Zang@Sun.COM 	mutex_exit(&vc_lock);
837688SAaron.Zang@Sun.COM 
847688SAaron.Zang@Sun.COM 	return (maj);
857688SAaron.Zang@Sun.COM }
867688SAaron.Zang@Sun.COM 
877688SAaron.Zang@Sun.COM void
vt_getactive(char * buf,int buflen)887688SAaron.Zang@Sun.COM vt_getactive(char *buf, int buflen)
897688SAaron.Zang@Sun.COM {
907688SAaron.Zang@Sun.COM 	ASSERT(buf);
917688SAaron.Zang@Sun.COM 	ASSERT(buflen != 0);
927688SAaron.Zang@Sun.COM 
937688SAaron.Zang@Sun.COM 	mutex_enter(&vc_lock);
947688SAaron.Zang@Sun.COM 
957688SAaron.Zang@Sun.COM 	if (vc_active_console == 0 || vc_active_console == VT_MINOR_INVALID)
967688SAaron.Zang@Sun.COM 		(void) snprintf(buf, buflen, "/dev/console");
977688SAaron.Zang@Sun.COM 	else
98*12195SAaron.Zang@Sun.COM 		(void) snprintf(buf, buflen, "%u", vc_active_console);
99*12195SAaron.Zang@Sun.COM 
100*12195SAaron.Zang@Sun.COM 	mutex_exit(&vc_lock);
101*12195SAaron.Zang@Sun.COM }
1027688SAaron.Zang@Sun.COM 
103*12195SAaron.Zang@Sun.COM void
vt_getconsuser(char * buf,int buflen)104*12195SAaron.Zang@Sun.COM vt_getconsuser(char *buf, int buflen)
105*12195SAaron.Zang@Sun.COM {
106*12195SAaron.Zang@Sun.COM 	ASSERT(buf);
107*12195SAaron.Zang@Sun.COM 	ASSERT(buflen != 0);
108*12195SAaron.Zang@Sun.COM 
109*12195SAaron.Zang@Sun.COM 	mutex_enter(&vc_lock);
110*12195SAaron.Zang@Sun.COM 
111*12195SAaron.Zang@Sun.COM 	if (vc_cons_user == VT_MINOR_INVALID) {
112*12195SAaron.Zang@Sun.COM 		(void) snprintf(buf, buflen, "/dev/console");
113*12195SAaron.Zang@Sun.COM 		mutex_exit(&vc_lock);
114*12195SAaron.Zang@Sun.COM 		return;
115*12195SAaron.Zang@Sun.COM 	}
116*12195SAaron.Zang@Sun.COM 
117*12195SAaron.Zang@Sun.COM 	(void) snprintf(buf, buflen, "%u", vc_cons_user);
1187688SAaron.Zang@Sun.COM 	mutex_exit(&vc_lock);
1197688SAaron.Zang@Sun.COM }
1207688SAaron.Zang@Sun.COM 
1217688SAaron.Zang@Sun.COM boolean_t
vt_minor_valid(minor_t minor)1227688SAaron.Zang@Sun.COM vt_minor_valid(minor_t minor)
1237688SAaron.Zang@Sun.COM {
1247688SAaron.Zang@Sun.COM 	if (consmode == CONS_FW) {
1257688SAaron.Zang@Sun.COM 		if (minor == 0)
1267688SAaron.Zang@Sun.COM 			return (B_TRUE);
1277688SAaron.Zang@Sun.COM 
1287688SAaron.Zang@Sun.COM 		return (B_FALSE);
1297688SAaron.Zang@Sun.COM 	}
1307688SAaron.Zang@Sun.COM 
1317688SAaron.Zang@Sun.COM 	mutex_enter(&vc_lock);
1327688SAaron.Zang@Sun.COM 	if (minor < VC_INSTANCES_COUNT) {
1337688SAaron.Zang@Sun.COM 		mutex_exit(&vc_lock);
1347688SAaron.Zang@Sun.COM 		return (B_TRUE);
1357688SAaron.Zang@Sun.COM 	}
1367688SAaron.Zang@Sun.COM 
1377688SAaron.Zang@Sun.COM 	mutex_exit(&vc_lock);
1387688SAaron.Zang@Sun.COM 	return (B_FALSE);
1397688SAaron.Zang@Sun.COM 
1407688SAaron.Zang@Sun.COM }
141