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