xref: /onnv-gate/usr/src/uts/common/io/vcons_conf.c (revision 7688:2757e6e1bb2a)
1*7688SAaron.Zang@Sun.COM /*
2*7688SAaron.Zang@Sun.COM  * CDDL HEADER START
3*7688SAaron.Zang@Sun.COM  *
4*7688SAaron.Zang@Sun.COM  * The contents of this file are subject to the terms of the
5*7688SAaron.Zang@Sun.COM  * Common Development and Distribution License (the "License").
6*7688SAaron.Zang@Sun.COM  * You may not use this file except in compliance with the License.
7*7688SAaron.Zang@Sun.COM  *
8*7688SAaron.Zang@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*7688SAaron.Zang@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*7688SAaron.Zang@Sun.COM  * See the License for the specific language governing permissions
11*7688SAaron.Zang@Sun.COM  * and limitations under the License.
12*7688SAaron.Zang@Sun.COM  *
13*7688SAaron.Zang@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*7688SAaron.Zang@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*7688SAaron.Zang@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*7688SAaron.Zang@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*7688SAaron.Zang@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*7688SAaron.Zang@Sun.COM  *
19*7688SAaron.Zang@Sun.COM  * CDDL HEADER END
20*7688SAaron.Zang@Sun.COM  */
21*7688SAaron.Zang@Sun.COM /*
22*7688SAaron.Zang@Sun.COM  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23*7688SAaron.Zang@Sun.COM  * Use is subject to license terms.
24*7688SAaron.Zang@Sun.COM  */
25*7688SAaron.Zang@Sun.COM 
26*7688SAaron.Zang@Sun.COM #include <sys/types.h>
27*7688SAaron.Zang@Sun.COM #include <sys/param.h>
28*7688SAaron.Zang@Sun.COM #include <sys/termios.h>
29*7688SAaron.Zang@Sun.COM #include <sys/stream.h>
30*7688SAaron.Zang@Sun.COM #include <sys/stropts.h>
31*7688SAaron.Zang@Sun.COM #include <sys/kmem.h>
32*7688SAaron.Zang@Sun.COM #include <sys/stat.h>
33*7688SAaron.Zang@Sun.COM #include <sys/sunddi.h>
34*7688SAaron.Zang@Sun.COM #include <sys/ddi.h>
35*7688SAaron.Zang@Sun.COM #include <sys/bitmap.h>
36*7688SAaron.Zang@Sun.COM #include <sys/sysmacros.h>
37*7688SAaron.Zang@Sun.COM #include <sys/ddi_impldefs.h>
38*7688SAaron.Zang@Sun.COM #include <sys/zone.h>
39*7688SAaron.Zang@Sun.COM #include <sys/thread.h>
40*7688SAaron.Zang@Sun.COM #ifdef DEBUG
41*7688SAaron.Zang@Sun.COM #include <sys/strlog.h>
42*7688SAaron.Zang@Sun.COM #endif
43*7688SAaron.Zang@Sun.COM 
44*7688SAaron.Zang@Sun.COM #include <sys/consdev.h>
45*7688SAaron.Zang@Sun.COM #include <sys/console.h>
46*7688SAaron.Zang@Sun.COM #include <sys/wscons.h>
47*7688SAaron.Zang@Sun.COM #include <sys/vt_impl.h>
48*7688SAaron.Zang@Sun.COM #include <sys/note.h>
49*7688SAaron.Zang@Sun.COM #include <sys/avl.h>
50*7688SAaron.Zang@Sun.COM 
51*7688SAaron.Zang@Sun.COM /* set if console driver is attached */
52*7688SAaron.Zang@Sun.COM dev_info_t *wc_dip = NULL;
53*7688SAaron.Zang@Sun.COM /* active virtual console minor number */
54*7688SAaron.Zang@Sun.COM minor_t vc_active_console = VT_MINOR_INVALID;
55*7688SAaron.Zang@Sun.COM /* vc_state_t AVL tree */
56*7688SAaron.Zang@Sun.COM avl_tree_t vc_avl_root;
57*7688SAaron.Zang@Sun.COM /* virtual console global lock */
58*7688SAaron.Zang@Sun.COM kmutex_t vc_lock;
59*7688SAaron.Zang@Sun.COM 
60*7688SAaron.Zang@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(vc_lock, wc_dip vc_avl_root vc_active_console))
61*7688SAaron.Zang@Sun.COM 
62*7688SAaron.Zang@Sun.COM /*
63*7688SAaron.Zang@Sun.COM  * Called from vt devname part. Checks if dip is attached. If it is,
64*7688SAaron.Zang@Sun.COM  * return its major number.
65*7688SAaron.Zang@Sun.COM  */
66*7688SAaron.Zang@Sun.COM major_t
67*7688SAaron.Zang@Sun.COM vt_wc_attached(void)
68*7688SAaron.Zang@Sun.COM {
69*7688SAaron.Zang@Sun.COM 	major_t maj = (major_t)-1;
70*7688SAaron.Zang@Sun.COM 
71*7688SAaron.Zang@Sun.COM 	mutex_enter(&vc_lock);
72*7688SAaron.Zang@Sun.COM 
73*7688SAaron.Zang@Sun.COM 	if (wc_dip)
74*7688SAaron.Zang@Sun.COM 		maj = ddi_driver_major(wc_dip);
75*7688SAaron.Zang@Sun.COM 
76*7688SAaron.Zang@Sun.COM 	mutex_exit(&vc_lock);
77*7688SAaron.Zang@Sun.COM 
78*7688SAaron.Zang@Sun.COM 	return (maj);
79*7688SAaron.Zang@Sun.COM }
80*7688SAaron.Zang@Sun.COM 
81*7688SAaron.Zang@Sun.COM void
82*7688SAaron.Zang@Sun.COM vt_getactive(char *buf, int buflen)
83*7688SAaron.Zang@Sun.COM {
84*7688SAaron.Zang@Sun.COM 	ASSERT(buf);
85*7688SAaron.Zang@Sun.COM 	ASSERT(buflen != 0);
86*7688SAaron.Zang@Sun.COM 
87*7688SAaron.Zang@Sun.COM 	mutex_enter(&vc_lock);
88*7688SAaron.Zang@Sun.COM 
89*7688SAaron.Zang@Sun.COM 	if (vc_active_console == 0 || vc_active_console == VT_MINOR_INVALID)
90*7688SAaron.Zang@Sun.COM 		(void) snprintf(buf, buflen, "/dev/console");
91*7688SAaron.Zang@Sun.COM 	else
92*7688SAaron.Zang@Sun.COM 		(void) snprintf(buf, buflen, "%d", vc_active_console);
93*7688SAaron.Zang@Sun.COM 
94*7688SAaron.Zang@Sun.COM 	mutex_exit(&vc_lock);
95*7688SAaron.Zang@Sun.COM }
96*7688SAaron.Zang@Sun.COM 
97*7688SAaron.Zang@Sun.COM boolean_t
98*7688SAaron.Zang@Sun.COM vt_minor_valid(minor_t minor)
99*7688SAaron.Zang@Sun.COM {
100*7688SAaron.Zang@Sun.COM 	if (consmode == CONS_FW) {
101*7688SAaron.Zang@Sun.COM 		if (minor == 0)
102*7688SAaron.Zang@Sun.COM 			return (B_TRUE);
103*7688SAaron.Zang@Sun.COM 
104*7688SAaron.Zang@Sun.COM 		return (B_FALSE);
105*7688SAaron.Zang@Sun.COM 	}
106*7688SAaron.Zang@Sun.COM 
107*7688SAaron.Zang@Sun.COM 	mutex_enter(&vc_lock);
108*7688SAaron.Zang@Sun.COM 	if (minor < VC_INSTANCES_COUNT) {
109*7688SAaron.Zang@Sun.COM 		mutex_exit(&vc_lock);
110*7688SAaron.Zang@Sun.COM 		return (B_TRUE);
111*7688SAaron.Zang@Sun.COM 	}
112*7688SAaron.Zang@Sun.COM 
113*7688SAaron.Zang@Sun.COM 	mutex_exit(&vc_lock);
114*7688SAaron.Zang@Sun.COM 	return (B_FALSE);
115*7688SAaron.Zang@Sun.COM 
116*7688SAaron.Zang@Sun.COM }
117