/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef DEBUG #include #endif #include #include #include #include #include #include /* set if console driver is attached */ dev_info_t *wc_dip = NULL; /* active virtual console minor number */ minor_t vc_active_console = VT_MINOR_INVALID; /* * console_user symbol link minor number. * VT_MINOR_INVALID : /dev/console * N : /dev/vt/N */ minor_t vc_cons_user = VT_MINOR_INVALID; /* vc_state_t AVL tree */ avl_tree_t vc_avl_root; /* virtual console global lock */ kmutex_t vc_lock; _NOTE(MUTEX_PROTECTS_DATA(vc_lock, wc_dip vc_avl_root vc_active_console vc_cons_user)) /* * Called from vt devname part. Checks if dip is attached. If it is, * return its major number. */ major_t vt_wc_attached(void) { major_t maj = (major_t)-1; mutex_enter(&vc_lock); if (wc_dip) maj = ddi_driver_major(wc_dip); mutex_exit(&vc_lock); return (maj); } void vt_getactive(char *buf, int buflen) { ASSERT(buf); ASSERT(buflen != 0); mutex_enter(&vc_lock); if (vc_active_console == 0 || vc_active_console == VT_MINOR_INVALID) (void) snprintf(buf, buflen, "/dev/console"); else (void) snprintf(buf, buflen, "%u", vc_active_console); mutex_exit(&vc_lock); } void vt_getconsuser(char *buf, int buflen) { ASSERT(buf); ASSERT(buflen != 0); mutex_enter(&vc_lock); if (vc_cons_user == VT_MINOR_INVALID) { (void) snprintf(buf, buflen, "/dev/console"); mutex_exit(&vc_lock); return; } (void) snprintf(buf, buflen, "%u", vc_cons_user); mutex_exit(&vc_lock); } boolean_t vt_minor_valid(minor_t minor) { if (consmode == CONS_FW) { if (minor == 0) return (B_TRUE); return (B_FALSE); } mutex_enter(&vc_lock); if (minor < VC_INSTANCES_COUNT) { mutex_exit(&vc_lock); return (B_TRUE); } mutex_exit(&vc_lock); return (B_FALSE); }