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