1aecfc01dSrui zang - Sun Microsystems - Beijing China /* 2aecfc01dSrui zang - Sun Microsystems - Beijing China * CDDL HEADER START 3aecfc01dSrui zang - Sun Microsystems - Beijing China * 4aecfc01dSrui zang - Sun Microsystems - Beijing China * The contents of this file are subject to the terms of the 5aecfc01dSrui zang - Sun Microsystems - Beijing China * Common Development and Distribution License (the "License"). 6aecfc01dSrui zang - Sun Microsystems - Beijing China * You may not use this file except in compliance with the License. 7aecfc01dSrui zang - Sun Microsystems - Beijing China * 8aecfc01dSrui zang - Sun Microsystems - Beijing China * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9aecfc01dSrui zang - Sun Microsystems - Beijing China * or http://www.opensolaris.org/os/licensing. 10aecfc01dSrui zang - Sun Microsystems - Beijing China * See the License for the specific language governing permissions 11aecfc01dSrui zang - Sun Microsystems - Beijing China * and limitations under the License. 12aecfc01dSrui zang - Sun Microsystems - Beijing China * 13aecfc01dSrui zang - Sun Microsystems - Beijing China * When distributing Covered Code, include this CDDL HEADER in each 14aecfc01dSrui zang - Sun Microsystems - Beijing China * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15aecfc01dSrui zang - Sun Microsystems - Beijing China * If applicable, add the following below this CDDL HEADER, with the 16aecfc01dSrui zang - Sun Microsystems - Beijing China * fields enclosed by brackets "[]" replaced with your own identifying 17aecfc01dSrui zang - Sun Microsystems - Beijing China * information: Portions Copyright [yyyy] [name of copyright owner] 18aecfc01dSrui zang - Sun Microsystems - Beijing China * 19aecfc01dSrui zang - Sun Microsystems - Beijing China * CDDL HEADER END 20aecfc01dSrui zang - Sun Microsystems - Beijing China */ 21aecfc01dSrui zang - Sun Microsystems - Beijing China 22aecfc01dSrui zang - Sun Microsystems - Beijing China /* 23aecfc01dSrui zang - Sun Microsystems - Beijing China * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24aecfc01dSrui zang - Sun Microsystems - Beijing China * Use is subject to license terms. 25aecfc01dSrui zang - Sun Microsystems - Beijing China */ 26aecfc01dSrui zang - Sun Microsystems - Beijing China 27aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/types.h> 28aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/param.h> 29aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/signal.h> 30aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/cred.h> 31aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/vnode.h> 32aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/termios.h> 33aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/termio.h> 34aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/ttold.h> 35aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/stropts.h> 36aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/stream.h> 37aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/strsun.h> 38aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/tty.h> 39aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/buf.h> 40aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/uio.h> 41aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/stat.h> 42aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/sysmacros.h> 43aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/errno.h> 44aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/proc.h> 45aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/procset.h> 46aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/fault.h> 47aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/siginfo.h> 48aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/debug.h> 49aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/kd.h> 50aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/vt.h> 51aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/vtdaemon.h> 52aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/session.h> 53aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/door.h> 54aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/kmem.h> 55aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/cpuvar.h> 56aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/kbio.h> 57aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/strredir.h> 58aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/fs/snode.h> 59aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/consdev.h> 60aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/conf.h> 61aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/cmn_err.h> 62aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/console.h> 63aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/promif.h> 64aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/note.h> 65aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/polled_io.h> 66aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/systm.h> 67aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/ddi.h> 68aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/sunddi.h> 69aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/sunndi.h> 70aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/esunddi.h> 71aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/sunldi.h> 72aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/debug.h> 73aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/console.h> 74aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/ddi_impldefs.h> 75aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/policy.h> 76aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/tem.h> 77aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/wscons.h> 78aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/systm.h> 79aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/modctl.h> 80aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/vt_impl.h> 81aecfc01dSrui zang - Sun Microsystems - Beijing China #include <sys/consconfig_dacf.h> 82aecfc01dSrui zang - Sun Microsystems - Beijing China 83aecfc01dSrui zang - Sun Microsystems - Beijing China /* 84aecfc01dSrui zang - Sun Microsystems - Beijing China * This file belongs to wc STREAMS module which has a D_MTPERMODE 85aecfc01dSrui zang - Sun Microsystems - Beijing China * inner perimeter. See "Locking Policy" comment in wscons.c for 86aecfc01dSrui zang - Sun Microsystems - Beijing China * more information. 87aecfc01dSrui zang - Sun Microsystems - Beijing China */ 88aecfc01dSrui zang - Sun Microsystems - Beijing China 89aecfc01dSrui zang - Sun Microsystems - Beijing China /* 90aecfc01dSrui zang - Sun Microsystems - Beijing China * Minor name device file Hotkeys 91aecfc01dSrui zang - Sun Microsystems - Beijing China * 92aecfc01dSrui zang - Sun Microsystems - Beijing China * 0 the system console /dev/console Alt + F1 93aecfc01dSrui zang - Sun Microsystems - Beijing China * 0: virtual console #1 /dev/vt/0 Alt + F1 94aecfc01dSrui zang - Sun Microsystems - Beijing China * 95aecfc01dSrui zang - Sun Microsystems - Beijing China * 2: virtual console #2 /dev/vt/2 Alt + F2 96aecfc01dSrui zang - Sun Microsystems - Beijing China * 3: virtual console #3 /dev/vt/3 Alt + F3 97aecfc01dSrui zang - Sun Microsystems - Beijing China * ...... 98aecfc01dSrui zang - Sun Microsystems - Beijing China * n: virtual console #n /dev/vt/n Alt + Fn 99aecfc01dSrui zang - Sun Microsystems - Beijing China * 100aecfc01dSrui zang - Sun Microsystems - Beijing China * Note that vtdaemon is running on /dev/vt/1 (minor=1), 101aecfc01dSrui zang - Sun Microsystems - Beijing China * which is not available to end users. 102aecfc01dSrui zang - Sun Microsystems - Beijing China * 103aecfc01dSrui zang - Sun Microsystems - Beijing China */ 104aecfc01dSrui zang - Sun Microsystems - Beijing China 105aecfc01dSrui zang - Sun Microsystems - Beijing China #define VT_DAEMON_MINOR 1 106aecfc01dSrui zang - Sun Microsystems - Beijing China #define VT_IS_DAEMON(minor) ((minor) == VT_DAEMON_MINOR) 107aecfc01dSrui zang - Sun Microsystems - Beijing China 108aecfc01dSrui zang - Sun Microsystems - Beijing China extern void wc_get_size(vc_state_t *pvc); 109aecfc01dSrui zang - Sun Microsystems - Beijing China extern boolean_t consconfig_console_is_tipline(void); 110aecfc01dSrui zang - Sun Microsystems - Beijing China 111aecfc01dSrui zang - Sun Microsystems - Beijing China 112aecfc01dSrui zang - Sun Microsystems - Beijing China minor_t vc_last_console = VT_MINOR_INVALID; /* the last used console */ 113aecfc01dSrui zang - Sun Microsystems - Beijing China volatile uint_t vc_target_console; /* arg (1..n) */ 114aecfc01dSrui zang - Sun Microsystems - Beijing China 115aecfc01dSrui zang - Sun Microsystems - Beijing China static volatile minor_t vc_inuse_max_minor = 0; 116aecfc01dSrui zang - Sun Microsystems - Beijing China static list_t vc_waitactive_list; 117aecfc01dSrui zang - Sun Microsystems - Beijing China _NOTE(SCHEME_PROTECTS_DATA("D_MTPERMOD protected data", vc_target_console)) 118aecfc01dSrui zang - Sun Microsystems - Beijing China _NOTE(SCHEME_PROTECTS_DATA("D_MTPERMOD protected data", vc_last_console)) 119aecfc01dSrui zang - Sun Microsystems - Beijing China _NOTE(SCHEME_PROTECTS_DATA("D_MTPERMOD protected data", vc_inuse_max_minor)) 120aecfc01dSrui zang - Sun Microsystems - Beijing China _NOTE(SCHEME_PROTECTS_DATA("D_MTPERMOD protected data", vc_waitactive_list)) 121aecfc01dSrui zang - Sun Microsystems - Beijing China 122aecfc01dSrui zang - Sun Microsystems - Beijing China static int vt_pending_vtno = -1; 123aecfc01dSrui zang - Sun Microsystems - Beijing China kmutex_t vt_pending_vtno_lock; 124aecfc01dSrui zang - Sun Microsystems - Beijing China _NOTE(MUTEX_PROTECTS_DATA(vt_pending_vtno_lock, vt_pending_vtno)) 125aecfc01dSrui zang - Sun Microsystems - Beijing China 126aecfc01dSrui zang - Sun Microsystems - Beijing China static int vt_activate(uint_t vt_no, cred_t *credp); 127aecfc01dSrui zang - Sun Microsystems - Beijing China static void vt_copyout(queue_t *qp, mblk_t *mp, mblk_t *tmp, uint_t size); 128aecfc01dSrui zang - Sun Microsystems - Beijing China static void vt_copyin(queue_t *qp, mblk_t *mp, uint_t size); 129aecfc01dSrui zang - Sun Microsystems - Beijing China static void vt_iocnak(queue_t *qp, mblk_t *mp, int error); 130aecfc01dSrui zang - Sun Microsystems - Beijing China static void vt_iocack(queue_t *qp, mblk_t *mp); 131aecfc01dSrui zang - Sun Microsystems - Beijing China 132aecfc01dSrui zang - Sun Microsystems - Beijing China static uint_t vt_minor2arg(minor_t minor); 133aecfc01dSrui zang - Sun Microsystems - Beijing China static minor_t vt_arg2minor(uint_t arg); 134aecfc01dSrui zang - Sun Microsystems - Beijing China 135aecfc01dSrui zang - Sun Microsystems - Beijing China /* 136aecfc01dSrui zang - Sun Microsystems - Beijing China * If the system console is directed to tipline, consider /dev/vt/0 as 137aecfc01dSrui zang - Sun Microsystems - Beijing China * not being used. 138aecfc01dSrui zang - Sun Microsystems - Beijing China * For other VT, if it is opened and tty is initialized, consider it 139aecfc01dSrui zang - Sun Microsystems - Beijing China * as being used. 140aecfc01dSrui zang - Sun Microsystems - Beijing China */ 141aecfc01dSrui zang - Sun Microsystems - Beijing China #define VT_IS_INUSE(id) \ 142aecfc01dSrui zang - Sun Microsystems - Beijing China (((vt_minor2vc(id))->vc_flags & WCS_ISOPEN) && \ 143aecfc01dSrui zang - Sun Microsystems - Beijing China ((vt_minor2vc(id))->vc_flags & WCS_INIT) && \ 144aecfc01dSrui zang - Sun Microsystems - Beijing China (id != 0 || !consconfig_console_is_tipline())) 145aecfc01dSrui zang - Sun Microsystems - Beijing China 146aecfc01dSrui zang - Sun Microsystems - Beijing China /* 147aecfc01dSrui zang - Sun Microsystems - Beijing China * the vt switching message is encoded as: 148aecfc01dSrui zang - Sun Microsystems - Beijing China * 149aecfc01dSrui zang - Sun Microsystems - Beijing China * ------------------------------------------------------------- 150aecfc01dSrui zang - Sun Microsystems - Beijing China * | \033 | 'Q' | vtno + 'A' | opcode | 'z' | '\0' | 151aecfc01dSrui zang - Sun Microsystems - Beijing China * ------------------------------------------------------------- 152aecfc01dSrui zang - Sun Microsystems - Beijing China */ 153aecfc01dSrui zang - Sun Microsystems - Beijing China #define VT_MSG_SWITCH(mp) \ 154aecfc01dSrui zang - Sun Microsystems - Beijing China ((int)((mp)->b_wptr - (mp)->b_rptr) >= 5 && \ 155aecfc01dSrui zang - Sun Microsystems - Beijing China *((mp)->b_rptr) == '\033' && \ 156aecfc01dSrui zang - Sun Microsystems - Beijing China *((mp)->b_rptr + 1) == 'Q' && \ 157aecfc01dSrui zang - Sun Microsystems - Beijing China *((mp)->b_rptr + 4) == 'z') 158aecfc01dSrui zang - Sun Microsystems - Beijing China 159aecfc01dSrui zang - Sun Microsystems - Beijing China #define VT_MSG_VTNO(mp) (*((mp)->b_rptr + 2) - 'A') 160aecfc01dSrui zang - Sun Microsystems - Beijing China #define VT_MSG_OPCODE(mp) (*((mp)->b_rptr + 3)) 161aecfc01dSrui zang - Sun Microsystems - Beijing China 162aecfc01dSrui zang - Sun Microsystems - Beijing China #define VT_DOORCALL_MAX_RETRY 3 163aecfc01dSrui zang - Sun Microsystems - Beijing China 164aecfc01dSrui zang - Sun Microsystems - Beijing China static void 165aecfc01dSrui zang - Sun Microsystems - Beijing China vt_init_ttycommon(tty_common_t *pcommon) 166aecfc01dSrui zang - Sun Microsystems - Beijing China { 167aecfc01dSrui zang - Sun Microsystems - Beijing China struct termios *termiosp; 168aecfc01dSrui zang - Sun Microsystems - Beijing China int len; 169aecfc01dSrui zang - Sun Microsystems - Beijing China 170aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_init(&pcommon->t_excl, NULL, MUTEX_DEFAULT, NULL); 171aecfc01dSrui zang - Sun Microsystems - Beijing China pcommon->t_iflag = 0; 172aecfc01dSrui zang - Sun Microsystems - Beijing China 173aecfc01dSrui zang - Sun Microsystems - Beijing China /* 174aecfc01dSrui zang - Sun Microsystems - Beijing China * Get the default termios settings (cflag). 175aecfc01dSrui zang - Sun Microsystems - Beijing China * These are stored as a property in the 176aecfc01dSrui zang - Sun Microsystems - Beijing China * "options" node. 177aecfc01dSrui zang - Sun Microsystems - Beijing China */ 178aecfc01dSrui zang - Sun Microsystems - Beijing China if (ddi_getlongprop(DDI_DEV_T_ANY, 179aecfc01dSrui zang - Sun Microsystems - Beijing China ddi_root_node(), 0, "ttymodes", 180aecfc01dSrui zang - Sun Microsystems - Beijing China (caddr_t)&termiosp, &len) == DDI_PROP_SUCCESS) { 181aecfc01dSrui zang - Sun Microsystems - Beijing China 182aecfc01dSrui zang - Sun Microsystems - Beijing China if (len == sizeof (struct termios)) 183aecfc01dSrui zang - Sun Microsystems - Beijing China pcommon->t_cflag = termiosp->c_cflag; 184aecfc01dSrui zang - Sun Microsystems - Beijing China else 185aecfc01dSrui zang - Sun Microsystems - Beijing China cmn_err(CE_WARN, 186aecfc01dSrui zang - Sun Microsystems - Beijing China "wc: Couldn't get ttymodes property!"); 187aecfc01dSrui zang - Sun Microsystems - Beijing China 188aecfc01dSrui zang - Sun Microsystems - Beijing China kmem_free(termiosp, len); 189aecfc01dSrui zang - Sun Microsystems - Beijing China } else { 190aecfc01dSrui zang - Sun Microsystems - Beijing China /* 191aecfc01dSrui zang - Sun Microsystems - Beijing China * Gack! Whine about it. 192aecfc01dSrui zang - Sun Microsystems - Beijing China */ 193aecfc01dSrui zang - Sun Microsystems - Beijing China cmn_err(CE_WARN, 194aecfc01dSrui zang - Sun Microsystems - Beijing China "wc: Couldn't get ttymodes property!"); 195aecfc01dSrui zang - Sun Microsystems - Beijing China } 196aecfc01dSrui zang - Sun Microsystems - Beijing China 197aecfc01dSrui zang - Sun Microsystems - Beijing China pcommon->t_iocpending = NULL; 198aecfc01dSrui zang - Sun Microsystems - Beijing China } 199aecfc01dSrui zang - Sun Microsystems - Beijing China 200aecfc01dSrui zang - Sun Microsystems - Beijing China static int 201aecfc01dSrui zang - Sun Microsystems - Beijing China vt_config(uint_t count) 202aecfc01dSrui zang - Sun Microsystems - Beijing China { 203aecfc01dSrui zang - Sun Microsystems - Beijing China if (consmode != CONS_KFB) 204aecfc01dSrui zang - Sun Microsystems - Beijing China return (ENOTSUP); 205aecfc01dSrui zang - Sun Microsystems - Beijing China 206aecfc01dSrui zang - Sun Microsystems - Beijing China /* one for system console, one for vtdaemon */ 207aecfc01dSrui zang - Sun Microsystems - Beijing China if (count < 2) 208aecfc01dSrui zang - Sun Microsystems - Beijing China return (ENXIO); 209aecfc01dSrui zang - Sun Microsystems - Beijing China 210aecfc01dSrui zang - Sun Microsystems - Beijing China /* 211aecfc01dSrui zang - Sun Microsystems - Beijing China * Shouldn't allow to shrink the max vt minor to be smaller than 212aecfc01dSrui zang - Sun Microsystems - Beijing China * the max in used minor. 213aecfc01dSrui zang - Sun Microsystems - Beijing China */ 214aecfc01dSrui zang - Sun Microsystems - Beijing China if (count <= vc_inuse_max_minor) 215aecfc01dSrui zang - Sun Microsystems - Beijing China return (EBUSY); 216aecfc01dSrui zang - Sun Microsystems - Beijing China 217aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_enter(&vc_lock); 218aecfc01dSrui zang - Sun Microsystems - Beijing China vt_resize(count); 219aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&vc_lock); 220aecfc01dSrui zang - Sun Microsystems - Beijing China 221aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 222aecfc01dSrui zang - Sun Microsystems - Beijing China } 223aecfc01dSrui zang - Sun Microsystems - Beijing China 224aecfc01dSrui zang - Sun Microsystems - Beijing China void 225aecfc01dSrui zang - Sun Microsystems - Beijing China vt_clean(queue_t *q, vc_state_t *pvc) 226aecfc01dSrui zang - Sun Microsystems - Beijing China { 227aecfc01dSrui zang - Sun Microsystems - Beijing China ASSERT(MUTEX_HELD(&pvc->vc_state_lock)); 228aecfc01dSrui zang - Sun Microsystems - Beijing China 229aecfc01dSrui zang - Sun Microsystems - Beijing China if (pvc->vc_bufcallid != 0) { 230aecfc01dSrui zang - Sun Microsystems - Beijing China qunbufcall(q, pvc->vc_bufcallid); 231aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_bufcallid = 0; 232aecfc01dSrui zang - Sun Microsystems - Beijing China } 233aecfc01dSrui zang - Sun Microsystems - Beijing China if (pvc->vc_timeoutid != 0) { 234aecfc01dSrui zang - Sun Microsystems - Beijing China (void) quntimeout(q, pvc->vc_timeoutid); 235aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_timeoutid = 0; 236aecfc01dSrui zang - Sun Microsystems - Beijing China } 237aecfc01dSrui zang - Sun Microsystems - Beijing China ttycommon_close(&pvc->vc_ttycommon); 238aecfc01dSrui zang - Sun Microsystems - Beijing China 239aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_flags &= ~WCS_INIT; 240aecfc01dSrui zang - Sun Microsystems - Beijing China } 241aecfc01dSrui zang - Sun Microsystems - Beijing China 242aecfc01dSrui zang - Sun Microsystems - Beijing China /* 243aecfc01dSrui zang - Sun Microsystems - Beijing China * Reply the VT_WAITACTIVE ioctl. 244aecfc01dSrui zang - Sun Microsystems - Beijing China * Argument 'close' usage: 245aecfc01dSrui zang - Sun Microsystems - Beijing China * B_TRUE: the vt designated by argument 'minor' is being closed. 246aecfc01dSrui zang - Sun Microsystems - Beijing China * B_FALSE: the vt designated by argument 'minor' has been activated just now. 247aecfc01dSrui zang - Sun Microsystems - Beijing China */ 248aecfc01dSrui zang - Sun Microsystems - Beijing China static void 249aecfc01dSrui zang - Sun Microsystems - Beijing China vc_waitactive_reply(int minor, boolean_t close) 250aecfc01dSrui zang - Sun Microsystems - Beijing China { 251aecfc01dSrui zang - Sun Microsystems - Beijing China vc_waitactive_msg_t *index, *tmp; 252aecfc01dSrui zang - Sun Microsystems - Beijing China vc_state_t *pvc; 253aecfc01dSrui zang - Sun Microsystems - Beijing China 254aecfc01dSrui zang - Sun Microsystems - Beijing China index = list_head(&vc_waitactive_list); 255aecfc01dSrui zang - Sun Microsystems - Beijing China 256aecfc01dSrui zang - Sun Microsystems - Beijing China while (index != NULL) { 257aecfc01dSrui zang - Sun Microsystems - Beijing China tmp = index; 258aecfc01dSrui zang - Sun Microsystems - Beijing China index = list_next(&vc_waitactive_list, index); 259aecfc01dSrui zang - Sun Microsystems - Beijing China 260aecfc01dSrui zang - Sun Microsystems - Beijing China if ((close && tmp->wa_msg_minor == minor) || 261aecfc01dSrui zang - Sun Microsystems - Beijing China (!close && tmp->wa_wait_minor == minor)) { 262aecfc01dSrui zang - Sun Microsystems - Beijing China list_remove(&vc_waitactive_list, tmp); 263aecfc01dSrui zang - Sun Microsystems - Beijing China pvc = vt_minor2vc(tmp->wa_msg_minor); 264aecfc01dSrui zang - Sun Microsystems - Beijing China 265aecfc01dSrui zang - Sun Microsystems - Beijing China if (close) 266aecfc01dSrui zang - Sun Microsystems - Beijing China vt_iocnak(pvc->vc_wq, tmp->wa_mp, ENXIO); 267aecfc01dSrui zang - Sun Microsystems - Beijing China else 268aecfc01dSrui zang - Sun Microsystems - Beijing China vt_iocack(pvc->vc_wq, tmp->wa_mp); 269aecfc01dSrui zang - Sun Microsystems - Beijing China 270aecfc01dSrui zang - Sun Microsystems - Beijing China kmem_free(tmp, sizeof (vc_waitactive_msg_t)); 271aecfc01dSrui zang - Sun Microsystems - Beijing China } 272aecfc01dSrui zang - Sun Microsystems - Beijing China } 273aecfc01dSrui zang - Sun Microsystems - Beijing China } 274aecfc01dSrui zang - Sun Microsystems - Beijing China 275aecfc01dSrui zang - Sun Microsystems - Beijing China void 276aecfc01dSrui zang - Sun Microsystems - Beijing China vt_close(queue_t *q, vc_state_t *pvc, cred_t *credp) 277aecfc01dSrui zang - Sun Microsystems - Beijing China { 278aecfc01dSrui zang - Sun Microsystems - Beijing China minor_t index; 279aecfc01dSrui zang - Sun Microsystems - Beijing China 280aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_enter(&pvc->vc_state_lock); 281aecfc01dSrui zang - Sun Microsystems - Beijing China vt_clean(q, pvc); 282aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_flags &= ~WCS_ISOPEN; 283aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&pvc->vc_state_lock); 284aecfc01dSrui zang - Sun Microsystems - Beijing China 285aecfc01dSrui zang - Sun Microsystems - Beijing China tem_destroy(pvc->vc_tem, credp); 286aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_tem = NULL; 287aecfc01dSrui zang - Sun Microsystems - Beijing China 288aecfc01dSrui zang - Sun Microsystems - Beijing China index = pvc->vc_minor; 289aecfc01dSrui zang - Sun Microsystems - Beijing China if (index == vc_inuse_max_minor) { 290aecfc01dSrui zang - Sun Microsystems - Beijing China while ((--index > 0) && !VT_IS_INUSE(index)) 291aecfc01dSrui zang - Sun Microsystems - Beijing China ; 292aecfc01dSrui zang - Sun Microsystems - Beijing China vc_inuse_max_minor = index; 293aecfc01dSrui zang - Sun Microsystems - Beijing China } 294aecfc01dSrui zang - Sun Microsystems - Beijing China 295aecfc01dSrui zang - Sun Microsystems - Beijing China vc_waitactive_reply(pvc->vc_minor, B_TRUE); 296aecfc01dSrui zang - Sun Microsystems - Beijing China } 297aecfc01dSrui zang - Sun Microsystems - Beijing China 298aecfc01dSrui zang - Sun Microsystems - Beijing China static void 299aecfc01dSrui zang - Sun Microsystems - Beijing China vt_init_tty(vc_state_t *pvc) 300aecfc01dSrui zang - Sun Microsystems - Beijing China { 301aecfc01dSrui zang - Sun Microsystems - Beijing China ASSERT(MUTEX_HELD(&pvc->vc_state_lock)); 302aecfc01dSrui zang - Sun Microsystems - Beijing China 303aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_flags |= WCS_INIT; 304aecfc01dSrui zang - Sun Microsystems - Beijing China vt_init_ttycommon(&pvc->vc_ttycommon); 305aecfc01dSrui zang - Sun Microsystems - Beijing China wc_get_size(pvc); 306aecfc01dSrui zang - Sun Microsystems - Beijing China } 307aecfc01dSrui zang - Sun Microsystems - Beijing China 308aecfc01dSrui zang - Sun Microsystems - Beijing China /* 309aecfc01dSrui zang - Sun Microsystems - Beijing China * minor 0: /dev/vt/0 (index = 0, indicating the system console) 310aecfc01dSrui zang - Sun Microsystems - Beijing China * minor 1: /dev/vt/1 (index = 1, vtdaemon special console) 311aecfc01dSrui zang - Sun Microsystems - Beijing China * minor 2: /dev/vt/2 (index = 2, virtual consoles) 312aecfc01dSrui zang - Sun Microsystems - Beijing China * ...... 313aecfc01dSrui zang - Sun Microsystems - Beijing China * minor n: /dev/vt/n (index = n) 314aecfc01dSrui zang - Sun Microsystems - Beijing China * 315aecfc01dSrui zang - Sun Microsystems - Beijing China * 316aecfc01dSrui zang - Sun Microsystems - Beijing China * The system console (minor 0), is opened firstly and used during console 317aecfc01dSrui zang - Sun Microsystems - Beijing China * configuration. It also acts as the system hard console even when all 318aecfc01dSrui zang - Sun Microsystems - Beijing China * virtual consoles go off. 319aecfc01dSrui zang - Sun Microsystems - Beijing China * 320aecfc01dSrui zang - Sun Microsystems - Beijing China * In tipline case, minor 0 (/dev/vt/0) is reserved, and cannot be switched to. 321aecfc01dSrui zang - Sun Microsystems - Beijing China * And the system console is redirected to the tipline. During normal cases, 322aecfc01dSrui zang - Sun Microsystems - Beijing China * we can switch from virtual consoles to it by pressing 'Alt + F1'. 323aecfc01dSrui zang - Sun Microsystems - Beijing China * 324aecfc01dSrui zang - Sun Microsystems - Beijing China * minor 1 (/dev/vt/1) is reserved for vtdaemon special console, and it's 325aecfc01dSrui zang - Sun Microsystems - Beijing China * not available to end users. 326aecfc01dSrui zang - Sun Microsystems - Beijing China * 327aecfc01dSrui zang - Sun Microsystems - Beijing China * During early console configuration, consconfig_dacf opens wscons and then 328aecfc01dSrui zang - Sun Microsystems - Beijing China * issue a WC_OPEN_FB ioctl to kick off terminal init process. So during 329aecfc01dSrui zang - Sun Microsystems - Beijing China * consconfig_dacf first opening of wscons, tems (of type tem_state_t) is 330aecfc01dSrui zang - Sun Microsystems - Beijing China * not initialized. We do not initialize the tem_vt_state_t instance returned 331aecfc01dSrui zang - Sun Microsystems - Beijing China * by tem_init() for this open, since we do not have enough info to handle 332aecfc01dSrui zang - Sun Microsystems - Beijing China * normal terminal operation at this moment. This tem_vt_state_t instance 333aecfc01dSrui zang - Sun Microsystems - Beijing China * will get initialized when handling WC_OPEN_FB. 334aecfc01dSrui zang - Sun Microsystems - Beijing China */ 335aecfc01dSrui zang - Sun Microsystems - Beijing China int 336aecfc01dSrui zang - Sun Microsystems - Beijing China vt_open(minor_t minor, queue_t *rq, cred_t *crp) 337aecfc01dSrui zang - Sun Microsystems - Beijing China { 338aecfc01dSrui zang - Sun Microsystems - Beijing China vc_state_t *pvc; 339aecfc01dSrui zang - Sun Microsystems - Beijing China 340aecfc01dSrui zang - Sun Microsystems - Beijing China if (!vt_minor_valid(minor)) 341aecfc01dSrui zang - Sun Microsystems - Beijing China return (ENXIO); 342aecfc01dSrui zang - Sun Microsystems - Beijing China 343aecfc01dSrui zang - Sun Microsystems - Beijing China pvc = vt_minor2vc(minor); 344aecfc01dSrui zang - Sun Microsystems - Beijing China if (pvc == NULL) 345aecfc01dSrui zang - Sun Microsystems - Beijing China return (ENXIO); 346aecfc01dSrui zang - Sun Microsystems - Beijing China 347aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_enter(&vc_lock); 348aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_enter(&pvc->vc_state_lock); 349aecfc01dSrui zang - Sun Microsystems - Beijing China 350aecfc01dSrui zang - Sun Microsystems - Beijing China if (!(pvc->vc_flags & WCS_ISOPEN)) { 351aecfc01dSrui zang - Sun Microsystems - Beijing China /* 352aecfc01dSrui zang - Sun Microsystems - Beijing China * vc_tem might not be intialized if !tems.ts_initialized, 353aecfc01dSrui zang - Sun Microsystems - Beijing China * and this only happens during console configuration. 354aecfc01dSrui zang - Sun Microsystems - Beijing China */ 355aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_tem = tem_init(crp); 356aecfc01dSrui zang - Sun Microsystems - Beijing China } 357aecfc01dSrui zang - Sun Microsystems - Beijing China 358aecfc01dSrui zang - Sun Microsystems - Beijing China if (!(pvc->vc_flags & WCS_INIT)) 359aecfc01dSrui zang - Sun Microsystems - Beijing China vt_init_tty(pvc); 360aecfc01dSrui zang - Sun Microsystems - Beijing China 361aecfc01dSrui zang - Sun Microsystems - Beijing China /* 362aecfc01dSrui zang - Sun Microsystems - Beijing China * In normal case, the first screen is the system console; 363aecfc01dSrui zang - Sun Microsystems - Beijing China * In tipline case, the first screen is the first VT that gets started. 364aecfc01dSrui zang - Sun Microsystems - Beijing China */ 365aecfc01dSrui zang - Sun Microsystems - Beijing China if (vc_active_console == VT_MINOR_INVALID && minor != VT_DAEMON_MINOR) 366aecfc01dSrui zang - Sun Microsystems - Beijing China if (minor == 0 || consmode == CONS_KFB) { 367aecfc01dSrui zang - Sun Microsystems - Beijing China boolean_t unblank = B_FALSE; 368aecfc01dSrui zang - Sun Microsystems - Beijing China 369aecfc01dSrui zang - Sun Microsystems - Beijing China vc_active_console = minor; 370aecfc01dSrui zang - Sun Microsystems - Beijing China vc_last_console = minor; 371aecfc01dSrui zang - Sun Microsystems - Beijing China if (minor != 0) { 372aecfc01dSrui zang - Sun Microsystems - Beijing China /* 373aecfc01dSrui zang - Sun Microsystems - Beijing China * If we are not opening the system console 374aecfc01dSrui zang - Sun Microsystems - Beijing China * as the first console, clear the phyical 375aecfc01dSrui zang - Sun Microsystems - Beijing China * screen. 376aecfc01dSrui zang - Sun Microsystems - Beijing China */ 377aecfc01dSrui zang - Sun Microsystems - Beijing China unblank = B_TRUE; 378aecfc01dSrui zang - Sun Microsystems - Beijing China } 379aecfc01dSrui zang - Sun Microsystems - Beijing China 380aecfc01dSrui zang - Sun Microsystems - Beijing China tem_activate(pvc->vc_tem, unblank, crp); 381aecfc01dSrui zang - Sun Microsystems - Beijing China } 382aecfc01dSrui zang - Sun Microsystems - Beijing China 383aecfc01dSrui zang - Sun Microsystems - Beijing China if ((pvc->vc_ttycommon.t_flags & TS_XCLUDE) && 384aecfc01dSrui zang - Sun Microsystems - Beijing China (secpolicy_excl_open(crp) != 0)) { 385aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&pvc->vc_state_lock); 386aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&vc_lock); 387aecfc01dSrui zang - Sun Microsystems - Beijing China return (EBUSY); 388aecfc01dSrui zang - Sun Microsystems - Beijing China } 389aecfc01dSrui zang - Sun Microsystems - Beijing China 390aecfc01dSrui zang - Sun Microsystems - Beijing China if (minor > vc_inuse_max_minor) 391aecfc01dSrui zang - Sun Microsystems - Beijing China vc_inuse_max_minor = minor; 392aecfc01dSrui zang - Sun Microsystems - Beijing China 393aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_flags |= WCS_ISOPEN; 394aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_ttycommon.t_readq = rq; 395aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_ttycommon.t_writeq = WR(rq); 396aecfc01dSrui zang - Sun Microsystems - Beijing China 397aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&pvc->vc_state_lock); 398aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&vc_lock); 399aecfc01dSrui zang - Sun Microsystems - Beijing China 400aecfc01dSrui zang - Sun Microsystems - Beijing China rq->q_ptr = pvc; 401aecfc01dSrui zang - Sun Microsystems - Beijing China WR(rq)->q_ptr = pvc; 402aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_wq = WR(rq); 403aecfc01dSrui zang - Sun Microsystems - Beijing China 404aecfc01dSrui zang - Sun Microsystems - Beijing China qprocson(rq); 405aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 406aecfc01dSrui zang - Sun Microsystems - Beijing China } 407aecfc01dSrui zang - Sun Microsystems - Beijing China 408aecfc01dSrui zang - Sun Microsystems - Beijing China static minor_t 409aecfc01dSrui zang - Sun Microsystems - Beijing China vt_find_prev(minor_t cur) 410aecfc01dSrui zang - Sun Microsystems - Beijing China { 411aecfc01dSrui zang - Sun Microsystems - Beijing China minor_t i, t, max; 412aecfc01dSrui zang - Sun Microsystems - Beijing China 413aecfc01dSrui zang - Sun Microsystems - Beijing China ASSERT(vc_active_console != VT_MINOR_INVALID); 414aecfc01dSrui zang - Sun Microsystems - Beijing China 415aecfc01dSrui zang - Sun Microsystems - Beijing China max = VC_INSTANCES_COUNT; 416aecfc01dSrui zang - Sun Microsystems - Beijing China 417aecfc01dSrui zang - Sun Microsystems - Beijing China for (i = cur - 1; (t = (i + max) % max) != cur; i--) 418aecfc01dSrui zang - Sun Microsystems - Beijing China if (!VT_IS_DAEMON(t) && VT_IS_INUSE(t)) 419aecfc01dSrui zang - Sun Microsystems - Beijing China return (t); 420aecfc01dSrui zang - Sun Microsystems - Beijing China 421aecfc01dSrui zang - Sun Microsystems - Beijing China return (VT_MINOR_INVALID); 422aecfc01dSrui zang - Sun Microsystems - Beijing China } 423aecfc01dSrui zang - Sun Microsystems - Beijing China 424aecfc01dSrui zang - Sun Microsystems - Beijing China static minor_t 425aecfc01dSrui zang - Sun Microsystems - Beijing China vt_find_next(minor_t cur) 426aecfc01dSrui zang - Sun Microsystems - Beijing China { 427aecfc01dSrui zang - Sun Microsystems - Beijing China minor_t i, t, max; 428aecfc01dSrui zang - Sun Microsystems - Beijing China 429aecfc01dSrui zang - Sun Microsystems - Beijing China ASSERT(vc_active_console != VT_MINOR_INVALID); 430aecfc01dSrui zang - Sun Microsystems - Beijing China 431aecfc01dSrui zang - Sun Microsystems - Beijing China max = VC_INSTANCES_COUNT; 432aecfc01dSrui zang - Sun Microsystems - Beijing China 433aecfc01dSrui zang - Sun Microsystems - Beijing China for (i = cur + 1; (t = (i + max) % max) != cur; i++) 434aecfc01dSrui zang - Sun Microsystems - Beijing China if (!VT_IS_DAEMON(t) && VT_IS_INUSE(t)) 435aecfc01dSrui zang - Sun Microsystems - Beijing China return (t); 436aecfc01dSrui zang - Sun Microsystems - Beijing China 437aecfc01dSrui zang - Sun Microsystems - Beijing China return (VT_MINOR_INVALID); 438aecfc01dSrui zang - Sun Microsystems - Beijing China } 439aecfc01dSrui zang - Sun Microsystems - Beijing China 440aecfc01dSrui zang - Sun Microsystems - Beijing China /* ARGSUSED */ 441aecfc01dSrui zang - Sun Microsystems - Beijing China void 442aecfc01dSrui zang - Sun Microsystems - Beijing China vt_send_hotkeys(void *timeout_arg) 443aecfc01dSrui zang - Sun Microsystems - Beijing China { 444aecfc01dSrui zang - Sun Microsystems - Beijing China door_handle_t door; 445aecfc01dSrui zang - Sun Microsystems - Beijing China vt_cmd_arg_t arg; 446aecfc01dSrui zang - Sun Microsystems - Beijing China int error = 0; 447aecfc01dSrui zang - Sun Microsystems - Beijing China int retries = 0; 448aecfc01dSrui zang - Sun Microsystems - Beijing China door_arg_t door_arg; 449aecfc01dSrui zang - Sun Microsystems - Beijing China 450aecfc01dSrui zang - Sun Microsystems - Beijing China arg.vt_ev = VT_EV_HOTKEYS; 451*22af26cbSlipeng sang - Sun Microsystems - Beijing China 452*22af26cbSlipeng sang - Sun Microsystems - Beijing China mutex_enter(&vt_pending_vtno_lock); 453aecfc01dSrui zang - Sun Microsystems - Beijing China arg.vt_num = vt_pending_vtno; 454*22af26cbSlipeng sang - Sun Microsystems - Beijing China mutex_exit(&vt_pending_vtno_lock); 455aecfc01dSrui zang - Sun Microsystems - Beijing China 456aecfc01dSrui zang - Sun Microsystems - Beijing China /* only available in kernel context or user context */ 457aecfc01dSrui zang - Sun Microsystems - Beijing China if (door_ki_open(VT_DAEMON_DOOR_FILE, &door) != 0) { 458*22af26cbSlipeng sang - Sun Microsystems - Beijing China mutex_enter(&vt_pending_vtno_lock); 459aecfc01dSrui zang - Sun Microsystems - Beijing China vt_pending_vtno = -1; 460aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&vt_pending_vtno_lock); 461aecfc01dSrui zang - Sun Microsystems - Beijing China return; 462aecfc01dSrui zang - Sun Microsystems - Beijing China } 463aecfc01dSrui zang - Sun Microsystems - Beijing China 464aecfc01dSrui zang - Sun Microsystems - Beijing China door_arg.rbuf = NULL; 465aecfc01dSrui zang - Sun Microsystems - Beijing China door_arg.rsize = 0; 466aecfc01dSrui zang - Sun Microsystems - Beijing China door_arg.data_ptr = (void *)&arg; 467aecfc01dSrui zang - Sun Microsystems - Beijing China door_arg.data_size = sizeof (arg); 468aecfc01dSrui zang - Sun Microsystems - Beijing China door_arg.desc_ptr = NULL; 469aecfc01dSrui zang - Sun Microsystems - Beijing China door_arg.desc_num = 0; 470aecfc01dSrui zang - Sun Microsystems - Beijing China 471aecfc01dSrui zang - Sun Microsystems - Beijing China /* 472aecfc01dSrui zang - Sun Microsystems - Beijing China * Make door upcall 473aecfc01dSrui zang - Sun Microsystems - Beijing China */ 474aecfc01dSrui zang - Sun Microsystems - Beijing China while ((error = door_ki_upcall(door, &door_arg)) != 0 && 475aecfc01dSrui zang - Sun Microsystems - Beijing China retries < VT_DOORCALL_MAX_RETRY) 476aecfc01dSrui zang - Sun Microsystems - Beijing China if (error == EAGAIN || error == EINTR) 477aecfc01dSrui zang - Sun Microsystems - Beijing China retries++; 478aecfc01dSrui zang - Sun Microsystems - Beijing China else 479aecfc01dSrui zang - Sun Microsystems - Beijing China break; 480aecfc01dSrui zang - Sun Microsystems - Beijing China 481aecfc01dSrui zang - Sun Microsystems - Beijing China door_ki_rele(door); 482aecfc01dSrui zang - Sun Microsystems - Beijing China 483*22af26cbSlipeng sang - Sun Microsystems - Beijing China mutex_enter(&vt_pending_vtno_lock); 484aecfc01dSrui zang - Sun Microsystems - Beijing China vt_pending_vtno = -1; 485aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&vt_pending_vtno_lock); 486aecfc01dSrui zang - Sun Microsystems - Beijing China } 487aecfc01dSrui zang - Sun Microsystems - Beijing China 488aecfc01dSrui zang - Sun Microsystems - Beijing China static boolean_t 489aecfc01dSrui zang - Sun Microsystems - Beijing China vt_validate_hotkeys(int minor) 490aecfc01dSrui zang - Sun Microsystems - Beijing China { 491aecfc01dSrui zang - Sun Microsystems - Beijing China /* 492aecfc01dSrui zang - Sun Microsystems - Beijing China * minor should not succeed the existing minor numbers range. 493aecfc01dSrui zang - Sun Microsystems - Beijing China */ 494aecfc01dSrui zang - Sun Microsystems - Beijing China if (!vt_minor_valid(minor)) 495aecfc01dSrui zang - Sun Microsystems - Beijing China return (B_FALSE); 496aecfc01dSrui zang - Sun Microsystems - Beijing China 497aecfc01dSrui zang - Sun Microsystems - Beijing China /* 498aecfc01dSrui zang - Sun Microsystems - Beijing China * Shouldn't switch to /dev/vt/1 or an unused vt. 499aecfc01dSrui zang - Sun Microsystems - Beijing China */ 500aecfc01dSrui zang - Sun Microsystems - Beijing China if (!VT_IS_DAEMON(minor) && VT_IS_INUSE(minor)) 501aecfc01dSrui zang - Sun Microsystems - Beijing China return (B_TRUE); 502aecfc01dSrui zang - Sun Microsystems - Beijing China 503aecfc01dSrui zang - Sun Microsystems - Beijing China return (B_FALSE); 504aecfc01dSrui zang - Sun Microsystems - Beijing China } 505aecfc01dSrui zang - Sun Microsystems - Beijing China 506aecfc01dSrui zang - Sun Microsystems - Beijing China static void 507aecfc01dSrui zang - Sun Microsystems - Beijing China vt_trigger_hotkeys(int vtno) 508aecfc01dSrui zang - Sun Microsystems - Beijing China { 509aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_enter(&vt_pending_vtno_lock); 510aecfc01dSrui zang - Sun Microsystems - Beijing China 511aecfc01dSrui zang - Sun Microsystems - Beijing China if (vt_pending_vtno != -1) { 512aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&vt_pending_vtno_lock); 513aecfc01dSrui zang - Sun Microsystems - Beijing China return; 514aecfc01dSrui zang - Sun Microsystems - Beijing China } 515aecfc01dSrui zang - Sun Microsystems - Beijing China 516aecfc01dSrui zang - Sun Microsystems - Beijing China vt_pending_vtno = vtno; 517aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&vt_pending_vtno_lock); 518aecfc01dSrui zang - Sun Microsystems - Beijing China (void) timeout(vt_send_hotkeys, NULL, 1); 519aecfc01dSrui zang - Sun Microsystems - Beijing China } 520aecfc01dSrui zang - Sun Microsystems - Beijing China 521aecfc01dSrui zang - Sun Microsystems - Beijing China /* 522aecfc01dSrui zang - Sun Microsystems - Beijing China * return value: 523aecfc01dSrui zang - Sun Microsystems - Beijing China * 0: non msg of vt hotkeys 524aecfc01dSrui zang - Sun Microsystems - Beijing China * 1: msg of vt hotkeys 525aecfc01dSrui zang - Sun Microsystems - Beijing China */ 526aecfc01dSrui zang - Sun Microsystems - Beijing China int 527aecfc01dSrui zang - Sun Microsystems - Beijing China vt_check_hotkeys(mblk_t *mp) 528aecfc01dSrui zang - Sun Microsystems - Beijing China { 529aecfc01dSrui zang - Sun Microsystems - Beijing China int vtno = 0; 530aecfc01dSrui zang - Sun Microsystems - Beijing China minor_t minor = 0; 531aecfc01dSrui zang - Sun Microsystems - Beijing China 532aecfc01dSrui zang - Sun Microsystems - Beijing China /* LINTED E_PTRDIFF_OVERFLOW */ 533aecfc01dSrui zang - Sun Microsystems - Beijing China if (!VT_MSG_SWITCH(mp)) 534aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 535aecfc01dSrui zang - Sun Microsystems - Beijing China 536aecfc01dSrui zang - Sun Microsystems - Beijing China switch (VT_MSG_OPCODE(mp)) { 537aecfc01dSrui zang - Sun Microsystems - Beijing China case 'B': 538aecfc01dSrui zang - Sun Microsystems - Beijing China /* find out the previous vt */ 539aecfc01dSrui zang - Sun Microsystems - Beijing China if (vc_active_console == VT_MINOR_INVALID) 540aecfc01dSrui zang - Sun Microsystems - Beijing China return (1); 541aecfc01dSrui zang - Sun Microsystems - Beijing China 542aecfc01dSrui zang - Sun Microsystems - Beijing China if (VT_IS_DAEMON(vc_active_console)) { 543aecfc01dSrui zang - Sun Microsystems - Beijing China minor = vt_find_prev(vt_arg2minor(vc_target_console)); 544aecfc01dSrui zang - Sun Microsystems - Beijing China break; 545aecfc01dSrui zang - Sun Microsystems - Beijing China } 546aecfc01dSrui zang - Sun Microsystems - Beijing China 547aecfc01dSrui zang - Sun Microsystems - Beijing China minor = vt_find_prev(vc_active_console); 548aecfc01dSrui zang - Sun Microsystems - Beijing China break; 549aecfc01dSrui zang - Sun Microsystems - Beijing China case 'F': 550aecfc01dSrui zang - Sun Microsystems - Beijing China /* find out the next vt */ 551aecfc01dSrui zang - Sun Microsystems - Beijing China if (vc_active_console == VT_MINOR_INVALID) 552aecfc01dSrui zang - Sun Microsystems - Beijing China return (1); 553aecfc01dSrui zang - Sun Microsystems - Beijing China 554aecfc01dSrui zang - Sun Microsystems - Beijing China if (VT_IS_DAEMON(vc_active_console)) { 555aecfc01dSrui zang - Sun Microsystems - Beijing China minor = vt_find_next(vt_arg2minor(vc_target_console)); 556aecfc01dSrui zang - Sun Microsystems - Beijing China break; 557aecfc01dSrui zang - Sun Microsystems - Beijing China } 558aecfc01dSrui zang - Sun Microsystems - Beijing China 559aecfc01dSrui zang - Sun Microsystems - Beijing China minor = vt_find_next(vc_active_console); 560aecfc01dSrui zang - Sun Microsystems - Beijing China break; 561aecfc01dSrui zang - Sun Microsystems - Beijing China case 'H': 562aecfc01dSrui zang - Sun Microsystems - Beijing China /* find out the specified vt */ 563aecfc01dSrui zang - Sun Microsystems - Beijing China minor = VT_MSG_VTNO(mp); 564aecfc01dSrui zang - Sun Microsystems - Beijing China 565aecfc01dSrui zang - Sun Microsystems - Beijing China /* check for system console, Alt + F1 */ 566aecfc01dSrui zang - Sun Microsystems - Beijing China if (minor == 1) 567aecfc01dSrui zang - Sun Microsystems - Beijing China minor = 0; 568aecfc01dSrui zang - Sun Microsystems - Beijing China break; 569aecfc01dSrui zang - Sun Microsystems - Beijing China case 'L': 570aecfc01dSrui zang - Sun Microsystems - Beijing China /* find out the last vt */ 571aecfc01dSrui zang - Sun Microsystems - Beijing China if ((minor = vc_last_console) == VT_MINOR_INVALID) 572aecfc01dSrui zang - Sun Microsystems - Beijing China return (1); 573aecfc01dSrui zang - Sun Microsystems - Beijing China break; 574aecfc01dSrui zang - Sun Microsystems - Beijing China default: 575aecfc01dSrui zang - Sun Microsystems - Beijing China return (1); 576aecfc01dSrui zang - Sun Microsystems - Beijing China } 577aecfc01dSrui zang - Sun Microsystems - Beijing China 578aecfc01dSrui zang - Sun Microsystems - Beijing China if (!vt_validate_hotkeys(minor)) 579aecfc01dSrui zang - Sun Microsystems - Beijing China return (1); 580aecfc01dSrui zang - Sun Microsystems - Beijing China 581aecfc01dSrui zang - Sun Microsystems - Beijing China /* 582aecfc01dSrui zang - Sun Microsystems - Beijing China * for system console, the argument of vtno for 583aecfc01dSrui zang - Sun Microsystems - Beijing China * vt_activate is 1, though its minor is 0 584aecfc01dSrui zang - Sun Microsystems - Beijing China */ 585aecfc01dSrui zang - Sun Microsystems - Beijing China if (minor == 0) 586aecfc01dSrui zang - Sun Microsystems - Beijing China vtno = 1; /* for system console */ 587aecfc01dSrui zang - Sun Microsystems - Beijing China else 588aecfc01dSrui zang - Sun Microsystems - Beijing China vtno = minor; 589aecfc01dSrui zang - Sun Microsystems - Beijing China 590aecfc01dSrui zang - Sun Microsystems - Beijing China vt_trigger_hotkeys(vtno); 591aecfc01dSrui zang - Sun Microsystems - Beijing China return (1); 592aecfc01dSrui zang - Sun Microsystems - Beijing China } 593aecfc01dSrui zang - Sun Microsystems - Beijing China 594aecfc01dSrui zang - Sun Microsystems - Beijing China static void 595aecfc01dSrui zang - Sun Microsystems - Beijing China vt_proc_sendsig(pid_t pid, int sig) 596aecfc01dSrui zang - Sun Microsystems - Beijing China { 597aecfc01dSrui zang - Sun Microsystems - Beijing China register proc_t *p; 598aecfc01dSrui zang - Sun Microsystems - Beijing China 599aecfc01dSrui zang - Sun Microsystems - Beijing China if (pid <= 0) 600aecfc01dSrui zang - Sun Microsystems - Beijing China return; 601aecfc01dSrui zang - Sun Microsystems - Beijing China 602aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_enter(&pidlock); 603aecfc01dSrui zang - Sun Microsystems - Beijing China if ((p = prfind(pid)) == NULL || p->p_stat == SIDL) { 604aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&pidlock); 605aecfc01dSrui zang - Sun Microsystems - Beijing China return; 606aecfc01dSrui zang - Sun Microsystems - Beijing China } 607aecfc01dSrui zang - Sun Microsystems - Beijing China 608aecfc01dSrui zang - Sun Microsystems - Beijing China psignal(p, sig); 609aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&pidlock); 610aecfc01dSrui zang - Sun Microsystems - Beijing China } 611aecfc01dSrui zang - Sun Microsystems - Beijing China 612aecfc01dSrui zang - Sun Microsystems - Beijing China static int 613aecfc01dSrui zang - Sun Microsystems - Beijing China vt_proc_exists(pid_t pid) 614aecfc01dSrui zang - Sun Microsystems - Beijing China { 615aecfc01dSrui zang - Sun Microsystems - Beijing China register proc_t *p; 616aecfc01dSrui zang - Sun Microsystems - Beijing China 617aecfc01dSrui zang - Sun Microsystems - Beijing China if (pid <= 0) 618aecfc01dSrui zang - Sun Microsystems - Beijing China return (EINVAL); 619aecfc01dSrui zang - Sun Microsystems - Beijing China 620aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_enter(&pidlock); 621aecfc01dSrui zang - Sun Microsystems - Beijing China if ((p = prfind(pid)) == NULL || p->p_stat == SIDL) { 622aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&pidlock); 623aecfc01dSrui zang - Sun Microsystems - Beijing China return (ESRCH); 624aecfc01dSrui zang - Sun Microsystems - Beijing China } 625aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&pidlock); 626aecfc01dSrui zang - Sun Microsystems - Beijing China 627aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 628aecfc01dSrui zang - Sun Microsystems - Beijing China } 629aecfc01dSrui zang - Sun Microsystems - Beijing China 630aecfc01dSrui zang - Sun Microsystems - Beijing China #define SIG_VALID(x) (((x) > 0) && ((x) < _SIGRTMAX) && \ 631aecfc01dSrui zang - Sun Microsystems - Beijing China ((x) != SIGKILL) && ((x) != SIGSTOP)) 632aecfc01dSrui zang - Sun Microsystems - Beijing China 633aecfc01dSrui zang - Sun Microsystems - Beijing China static int 634aecfc01dSrui zang - Sun Microsystems - Beijing China vt_setmode(vc_state_t *pvc, struct vt_mode *pmode) 635aecfc01dSrui zang - Sun Microsystems - Beijing China { 636aecfc01dSrui zang - Sun Microsystems - Beijing China if ((pmode->mode != VT_PROCESS) && (pmode->mode != VT_AUTO)) 637aecfc01dSrui zang - Sun Microsystems - Beijing China return (EINVAL); 638aecfc01dSrui zang - Sun Microsystems - Beijing China 639aecfc01dSrui zang - Sun Microsystems - Beijing China if (!SIG_VALID(pmode->relsig) || !SIG_VALID(pmode->acqsig)) 640aecfc01dSrui zang - Sun Microsystems - Beijing China return (EINVAL); 641aecfc01dSrui zang - Sun Microsystems - Beijing China 642aecfc01dSrui zang - Sun Microsystems - Beijing China if (pmode->mode == VT_PROCESS) { 643aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_pid = curproc->p_pid; 644aecfc01dSrui zang - Sun Microsystems - Beijing China } else { 645aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_dispnum = 0; 646aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_login = 0; 647aecfc01dSrui zang - Sun Microsystems - Beijing China } 648aecfc01dSrui zang - Sun Microsystems - Beijing China 649aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_switch_mode = pmode->mode; 650aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_waitv = pmode->waitv; 651aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_relsig = pmode->relsig; 652aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_acqsig = pmode->acqsig; 653aecfc01dSrui zang - Sun Microsystems - Beijing China 654aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 655aecfc01dSrui zang - Sun Microsystems - Beijing China } 656aecfc01dSrui zang - Sun Microsystems - Beijing China 657aecfc01dSrui zang - Sun Microsystems - Beijing China static void 658aecfc01dSrui zang - Sun Microsystems - Beijing China vt_reset(vc_state_t *pvc) 659aecfc01dSrui zang - Sun Microsystems - Beijing China { 660aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_switch_mode = VT_AUTO; 661aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_pid = -1; 662aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_dispnum = 0; 663aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_login = 0; 664aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_switchto = VT_MINOR_INVALID; 665aecfc01dSrui zang - Sun Microsystems - Beijing China } 666aecfc01dSrui zang - Sun Microsystems - Beijing China 667aecfc01dSrui zang - Sun Microsystems - Beijing China /* 668aecfc01dSrui zang - Sun Microsystems - Beijing China * switch to vt_no from vc_active_console 669aecfc01dSrui zang - Sun Microsystems - Beijing China */ 670aecfc01dSrui zang - Sun Microsystems - Beijing China static void 671aecfc01dSrui zang - Sun Microsystems - Beijing China vt_switch(uint_t vt_no, cred_t *credp) 672aecfc01dSrui zang - Sun Microsystems - Beijing China { 673aecfc01dSrui zang - Sun Microsystems - Beijing China vc_state_t *pvc_active = vt_minor2vc(vc_active_console); 674aecfc01dSrui zang - Sun Microsystems - Beijing China vc_state_t *pvc = vt_minor2vc(vt_no); 675aecfc01dSrui zang - Sun Microsystems - Beijing China minor_t index; 676aecfc01dSrui zang - Sun Microsystems - Beijing China 677aecfc01dSrui zang - Sun Microsystems - Beijing China ASSERT(pvc_active && pvc); 678aecfc01dSrui zang - Sun Microsystems - Beijing China 679aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_enter(&vc_lock); 680aecfc01dSrui zang - Sun Microsystems - Beijing China 681aecfc01dSrui zang - Sun Microsystems - Beijing China tem_switch(pvc_active->vc_tem, pvc->vc_tem, credp); 682aecfc01dSrui zang - Sun Microsystems - Beijing China 683aecfc01dSrui zang - Sun Microsystems - Beijing China if (!VT_IS_DAEMON(vc_active_console)) 684aecfc01dSrui zang - Sun Microsystems - Beijing China vc_last_console = vc_active_console; 685aecfc01dSrui zang - Sun Microsystems - Beijing China else 686aecfc01dSrui zang - Sun Microsystems - Beijing China vc_last_console = vt_arg2minor(vc_target_console); 687aecfc01dSrui zang - Sun Microsystems - Beijing China 688aecfc01dSrui zang - Sun Microsystems - Beijing China vc_active_console = pvc->vc_minor; 689aecfc01dSrui zang - Sun Microsystems - Beijing China 690aecfc01dSrui zang - Sun Microsystems - Beijing China if (pvc->vc_switch_mode == VT_PROCESS) { 691aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_switchto = pvc->vc_minor; 692aecfc01dSrui zang - Sun Microsystems - Beijing China 693aecfc01dSrui zang - Sun Microsystems - Beijing China /* send it an acquired signal */ 694aecfc01dSrui zang - Sun Microsystems - Beijing China vt_proc_sendsig(pvc->vc_pid, pvc->vc_acqsig); 695aecfc01dSrui zang - Sun Microsystems - Beijing China } 696aecfc01dSrui zang - Sun Microsystems - Beijing China 697aecfc01dSrui zang - Sun Microsystems - Beijing China vc_waitactive_reply(vc_active_console, B_FALSE); 698aecfc01dSrui zang - Sun Microsystems - Beijing China 699aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&vc_lock); 700aecfc01dSrui zang - Sun Microsystems - Beijing China 701aecfc01dSrui zang - Sun Microsystems - Beijing China if (!VT_IS_DAEMON(vt_no)) { 702aecfc01dSrui zang - Sun Microsystems - Beijing China /* 703aecfc01dSrui zang - Sun Microsystems - Beijing China * Applications that open the virtual console device may request 704aecfc01dSrui zang - Sun Microsystems - Beijing China * asynchronous notification of VT switching from a previous VT 705aecfc01dSrui zang - Sun Microsystems - Beijing China * to another one by setting the S_MSG flag in an I_SETSIG 706aecfc01dSrui zang - Sun Microsystems - Beijing China * STREAMS ioctl. Such processes receive a SIGPOLL signal when 707aecfc01dSrui zang - Sun Microsystems - Beijing China * a VT switching succeeds. 708aecfc01dSrui zang - Sun Microsystems - Beijing China */ 709aecfc01dSrui zang - Sun Microsystems - Beijing China for (index = 0; index < VC_INSTANCES_COUNT; index++) { 710aecfc01dSrui zang - Sun Microsystems - Beijing China vc_state_t *tmp_pvc = vt_minor2vc(index); 711aecfc01dSrui zang - Sun Microsystems - Beijing China mblk_t *mp; 712aecfc01dSrui zang - Sun Microsystems - Beijing China 713aecfc01dSrui zang - Sun Microsystems - Beijing China if ((tmp_pvc->vc_flags & WCS_ISOPEN) && 714aecfc01dSrui zang - Sun Microsystems - Beijing China (tmp_pvc->vc_flags & WCS_INIT) && 715aecfc01dSrui zang - Sun Microsystems - Beijing China (mp = allocb(sizeof (unsigned char), BPRI_HI))) { 716aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_datap->db_type = M_PCSIG; 717aecfc01dSrui zang - Sun Microsystems - Beijing China *mp->b_wptr = SIGPOLL; 718aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_wptr += sizeof (unsigned char); 719aecfc01dSrui zang - Sun Microsystems - Beijing China putnext(RD(tmp_pvc->vc_wq), mp); 720aecfc01dSrui zang - Sun Microsystems - Beijing China } 721aecfc01dSrui zang - Sun Microsystems - Beijing China } 722aecfc01dSrui zang - Sun Microsystems - Beijing China } 723aecfc01dSrui zang - Sun Microsystems - Beijing China 724aecfc01dSrui zang - Sun Microsystems - Beijing China } 725aecfc01dSrui zang - Sun Microsystems - Beijing China 726aecfc01dSrui zang - Sun Microsystems - Beijing China /* 727aecfc01dSrui zang - Sun Microsystems - Beijing China * vt_no from 0 to n 728aecfc01dSrui zang - Sun Microsystems - Beijing China * 729aecfc01dSrui zang - Sun Microsystems - Beijing China * 0 for the vtdaemon sepcial console (only vtdaemon will use it) 730aecfc01dSrui zang - Sun Microsystems - Beijing China * 1 for the system console (Alt + F1, or Alt + Ctrl + F1), 731aecfc01dSrui zang - Sun Microsystems - Beijing China * aka Virtual Console #1 732aecfc01dSrui zang - Sun Microsystems - Beijing China * 733aecfc01dSrui zang - Sun Microsystems - Beijing China * 2 for Virtual Console #2 734aecfc01dSrui zang - Sun Microsystems - Beijing China * n for Virtual Console #n 735aecfc01dSrui zang - Sun Microsystems - Beijing China */ 736aecfc01dSrui zang - Sun Microsystems - Beijing China static minor_t 737aecfc01dSrui zang - Sun Microsystems - Beijing China vt_arg2minor(uint_t arg) 738aecfc01dSrui zang - Sun Microsystems - Beijing China { 739aecfc01dSrui zang - Sun Microsystems - Beijing China if (arg == 0) 740aecfc01dSrui zang - Sun Microsystems - Beijing China return (1); 741aecfc01dSrui zang - Sun Microsystems - Beijing China 742aecfc01dSrui zang - Sun Microsystems - Beijing China if (arg == 1) 743aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 744aecfc01dSrui zang - Sun Microsystems - Beijing China 745aecfc01dSrui zang - Sun Microsystems - Beijing China return (arg); 746aecfc01dSrui zang - Sun Microsystems - Beijing China } 747aecfc01dSrui zang - Sun Microsystems - Beijing China 748aecfc01dSrui zang - Sun Microsystems - Beijing China static uint_t 749aecfc01dSrui zang - Sun Microsystems - Beijing China vt_minor2arg(minor_t minor) 750aecfc01dSrui zang - Sun Microsystems - Beijing China { 751aecfc01dSrui zang - Sun Microsystems - Beijing China if (minor == 0) 752aecfc01dSrui zang - Sun Microsystems - Beijing China return (1); 753aecfc01dSrui zang - Sun Microsystems - Beijing China 754aecfc01dSrui zang - Sun Microsystems - Beijing China if (VT_IS_DAEMON(minor)) { 755aecfc01dSrui zang - Sun Microsystems - Beijing China /* here it should be the real console */ 756aecfc01dSrui zang - Sun Microsystems - Beijing China return (vc_target_console); 757aecfc01dSrui zang - Sun Microsystems - Beijing China } 758aecfc01dSrui zang - Sun Microsystems - Beijing China 759aecfc01dSrui zang - Sun Microsystems - Beijing China return (minor); 760aecfc01dSrui zang - Sun Microsystems - Beijing China } 761aecfc01dSrui zang - Sun Microsystems - Beijing China 762aecfc01dSrui zang - Sun Microsystems - Beijing China static int 763aecfc01dSrui zang - Sun Microsystems - Beijing China vt_activate(uint_t vt_no, cred_t *credp) 764aecfc01dSrui zang - Sun Microsystems - Beijing China { 765aecfc01dSrui zang - Sun Microsystems - Beijing China vc_state_t *pvc; 766aecfc01dSrui zang - Sun Microsystems - Beijing China minor_t minor; 767aecfc01dSrui zang - Sun Microsystems - Beijing China 768aecfc01dSrui zang - Sun Microsystems - Beijing China minor = vt_arg2minor(vt_no); 769aecfc01dSrui zang - Sun Microsystems - Beijing China if (!vt_minor_valid(minor)) 770aecfc01dSrui zang - Sun Microsystems - Beijing China return (ENXIO); 771aecfc01dSrui zang - Sun Microsystems - Beijing China if (minor == vc_active_console) { 772aecfc01dSrui zang - Sun Microsystems - Beijing China if (VT_IS_DAEMON(minor)) { 773aecfc01dSrui zang - Sun Microsystems - Beijing China /* 774aecfc01dSrui zang - Sun Microsystems - Beijing China * vtdaemon is reactivating itself to do locking 775aecfc01dSrui zang - Sun Microsystems - Beijing China * on behalf of another console, so record current 776aecfc01dSrui zang - Sun Microsystems - Beijing China * target console as the last console. 777aecfc01dSrui zang - Sun Microsystems - Beijing China */ 778aecfc01dSrui zang - Sun Microsystems - Beijing China vc_last_console = vt_arg2minor(vc_target_console); 779aecfc01dSrui zang - Sun Microsystems - Beijing China } 780aecfc01dSrui zang - Sun Microsystems - Beijing China 781aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 782aecfc01dSrui zang - Sun Microsystems - Beijing China } 783aecfc01dSrui zang - Sun Microsystems - Beijing China 784aecfc01dSrui zang - Sun Microsystems - Beijing China /* 785aecfc01dSrui zang - Sun Microsystems - Beijing China * In tipline case, the system console is redirected to tipline 786aecfc01dSrui zang - Sun Microsystems - Beijing China * and thus is always available. 787aecfc01dSrui zang - Sun Microsystems - Beijing China */ 788aecfc01dSrui zang - Sun Microsystems - Beijing China if (minor == 0 && consconfig_console_is_tipline()) 789aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 790aecfc01dSrui zang - Sun Microsystems - Beijing China 791aecfc01dSrui zang - Sun Microsystems - Beijing China if (!VT_IS_INUSE(minor)) 792aecfc01dSrui zang - Sun Microsystems - Beijing China return (ENXIO); 793aecfc01dSrui zang - Sun Microsystems - Beijing China 794aecfc01dSrui zang - Sun Microsystems - Beijing China pvc = vt_minor2vc(minor); 795aecfc01dSrui zang - Sun Microsystems - Beijing China if (pvc == NULL) 796aecfc01dSrui zang - Sun Microsystems - Beijing China return (ENXIO); 797aecfc01dSrui zang - Sun Microsystems - Beijing China if (pvc->vc_tem == NULL) 798aecfc01dSrui zang - Sun Microsystems - Beijing China return (ENXIO); 799aecfc01dSrui zang - Sun Microsystems - Beijing China 800aecfc01dSrui zang - Sun Microsystems - Beijing China pvc = vt_minor2vc(vc_active_console); 801aecfc01dSrui zang - Sun Microsystems - Beijing China if (pvc == NULL) 802aecfc01dSrui zang - Sun Microsystems - Beijing China return (ENXIO); 803aecfc01dSrui zang - Sun Microsystems - Beijing China if (pvc->vc_switch_mode != VT_PROCESS) { 804aecfc01dSrui zang - Sun Microsystems - Beijing China vt_switch(minor, credp); 805aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 806aecfc01dSrui zang - Sun Microsystems - Beijing China } 807aecfc01dSrui zang - Sun Microsystems - Beijing China 808aecfc01dSrui zang - Sun Microsystems - Beijing China /* 809aecfc01dSrui zang - Sun Microsystems - Beijing China * Validate the process, reset the 810aecfc01dSrui zang - Sun Microsystems - Beijing China * vt to auto mode if failed. 811aecfc01dSrui zang - Sun Microsystems - Beijing China */ 812aecfc01dSrui zang - Sun Microsystems - Beijing China if (pvc->vc_pid == -1 || vt_proc_exists(pvc->vc_pid) != 0) { 813aecfc01dSrui zang - Sun Microsystems - Beijing China /* 814aecfc01dSrui zang - Sun Microsystems - Beijing China * Xserver has not started up yet, 815aecfc01dSrui zang - Sun Microsystems - Beijing China * or it dose not exist. 816aecfc01dSrui zang - Sun Microsystems - Beijing China */ 817aecfc01dSrui zang - Sun Microsystems - Beijing China vt_reset(pvc); 818aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 819aecfc01dSrui zang - Sun Microsystems - Beijing China } 820aecfc01dSrui zang - Sun Microsystems - Beijing China 821aecfc01dSrui zang - Sun Microsystems - Beijing China /* 822aecfc01dSrui zang - Sun Microsystems - Beijing China * Send the release signal to the process, 823aecfc01dSrui zang - Sun Microsystems - Beijing China * and wait VT_RELDISP ioctl from Xserver 824aecfc01dSrui zang - Sun Microsystems - Beijing China * after its leaving VT. 825aecfc01dSrui zang - Sun Microsystems - Beijing China */ 826aecfc01dSrui zang - Sun Microsystems - Beijing China vt_proc_sendsig(pvc->vc_pid, pvc->vc_relsig); 827aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_switchto = minor; 828aecfc01dSrui zang - Sun Microsystems - Beijing China 829aecfc01dSrui zang - Sun Microsystems - Beijing China /* 830aecfc01dSrui zang - Sun Microsystems - Beijing China * We don't need a timeout here, for if Xserver refuses 831aecfc01dSrui zang - Sun Microsystems - Beijing China * or fails to respond to release signal using VT_RELDISP, 832aecfc01dSrui zang - Sun Microsystems - Beijing China * we cannot successfully switch to our text mode. Actually 833aecfc01dSrui zang - Sun Microsystems - Beijing China * users can try again. At present we don't support force 834aecfc01dSrui zang - Sun Microsystems - Beijing China * switch. 835aecfc01dSrui zang - Sun Microsystems - Beijing China */ 836aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 837aecfc01dSrui zang - Sun Microsystems - Beijing China } 838aecfc01dSrui zang - Sun Microsystems - Beijing China 839aecfc01dSrui zang - Sun Microsystems - Beijing China static int 840aecfc01dSrui zang - Sun Microsystems - Beijing China vt_reldisp(vc_state_t *pvc, int arg, cred_t *credp) 841aecfc01dSrui zang - Sun Microsystems - Beijing China { 842aecfc01dSrui zang - Sun Microsystems - Beijing China minor_t target_vtno = pvc->vc_switchto; 843aecfc01dSrui zang - Sun Microsystems - Beijing China 844aecfc01dSrui zang - Sun Microsystems - Beijing China if ((pvc->vc_switch_mode != VT_PROCESS) || 845aecfc01dSrui zang - Sun Microsystems - Beijing China (pvc->vc_minor != vc_active_console)) 846aecfc01dSrui zang - Sun Microsystems - Beijing China return (EACCES); 847aecfc01dSrui zang - Sun Microsystems - Beijing China 848aecfc01dSrui zang - Sun Microsystems - Beijing China if (target_vtno == VT_MINOR_INVALID) 849aecfc01dSrui zang - Sun Microsystems - Beijing China return (EINVAL); 850aecfc01dSrui zang - Sun Microsystems - Beijing China 851aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_switchto = VT_MINOR_INVALID; 852aecfc01dSrui zang - Sun Microsystems - Beijing China 853aecfc01dSrui zang - Sun Microsystems - Beijing China if (arg == VT_ACKACQ) 854aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 855aecfc01dSrui zang - Sun Microsystems - Beijing China 856aecfc01dSrui zang - Sun Microsystems - Beijing China if (arg == 0) 857aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); /* refuse to release */ 858aecfc01dSrui zang - Sun Microsystems - Beijing China 859aecfc01dSrui zang - Sun Microsystems - Beijing China /* Xserver has left VT */ 860aecfc01dSrui zang - Sun Microsystems - Beijing China vt_switch(target_vtno, credp); 861aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 862aecfc01dSrui zang - Sun Microsystems - Beijing China } 863aecfc01dSrui zang - Sun Microsystems - Beijing China 864aecfc01dSrui zang - Sun Microsystems - Beijing China void 865aecfc01dSrui zang - Sun Microsystems - Beijing China vt_ioctl(queue_t *q, mblk_t *mp) 866aecfc01dSrui zang - Sun Microsystems - Beijing China { 867aecfc01dSrui zang - Sun Microsystems - Beijing China vc_state_t *pvc = (vc_state_t *)q->q_ptr; 868aecfc01dSrui zang - Sun Microsystems - Beijing China struct iocblk *iocp; 869aecfc01dSrui zang - Sun Microsystems - Beijing China struct vt_mode vtmode; 870aecfc01dSrui zang - Sun Microsystems - Beijing China struct vt_stat vtinfo; 871aecfc01dSrui zang - Sun Microsystems - Beijing China struct vt_dispinfo vtdisp; 872aecfc01dSrui zang - Sun Microsystems - Beijing China mblk_t *tmp; 873aecfc01dSrui zang - Sun Microsystems - Beijing China int minor; 874aecfc01dSrui zang - Sun Microsystems - Beijing China int arg; 875aecfc01dSrui zang - Sun Microsystems - Beijing China int error = 0; 876aecfc01dSrui zang - Sun Microsystems - Beijing China vc_waitactive_msg_t *wait_msg; 877aecfc01dSrui zang - Sun Microsystems - Beijing China 878aecfc01dSrui zang - Sun Microsystems - Beijing China iocp = (struct iocblk *)(void *)mp->b_rptr; 879aecfc01dSrui zang - Sun Microsystems - Beijing China if (consmode != CONS_KFB && iocp->ioc_cmd != VT_ENABLED) { 880aecfc01dSrui zang - Sun Microsystems - Beijing China vt_iocnak(q, mp, EINVAL); 881aecfc01dSrui zang - Sun Microsystems - Beijing China return; 882aecfc01dSrui zang - Sun Microsystems - Beijing China } 883aecfc01dSrui zang - Sun Microsystems - Beijing China 884aecfc01dSrui zang - Sun Microsystems - Beijing China switch (iocp->ioc_cmd) { 885aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_ENABLED: 886aecfc01dSrui zang - Sun Microsystems - Beijing China if (!(tmp = allocb(sizeof (int), BPRI_MED))) { 887aecfc01dSrui zang - Sun Microsystems - Beijing China error = ENOMEM; 888aecfc01dSrui zang - Sun Microsystems - Beijing China break; 889aecfc01dSrui zang - Sun Microsystems - Beijing China } 890aecfc01dSrui zang - Sun Microsystems - Beijing China *(int *)(void *)tmp->b_rptr = consmode; 891aecfc01dSrui zang - Sun Microsystems - Beijing China tmp->b_wptr += sizeof (int); 892aecfc01dSrui zang - Sun Microsystems - Beijing China vt_copyout(q, mp, tmp, sizeof (int)); 893aecfc01dSrui zang - Sun Microsystems - Beijing China return; 894aecfc01dSrui zang - Sun Microsystems - Beijing China 895aecfc01dSrui zang - Sun Microsystems - Beijing China case KDSETMODE: 896aecfc01dSrui zang - Sun Microsystems - Beijing China arg = *(intptr_t *)(void *)mp->b_cont->b_rptr; 897aecfc01dSrui zang - Sun Microsystems - Beijing China if (arg != KD_TEXT && arg != KD_GRAPHICS) { 898aecfc01dSrui zang - Sun Microsystems - Beijing China error = EINVAL; 899aecfc01dSrui zang - Sun Microsystems - Beijing China break; 900aecfc01dSrui zang - Sun Microsystems - Beijing China } 901aecfc01dSrui zang - Sun Microsystems - Beijing China if (tem_get_fbmode(pvc->vc_tem) == arg) 902aecfc01dSrui zang - Sun Microsystems - Beijing China break; 903aecfc01dSrui zang - Sun Microsystems - Beijing China 904aecfc01dSrui zang - Sun Microsystems - Beijing China tem_set_fbmode(pvc->vc_tem, (uchar_t)arg, iocp->ioc_cr); 905aecfc01dSrui zang - Sun Microsystems - Beijing China 906aecfc01dSrui zang - Sun Microsystems - Beijing China break; 907aecfc01dSrui zang - Sun Microsystems - Beijing China 908aecfc01dSrui zang - Sun Microsystems - Beijing China case KDGETMODE: 909aecfc01dSrui zang - Sun Microsystems - Beijing China if (!(tmp = allocb(sizeof (int), BPRI_MED))) { 910aecfc01dSrui zang - Sun Microsystems - Beijing China error = ENOMEM; 911aecfc01dSrui zang - Sun Microsystems - Beijing China break; 912aecfc01dSrui zang - Sun Microsystems - Beijing China } 913aecfc01dSrui zang - Sun Microsystems - Beijing China *(int *)(void *)tmp->b_rptr = tem_get_fbmode(pvc->vc_tem); 914aecfc01dSrui zang - Sun Microsystems - Beijing China tmp->b_wptr += sizeof (int); 915aecfc01dSrui zang - Sun Microsystems - Beijing China vt_copyout(q, mp, tmp, sizeof (int)); 916aecfc01dSrui zang - Sun Microsystems - Beijing China return; 917aecfc01dSrui zang - Sun Microsystems - Beijing China 918aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_OPENQRY: /* return number of first free VT */ 919aecfc01dSrui zang - Sun Microsystems - Beijing China if (!(tmp = allocb(sizeof (int), BPRI_MED))) { 920aecfc01dSrui zang - Sun Microsystems - Beijing China error = ENOMEM; 921aecfc01dSrui zang - Sun Microsystems - Beijing China break; 922aecfc01dSrui zang - Sun Microsystems - Beijing China } 923aecfc01dSrui zang - Sun Microsystems - Beijing China 924aecfc01dSrui zang - Sun Microsystems - Beijing China /* minors of 0 and 1 are not available to end users */ 925aecfc01dSrui zang - Sun Microsystems - Beijing China for (minor = 2; vt_minor_valid(minor); minor++) 926aecfc01dSrui zang - Sun Microsystems - Beijing China if (!VT_IS_INUSE(minor)) 927aecfc01dSrui zang - Sun Microsystems - Beijing China break; 928aecfc01dSrui zang - Sun Microsystems - Beijing China 929aecfc01dSrui zang - Sun Microsystems - Beijing China if (!vt_minor_valid(minor)) 930aecfc01dSrui zang - Sun Microsystems - Beijing China minor = -1; 931aecfc01dSrui zang - Sun Microsystems - Beijing China *(int *)(void *)tmp->b_rptr = minor; /* /dev/vt/minor */ 932aecfc01dSrui zang - Sun Microsystems - Beijing China tmp->b_wptr += sizeof (int); 933aecfc01dSrui zang - Sun Microsystems - Beijing China vt_copyout(q, mp, tmp, sizeof (int)); 934aecfc01dSrui zang - Sun Microsystems - Beijing China return; 935aecfc01dSrui zang - Sun Microsystems - Beijing China 936aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_GETMODE: 937aecfc01dSrui zang - Sun Microsystems - Beijing China vtmode.mode = pvc->vc_switch_mode; 938aecfc01dSrui zang - Sun Microsystems - Beijing China vtmode.waitv = pvc->vc_waitv; 939aecfc01dSrui zang - Sun Microsystems - Beijing China vtmode.relsig = pvc->vc_relsig; 940aecfc01dSrui zang - Sun Microsystems - Beijing China vtmode.acqsig = pvc->vc_acqsig; 941aecfc01dSrui zang - Sun Microsystems - Beijing China vtmode.frsig = 0; 942aecfc01dSrui zang - Sun Microsystems - Beijing China if (!(tmp = allocb(sizeof (struct vt_mode), BPRI_MED))) { 943aecfc01dSrui zang - Sun Microsystems - Beijing China error = ENOMEM; 944aecfc01dSrui zang - Sun Microsystems - Beijing China break; 945aecfc01dSrui zang - Sun Microsystems - Beijing China } 946aecfc01dSrui zang - Sun Microsystems - Beijing China *(struct vt_mode *)(void *)tmp->b_rptr = vtmode; 947aecfc01dSrui zang - Sun Microsystems - Beijing China tmp->b_wptr += sizeof (struct vt_mode); 948aecfc01dSrui zang - Sun Microsystems - Beijing China vt_copyout(q, mp, tmp, sizeof (struct vt_mode)); 949aecfc01dSrui zang - Sun Microsystems - Beijing China return; 950aecfc01dSrui zang - Sun Microsystems - Beijing China 951aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_SETMODE: 952aecfc01dSrui zang - Sun Microsystems - Beijing China vt_copyin(q, mp, sizeof (struct vt_mode)); 953aecfc01dSrui zang - Sun Microsystems - Beijing China return; 954aecfc01dSrui zang - Sun Microsystems - Beijing China 955aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_SETDISPINFO: 956aecfc01dSrui zang - Sun Microsystems - Beijing China /* always enforce sys_devices privilege for setdispinfo */ 957aecfc01dSrui zang - Sun Microsystems - Beijing China if ((error = secpolicy_console(iocp->ioc_cr)) != 0) 958aecfc01dSrui zang - Sun Microsystems - Beijing China break; 959aecfc01dSrui zang - Sun Microsystems - Beijing China 960aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_dispnum = *(intptr_t *)(void *)mp->b_cont->b_rptr; 961aecfc01dSrui zang - Sun Microsystems - Beijing China break; 962aecfc01dSrui zang - Sun Microsystems - Beijing China 963aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_SETDISPLOGIN: 964aecfc01dSrui zang - Sun Microsystems - Beijing China pvc->vc_login = *(intptr_t *)(void *)mp->b_cont->b_rptr; 965aecfc01dSrui zang - Sun Microsystems - Beijing China break; 966aecfc01dSrui zang - Sun Microsystems - Beijing China 967aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_GETDISPINFO: 968aecfc01dSrui zang - Sun Microsystems - Beijing China vtdisp.v_pid = pvc->vc_pid; 969aecfc01dSrui zang - Sun Microsystems - Beijing China vtdisp.v_dispnum = pvc->vc_dispnum; 970aecfc01dSrui zang - Sun Microsystems - Beijing China vtdisp.v_login = pvc->vc_login; 971aecfc01dSrui zang - Sun Microsystems - Beijing China if (!(tmp = allocb(sizeof (struct vt_dispinfo), BPRI_MED))) { 972aecfc01dSrui zang - Sun Microsystems - Beijing China error = ENOMEM; 973aecfc01dSrui zang - Sun Microsystems - Beijing China break; 974aecfc01dSrui zang - Sun Microsystems - Beijing China } 975aecfc01dSrui zang - Sun Microsystems - Beijing China *(struct vt_dispinfo *)(void *)tmp->b_rptr = vtdisp; 976aecfc01dSrui zang - Sun Microsystems - Beijing China tmp->b_wptr += sizeof (struct vt_dispinfo); 977aecfc01dSrui zang - Sun Microsystems - Beijing China vt_copyout(q, mp, tmp, sizeof (struct vt_dispinfo)); 978aecfc01dSrui zang - Sun Microsystems - Beijing China return; 979aecfc01dSrui zang - Sun Microsystems - Beijing China 980aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_RELDISP: 981aecfc01dSrui zang - Sun Microsystems - Beijing China arg = *(intptr_t *)(void *)mp->b_cont->b_rptr; 982aecfc01dSrui zang - Sun Microsystems - Beijing China error = vt_reldisp(pvc, arg, iocp->ioc_cr); 983aecfc01dSrui zang - Sun Microsystems - Beijing China break; 984aecfc01dSrui zang - Sun Microsystems - Beijing China 985aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_CONFIG: 986aecfc01dSrui zang - Sun Microsystems - Beijing China /* always enforce sys_devices privilege for config */ 987aecfc01dSrui zang - Sun Microsystems - Beijing China if ((error = secpolicy_console(iocp->ioc_cr)) != 0) 988aecfc01dSrui zang - Sun Microsystems - Beijing China break; 989aecfc01dSrui zang - Sun Microsystems - Beijing China 990aecfc01dSrui zang - Sun Microsystems - Beijing China arg = *(intptr_t *)(void *)mp->b_cont->b_rptr; 991aecfc01dSrui zang - Sun Microsystems - Beijing China error = vt_config(arg); 992aecfc01dSrui zang - Sun Microsystems - Beijing China break; 993aecfc01dSrui zang - Sun Microsystems - Beijing China 994aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_ACTIVATE: 995aecfc01dSrui zang - Sun Microsystems - Beijing China /* always enforce sys_devices privilege for secure switch */ 996aecfc01dSrui zang - Sun Microsystems - Beijing China if ((error = secpolicy_console(iocp->ioc_cr)) != 0) 997aecfc01dSrui zang - Sun Microsystems - Beijing China break; 998aecfc01dSrui zang - Sun Microsystems - Beijing China 999aecfc01dSrui zang - Sun Microsystems - Beijing China arg = *(intptr_t *)(void *)mp->b_cont->b_rptr; 1000aecfc01dSrui zang - Sun Microsystems - Beijing China error = vt_activate(arg, iocp->ioc_cr); 1001aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1002aecfc01dSrui zang - Sun Microsystems - Beijing China 1003aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_WAITACTIVE: 1004aecfc01dSrui zang - Sun Microsystems - Beijing China arg = *(intptr_t *)(void *)mp->b_cont->b_rptr; 1005aecfc01dSrui zang - Sun Microsystems - Beijing China arg = vt_arg2minor(arg); 1006aecfc01dSrui zang - Sun Microsystems - Beijing China if (!vt_minor_valid(arg)) { 1007aecfc01dSrui zang - Sun Microsystems - Beijing China error = ENXIO; 1008aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1009aecfc01dSrui zang - Sun Microsystems - Beijing China } 1010aecfc01dSrui zang - Sun Microsystems - Beijing China if (arg == vc_active_console) 1011aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1012aecfc01dSrui zang - Sun Microsystems - Beijing China 1013aecfc01dSrui zang - Sun Microsystems - Beijing China wait_msg = kmem_zalloc(sizeof (vc_waitactive_msg_t), 1014aecfc01dSrui zang - Sun Microsystems - Beijing China KM_NOSLEEP); 1015aecfc01dSrui zang - Sun Microsystems - Beijing China if (wait_msg == NULL) { 1016aecfc01dSrui zang - Sun Microsystems - Beijing China error = ENXIO; 1017aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1018aecfc01dSrui zang - Sun Microsystems - Beijing China } 1019aecfc01dSrui zang - Sun Microsystems - Beijing China 1020aecfc01dSrui zang - Sun Microsystems - Beijing China wait_msg->wa_mp = mp; 1021aecfc01dSrui zang - Sun Microsystems - Beijing China wait_msg->wa_msg_minor = pvc->vc_minor; 1022aecfc01dSrui zang - Sun Microsystems - Beijing China wait_msg->wa_wait_minor = arg; 1023aecfc01dSrui zang - Sun Microsystems - Beijing China list_insert_head(&vc_waitactive_list, wait_msg); 1024aecfc01dSrui zang - Sun Microsystems - Beijing China 1025aecfc01dSrui zang - Sun Microsystems - Beijing China return; 1026aecfc01dSrui zang - Sun Microsystems - Beijing China 1027aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_GETSTATE: 1028aecfc01dSrui zang - Sun Microsystems - Beijing China /* 1029aecfc01dSrui zang - Sun Microsystems - Beijing China * Here v_active is the argument for vt_activate, 1030aecfc01dSrui zang - Sun Microsystems - Beijing China * not minor. 1031aecfc01dSrui zang - Sun Microsystems - Beijing China */ 1032aecfc01dSrui zang - Sun Microsystems - Beijing China vtinfo.v_active = vt_minor2arg(vc_active_console); 1033aecfc01dSrui zang - Sun Microsystems - Beijing China vtinfo.v_state = 3; /* system console and vtdaemon */ 1034aecfc01dSrui zang - Sun Microsystems - Beijing China 1035aecfc01dSrui zang - Sun Microsystems - Beijing China /* we only support 16 vt states since the v_state is short */ 1036aecfc01dSrui zang - Sun Microsystems - Beijing China for (minor = 2; minor < 16; minor++) { 1037aecfc01dSrui zang - Sun Microsystems - Beijing China pvc = vt_minor2vc(minor); 1038aecfc01dSrui zang - Sun Microsystems - Beijing China if (pvc == NULL) 1039aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1040aecfc01dSrui zang - Sun Microsystems - Beijing China if (VT_IS_INUSE(minor)) 1041aecfc01dSrui zang - Sun Microsystems - Beijing China vtinfo.v_state |= (1 << pvc->vc_minor); 1042aecfc01dSrui zang - Sun Microsystems - Beijing China } 1043aecfc01dSrui zang - Sun Microsystems - Beijing China 1044aecfc01dSrui zang - Sun Microsystems - Beijing China if (!(tmp = allocb(sizeof (struct vt_stat), BPRI_MED))) { 1045aecfc01dSrui zang - Sun Microsystems - Beijing China error = ENOMEM; 1046aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1047aecfc01dSrui zang - Sun Microsystems - Beijing China } 1048aecfc01dSrui zang - Sun Microsystems - Beijing China *(struct vt_stat *)(void *)tmp->b_rptr = vtinfo; 1049aecfc01dSrui zang - Sun Microsystems - Beijing China tmp->b_wptr += sizeof (struct vt_stat); 1050aecfc01dSrui zang - Sun Microsystems - Beijing China vt_copyout(q, mp, tmp, sizeof (struct vt_stat)); 1051aecfc01dSrui zang - Sun Microsystems - Beijing China return; 1052aecfc01dSrui zang - Sun Microsystems - Beijing China 1053aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_SET_TARGET: 1054aecfc01dSrui zang - Sun Microsystems - Beijing China /* always enforce sys_devices privilege */ 1055aecfc01dSrui zang - Sun Microsystems - Beijing China if ((error = secpolicy_console(iocp->ioc_cr)) != 0) 1056aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1057aecfc01dSrui zang - Sun Microsystems - Beijing China 1058aecfc01dSrui zang - Sun Microsystems - Beijing China arg = *(intptr_t *)(void *)mp->b_cont->b_rptr; 1059aecfc01dSrui zang - Sun Microsystems - Beijing China 1060aecfc01dSrui zang - Sun Microsystems - Beijing China /* vtdaemon is doing authentication for this target console */ 1061aecfc01dSrui zang - Sun Microsystems - Beijing China vc_target_console = arg; 1062aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1063aecfc01dSrui zang - Sun Microsystems - Beijing China 1064aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_GETACTIVE: /* get real active console (minor) */ 1065aecfc01dSrui zang - Sun Microsystems - Beijing China if (!(tmp = allocb(sizeof (int), BPRI_MED))) { 1066aecfc01dSrui zang - Sun Microsystems - Beijing China error = ENOMEM; 1067aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1068aecfc01dSrui zang - Sun Microsystems - Beijing China } 1069aecfc01dSrui zang - Sun Microsystems - Beijing China *(int *)(void *)tmp->b_rptr = vc_active_console; 1070aecfc01dSrui zang - Sun Microsystems - Beijing China tmp->b_wptr += sizeof (int); 1071aecfc01dSrui zang - Sun Microsystems - Beijing China vt_copyout(q, mp, tmp, sizeof (int)); 1072aecfc01dSrui zang - Sun Microsystems - Beijing China return; 1073aecfc01dSrui zang - Sun Microsystems - Beijing China 1074aecfc01dSrui zang - Sun Microsystems - Beijing China default: 1075aecfc01dSrui zang - Sun Microsystems - Beijing China error = ENXIO; 1076aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1077aecfc01dSrui zang - Sun Microsystems - Beijing China } 1078aecfc01dSrui zang - Sun Microsystems - Beijing China 1079aecfc01dSrui zang - Sun Microsystems - Beijing China if (error != 0) 1080aecfc01dSrui zang - Sun Microsystems - Beijing China vt_iocnak(q, mp, error); 1081aecfc01dSrui zang - Sun Microsystems - Beijing China else 1082aecfc01dSrui zang - Sun Microsystems - Beijing China vt_iocack(q, mp); 1083aecfc01dSrui zang - Sun Microsystems - Beijing China } 1084aecfc01dSrui zang - Sun Microsystems - Beijing China 1085aecfc01dSrui zang - Sun Microsystems - Beijing China void 1086aecfc01dSrui zang - Sun Microsystems - Beijing China vt_miocdata(queue_t *qp, mblk_t *mp) 1087aecfc01dSrui zang - Sun Microsystems - Beijing China { 1088aecfc01dSrui zang - Sun Microsystems - Beijing China vc_state_t *pvc = (vc_state_t *)qp->q_ptr; 1089aecfc01dSrui zang - Sun Microsystems - Beijing China struct copyresp *copyresp; 1090aecfc01dSrui zang - Sun Microsystems - Beijing China struct vt_mode *pmode; 1091aecfc01dSrui zang - Sun Microsystems - Beijing China int error = 0; 1092aecfc01dSrui zang - Sun Microsystems - Beijing China 1093aecfc01dSrui zang - Sun Microsystems - Beijing China copyresp = (struct copyresp *)(void *)mp->b_rptr; 1094aecfc01dSrui zang - Sun Microsystems - Beijing China if (copyresp->cp_rval) { 1095aecfc01dSrui zang - Sun Microsystems - Beijing China vt_iocnak(qp, mp, EAGAIN); 1096aecfc01dSrui zang - Sun Microsystems - Beijing China return; 1097aecfc01dSrui zang - Sun Microsystems - Beijing China } 1098aecfc01dSrui zang - Sun Microsystems - Beijing China 1099aecfc01dSrui zang - Sun Microsystems - Beijing China switch (copyresp->cp_cmd) { 1100aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_SETMODE: 1101aecfc01dSrui zang - Sun Microsystems - Beijing China pmode = (struct vt_mode *)(void *)mp->b_cont->b_rptr; 1102aecfc01dSrui zang - Sun Microsystems - Beijing China error = vt_setmode(pvc, pmode); 1103aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1104aecfc01dSrui zang - Sun Microsystems - Beijing China 1105aecfc01dSrui zang - Sun Microsystems - Beijing China case KDGETMODE: 1106aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_OPENQRY: 1107aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_GETMODE: 1108aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_GETDISPINFO: 1109aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_GETSTATE: 1110aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_ENABLED: 1111aecfc01dSrui zang - Sun Microsystems - Beijing China case VT_GETACTIVE: 1112aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1113aecfc01dSrui zang - Sun Microsystems - Beijing China 1114aecfc01dSrui zang - Sun Microsystems - Beijing China default: 1115aecfc01dSrui zang - Sun Microsystems - Beijing China error = ENXIO; 1116aecfc01dSrui zang - Sun Microsystems - Beijing China break; 1117aecfc01dSrui zang - Sun Microsystems - Beijing China } 1118aecfc01dSrui zang - Sun Microsystems - Beijing China 1119aecfc01dSrui zang - Sun Microsystems - Beijing China if (error != 0) 1120aecfc01dSrui zang - Sun Microsystems - Beijing China vt_iocnak(qp, mp, error); 1121aecfc01dSrui zang - Sun Microsystems - Beijing China else 1122aecfc01dSrui zang - Sun Microsystems - Beijing China vt_iocack(qp, mp); 1123aecfc01dSrui zang - Sun Microsystems - Beijing China } 1124aecfc01dSrui zang - Sun Microsystems - Beijing China 1125aecfc01dSrui zang - Sun Microsystems - Beijing China static void 1126aecfc01dSrui zang - Sun Microsystems - Beijing China vt_iocack(queue_t *qp, mblk_t *mp) 1127aecfc01dSrui zang - Sun Microsystems - Beijing China { 1128aecfc01dSrui zang - Sun Microsystems - Beijing China struct iocblk *iocbp = (struct iocblk *)(void *)mp->b_rptr; 1129aecfc01dSrui zang - Sun Microsystems - Beijing China 1130aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_datap->db_type = M_IOCACK; 1131aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_wptr = mp->b_rptr + sizeof (struct iocblk); 1132aecfc01dSrui zang - Sun Microsystems - Beijing China iocbp->ioc_error = 0; 1133aecfc01dSrui zang - Sun Microsystems - Beijing China iocbp->ioc_count = 0; 1134aecfc01dSrui zang - Sun Microsystems - Beijing China iocbp->ioc_rval = 0; 1135aecfc01dSrui zang - Sun Microsystems - Beijing China if (mp->b_cont != NULL) { 1136aecfc01dSrui zang - Sun Microsystems - Beijing China freemsg(mp->b_cont); 1137aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_cont = NULL; 1138aecfc01dSrui zang - Sun Microsystems - Beijing China } 1139aecfc01dSrui zang - Sun Microsystems - Beijing China qreply(qp, mp); 1140aecfc01dSrui zang - Sun Microsystems - Beijing China } 1141aecfc01dSrui zang - Sun Microsystems - Beijing China 1142aecfc01dSrui zang - Sun Microsystems - Beijing China static void 1143aecfc01dSrui zang - Sun Microsystems - Beijing China vt_iocnak(queue_t *qp, mblk_t *mp, int error) 1144aecfc01dSrui zang - Sun Microsystems - Beijing China { 1145aecfc01dSrui zang - Sun Microsystems - Beijing China struct iocblk *iocp = (struct iocblk *)(void *)mp->b_rptr; 1146aecfc01dSrui zang - Sun Microsystems - Beijing China 1147aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_datap->db_type = M_IOCNAK; 1148aecfc01dSrui zang - Sun Microsystems - Beijing China iocp->ioc_rval = 0; 1149aecfc01dSrui zang - Sun Microsystems - Beijing China iocp->ioc_count = 0; 1150aecfc01dSrui zang - Sun Microsystems - Beijing China iocp->ioc_error = error; 1151aecfc01dSrui zang - Sun Microsystems - Beijing China if (mp->b_cont != NULL) { 1152aecfc01dSrui zang - Sun Microsystems - Beijing China freemsg(mp->b_cont); 1153aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_cont = NULL; 1154aecfc01dSrui zang - Sun Microsystems - Beijing China } 1155aecfc01dSrui zang - Sun Microsystems - Beijing China qreply(qp, mp); 1156aecfc01dSrui zang - Sun Microsystems - Beijing China } 1157aecfc01dSrui zang - Sun Microsystems - Beijing China 1158aecfc01dSrui zang - Sun Microsystems - Beijing China static void 1159aecfc01dSrui zang - Sun Microsystems - Beijing China vt_copyin(queue_t *qp, mblk_t *mp, uint_t size) 1160aecfc01dSrui zang - Sun Microsystems - Beijing China { 1161aecfc01dSrui zang - Sun Microsystems - Beijing China struct copyreq *cqp; 1162aecfc01dSrui zang - Sun Microsystems - Beijing China 1163aecfc01dSrui zang - Sun Microsystems - Beijing China cqp = (struct copyreq *)(void *)mp->b_rptr; 1164aecfc01dSrui zang - Sun Microsystems - Beijing China cqp->cq_addr = *((caddr_t *)(void *)mp->b_cont->b_rptr); 1165aecfc01dSrui zang - Sun Microsystems - Beijing China cqp->cq_size = size; 1166aecfc01dSrui zang - Sun Microsystems - Beijing China cqp->cq_flag = 0; 1167aecfc01dSrui zang - Sun Microsystems - Beijing China cqp->cq_private = (mblk_t *)NULL; 1168aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_wptr = mp->b_rptr + sizeof (struct copyreq); 1169aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_datap->db_type = M_COPYIN; 1170aecfc01dSrui zang - Sun Microsystems - Beijing China if (mp->b_cont) 1171aecfc01dSrui zang - Sun Microsystems - Beijing China freemsg(mp->b_cont); 1172aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_cont = (mblk_t *)NULL; 1173aecfc01dSrui zang - Sun Microsystems - Beijing China qreply(qp, mp); 1174aecfc01dSrui zang - Sun Microsystems - Beijing China } 1175aecfc01dSrui zang - Sun Microsystems - Beijing China 1176aecfc01dSrui zang - Sun Microsystems - Beijing China static void 1177aecfc01dSrui zang - Sun Microsystems - Beijing China vt_copyout(queue_t *qp, mblk_t *mp, mblk_t *tmp, uint_t size) 1178aecfc01dSrui zang - Sun Microsystems - Beijing China { 1179aecfc01dSrui zang - Sun Microsystems - Beijing China struct copyreq *cqp; 1180aecfc01dSrui zang - Sun Microsystems - Beijing China 1181aecfc01dSrui zang - Sun Microsystems - Beijing China cqp = (struct copyreq *)(void *)mp->b_rptr; 1182aecfc01dSrui zang - Sun Microsystems - Beijing China cqp->cq_size = size; 1183aecfc01dSrui zang - Sun Microsystems - Beijing China cqp->cq_addr = *((caddr_t *)(void *)mp->b_cont->b_rptr); 1184aecfc01dSrui zang - Sun Microsystems - Beijing China cqp->cq_flag = 0; 1185aecfc01dSrui zang - Sun Microsystems - Beijing China cqp->cq_private = (mblk_t *)NULL; 1186aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_wptr = mp->b_rptr + sizeof (struct copyreq); 1187aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_datap->db_type = M_COPYOUT; 1188aecfc01dSrui zang - Sun Microsystems - Beijing China if (mp->b_cont) 1189aecfc01dSrui zang - Sun Microsystems - Beijing China freemsg(mp->b_cont); 1190aecfc01dSrui zang - Sun Microsystems - Beijing China mp->b_cont = tmp; 1191aecfc01dSrui zang - Sun Microsystems - Beijing China qreply(qp, mp); 1192aecfc01dSrui zang - Sun Microsystems - Beijing China } 1193aecfc01dSrui zang - Sun Microsystems - Beijing China 1194aecfc01dSrui zang - Sun Microsystems - Beijing China /* 1195aecfc01dSrui zang - Sun Microsystems - Beijing China * Get vc state from minor. 1196aecfc01dSrui zang - Sun Microsystems - Beijing China * Once a caller gets a vc_state_t from this function, 1197aecfc01dSrui zang - Sun Microsystems - Beijing China * the vc_state_t is guaranteed not being freed before 1198aecfc01dSrui zang - Sun Microsystems - Beijing China * the caller leaves this STREAMS module by the D_MTPERMOD 1199aecfc01dSrui zang - Sun Microsystems - Beijing China * perimeter. 1200aecfc01dSrui zang - Sun Microsystems - Beijing China */ 1201aecfc01dSrui zang - Sun Microsystems - Beijing China vc_state_t * 1202aecfc01dSrui zang - Sun Microsystems - Beijing China vt_minor2vc(minor_t minor) 1203aecfc01dSrui zang - Sun Microsystems - Beijing China { 1204aecfc01dSrui zang - Sun Microsystems - Beijing China avl_index_t where; 1205aecfc01dSrui zang - Sun Microsystems - Beijing China vc_state_t target; 1206aecfc01dSrui zang - Sun Microsystems - Beijing China 1207aecfc01dSrui zang - Sun Microsystems - Beijing China if (minor != VT_ACTIVE) { 1208aecfc01dSrui zang - Sun Microsystems - Beijing China target.vc_minor = minor; 1209aecfc01dSrui zang - Sun Microsystems - Beijing China return (avl_find(&vc_avl_root, &target, &where)); 1210aecfc01dSrui zang - Sun Microsystems - Beijing China } 1211aecfc01dSrui zang - Sun Microsystems - Beijing China 1212aecfc01dSrui zang - Sun Microsystems - Beijing China if (vc_active_console == VT_MINOR_INVALID) 1213aecfc01dSrui zang - Sun Microsystems - Beijing China target.vc_minor = 0; 1214aecfc01dSrui zang - Sun Microsystems - Beijing China else 1215aecfc01dSrui zang - Sun Microsystems - Beijing China target.vc_minor = vc_active_console; 1216aecfc01dSrui zang - Sun Microsystems - Beijing China 1217aecfc01dSrui zang - Sun Microsystems - Beijing China return (avl_find(&vc_avl_root, &target, &where)); 1218aecfc01dSrui zang - Sun Microsystems - Beijing China } 1219aecfc01dSrui zang - Sun Microsystems - Beijing China 1220aecfc01dSrui zang - Sun Microsystems - Beijing China static void 1221aecfc01dSrui zang - Sun Microsystems - Beijing China vt_state_init(vc_state_t *vcptr, minor_t minor) 1222aecfc01dSrui zang - Sun Microsystems - Beijing China { 1223aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_init(&vcptr->vc_state_lock, NULL, MUTEX_DRIVER, NULL); 1224aecfc01dSrui zang - Sun Microsystems - Beijing China 1225aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_enter(&vcptr->vc_state_lock); 1226aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_flags = 0; 1227aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_exit(&vcptr->vc_state_lock); 1228aecfc01dSrui zang - Sun Microsystems - Beijing China 1229aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_pid = -1; 1230aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_dispnum = 0; 1231aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_login = 0; 1232aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_switchto = VT_MINOR_INVALID; 1233aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_switch_mode = VT_AUTO; 1234aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_relsig = SIGUSR1; 1235aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_acqsig = SIGUSR1; 1236aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_tem = NULL; 1237aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_bufcallid = 0; 1238aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_timeoutid = 0; 1239aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_wq = NULL; 1240aecfc01dSrui zang - Sun Microsystems - Beijing China vcptr->vc_minor = minor; 1241aecfc01dSrui zang - Sun Microsystems - Beijing China } 1242aecfc01dSrui zang - Sun Microsystems - Beijing China 1243aecfc01dSrui zang - Sun Microsystems - Beijing China void 1244aecfc01dSrui zang - Sun Microsystems - Beijing China vt_resize(uint_t count) 1245aecfc01dSrui zang - Sun Microsystems - Beijing China { 1246aecfc01dSrui zang - Sun Microsystems - Beijing China uint_t vc_num, i; 1247aecfc01dSrui zang - Sun Microsystems - Beijing China 1248aecfc01dSrui zang - Sun Microsystems - Beijing China ASSERT(MUTEX_HELD(&vc_lock)); 1249aecfc01dSrui zang - Sun Microsystems - Beijing China 1250aecfc01dSrui zang - Sun Microsystems - Beijing China vc_num = VC_INSTANCES_COUNT; 1251aecfc01dSrui zang - Sun Microsystems - Beijing China 1252aecfc01dSrui zang - Sun Microsystems - Beijing China if (count == vc_num) 1253aecfc01dSrui zang - Sun Microsystems - Beijing China return; 1254aecfc01dSrui zang - Sun Microsystems - Beijing China 1255aecfc01dSrui zang - Sun Microsystems - Beijing China if (count > vc_num) { 1256aecfc01dSrui zang - Sun Microsystems - Beijing China for (i = vc_num; i < count; i++) { 1257aecfc01dSrui zang - Sun Microsystems - Beijing China vc_state_t *vcptr = kmem_zalloc(sizeof (vc_state_t), 1258aecfc01dSrui zang - Sun Microsystems - Beijing China KM_SLEEP); 1259aecfc01dSrui zang - Sun Microsystems - Beijing China vt_state_init(vcptr, i); 1260aecfc01dSrui zang - Sun Microsystems - Beijing China avl_add(&vc_avl_root, vcptr); 1261aecfc01dSrui zang - Sun Microsystems - Beijing China } 1262aecfc01dSrui zang - Sun Microsystems - Beijing China return; 1263aecfc01dSrui zang - Sun Microsystems - Beijing China } 1264aecfc01dSrui zang - Sun Microsystems - Beijing China 1265aecfc01dSrui zang - Sun Microsystems - Beijing China for (i = vc_num; i > count; i--) { 1266aecfc01dSrui zang - Sun Microsystems - Beijing China avl_index_t where; 1267aecfc01dSrui zang - Sun Microsystems - Beijing China vc_state_t target, *found; 1268aecfc01dSrui zang - Sun Microsystems - Beijing China 1269aecfc01dSrui zang - Sun Microsystems - Beijing China target.vc_minor = i - 1; 1270aecfc01dSrui zang - Sun Microsystems - Beijing China found = avl_find(&vc_avl_root, &target, &where); 1271aecfc01dSrui zang - Sun Microsystems - Beijing China ASSERT(found != NULL && found->vc_flags == 0); 1272aecfc01dSrui zang - Sun Microsystems - Beijing China avl_remove(&vc_avl_root, found); 1273aecfc01dSrui zang - Sun Microsystems - Beijing China kmem_free(found, sizeof (vc_state_t)); 1274aecfc01dSrui zang - Sun Microsystems - Beijing China } 1275aecfc01dSrui zang - Sun Microsystems - Beijing China } 1276aecfc01dSrui zang - Sun Microsystems - Beijing China 1277aecfc01dSrui zang - Sun Microsystems - Beijing China static int 1278aecfc01dSrui zang - Sun Microsystems - Beijing China vc_avl_compare(const void *first, const void *second) 1279aecfc01dSrui zang - Sun Microsystems - Beijing China { 1280aecfc01dSrui zang - Sun Microsystems - Beijing China const vc_state_t *vcptr1 = first; 1281aecfc01dSrui zang - Sun Microsystems - Beijing China const vc_state_t *vcptr2 = second; 1282aecfc01dSrui zang - Sun Microsystems - Beijing China 1283aecfc01dSrui zang - Sun Microsystems - Beijing China if (vcptr1->vc_minor < vcptr2->vc_minor) 1284aecfc01dSrui zang - Sun Microsystems - Beijing China return (-1); 1285aecfc01dSrui zang - Sun Microsystems - Beijing China 1286aecfc01dSrui zang - Sun Microsystems - Beijing China if (vcptr1->vc_minor == vcptr2->vc_minor) 1287aecfc01dSrui zang - Sun Microsystems - Beijing China return (0); 1288aecfc01dSrui zang - Sun Microsystems - Beijing China 1289aecfc01dSrui zang - Sun Microsystems - Beijing China return (1); 1290aecfc01dSrui zang - Sun Microsystems - Beijing China } 1291aecfc01dSrui zang - Sun Microsystems - Beijing China 1292aecfc01dSrui zang - Sun Microsystems - Beijing China /* 1293aecfc01dSrui zang - Sun Microsystems - Beijing China * Only called from wc init(). 1294aecfc01dSrui zang - Sun Microsystems - Beijing China */ 1295aecfc01dSrui zang - Sun Microsystems - Beijing China void 1296aecfc01dSrui zang - Sun Microsystems - Beijing China vt_init(void) 1297aecfc01dSrui zang - Sun Microsystems - Beijing China { 1298aecfc01dSrui zang - Sun Microsystems - Beijing China #ifdef __lock_lint 1299aecfc01dSrui zang - Sun Microsystems - Beijing China ASSERT(NO_COMPETING_THREADS); 1300aecfc01dSrui zang - Sun Microsystems - Beijing China #endif 1301aecfc01dSrui zang - Sun Microsystems - Beijing China 1302aecfc01dSrui zang - Sun Microsystems - Beijing China avl_create(&vc_avl_root, vc_avl_compare, sizeof (vc_state_t), 1303aecfc01dSrui zang - Sun Microsystems - Beijing China offsetof(vc_state_t, vc_avl_node)); 1304aecfc01dSrui zang - Sun Microsystems - Beijing China 1305aecfc01dSrui zang - Sun Microsystems - Beijing China list_create(&vc_waitactive_list, sizeof (vc_waitactive_msg_t), 1306aecfc01dSrui zang - Sun Microsystems - Beijing China offsetof(vc_waitactive_msg_t, wa_list_node)); 1307aecfc01dSrui zang - Sun Microsystems - Beijing China 1308aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_init(&vc_lock, NULL, MUTEX_DRIVER, NULL); 1309aecfc01dSrui zang - Sun Microsystems - Beijing China mutex_init(&vt_pending_vtno_lock, NULL, MUTEX_DRIVER, NULL); 1310aecfc01dSrui zang - Sun Microsystems - Beijing China } 1311