fea9cb91bd8e12d84069b4dab1268363668b4bfflq/*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * CDDL HEADER START
fea9cb91bd8e12d84069b4dab1268363668b4bfflq *
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * The contents of this file are subject to the terms of the
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * Common Development and Distribution License (the "License").
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * You may not use this file except in compliance with the License.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq *
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * or http://www.opensolaris.org/os/licensing.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * See the License for the specific language governing permissions
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * and limitations under the License.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq *
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * When distributing Covered Code, include this CDDL HEADER in each
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * If applicable, add the following below this CDDL HEADER, with the
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * fields enclosed by brackets "[]" replaced with your own identifying
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * information: Portions Copyright [yyyy] [name of copyright owner]
fea9cb91bd8e12d84069b4dab1268363668b4bfflq *
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * CDDL HEADER END
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq/*
b52fe415da5fadd2c81549726feeec231acfd8f4lipeng sang - Sun Microsystems - Beijing China * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * Use is subject to license terms.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq/*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * ANSI terminal emulator module; parse ANSI X3.64 escape sequences and
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * the like.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * How Virtual Terminal Emulator Works:
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * Every virtual terminal is associated with a tem_vt_state structure
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * and maintains a virtual screen buffer in tvs_screen_buf, which contains
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * all the characters which should be shown on the physical screen when
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * the terminal is activated. There are also two other buffers, tvs_fg_buf
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * and tvs_bg_buf, which track the foreground and background colors of the
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * on screen characters
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * Data written to a virtual terminal is composed of characters which
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * should be displayed on the screen when this virtual terminal is
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * activated, fg/bg colors of these characters, and other control
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * information (escape sequence, etc).
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * When data is passed to a virtual terminal it first is parsed for
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * control information by tem_safe_parse(). Subsequently the character
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * and color data are written to tvs_screen_buf, tvs_fg_buf, and
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * tvs_bg_buf. They are saved in these buffers in order to refresh
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * the screen when this terminal is activated. If the terminal is
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * currently active, the data (characters and colors) are also written
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * to the physical screen by invoking a callback function,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * tem_safe_text_callbacks() or tem_safe_pix_callbacks().
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * When rendering data to the framebuffer, if the framebuffer is in
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * VIS_PIXEL mode, the character data will first be converted to pixel
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * data using tem_safe_pix_bit2pix(), and then the pixels get displayed
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * on the physical screen. We only store the character and color data in
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * tem_vt_state since the bit2pix conversion only happens when actually
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * rendering to the physical framebuffer.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/types.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/file.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/conf.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/errno.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/open.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/cred.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/kmem.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/ascii.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/consdev.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/font.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/fbio.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/conf.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/modctl.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/strsubr.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/stat.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/visual_io.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/mutex.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/param.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/debug.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/cmn_err.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/console.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/ddi.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/sunddi.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/sunldi.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/tem_impl.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#ifdef _HAVE_TEM_FIRMWARE
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#include <sys/promif.h>
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#endif /* _HAVE_TEM_FIRMWARE */
b52fe415da5fadd2c81549726feeec231acfd8f4lipeng sang - Sun Microsystems - Beijing China#include <sys/consplat.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/kd.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/sysmacros.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/note.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#include <sys/t_lock.h>
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/* Terminal emulator internal helper functions */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void tems_setup_terminal(struct vis_devinit *, size_t, size_t);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void tems_modechange_callback(struct vis_modechg_arg *,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct vis_devinit *);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void tems_reset_colormap(cred_t *, enum called_from);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void tem_free_buf(struct tem_vt_state *);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void tem_internal_init(struct tem_vt_state *, cred_t *, boolean_t,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China boolean_t);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void tems_get_initial_color(tem_color_t *pcolor);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq/*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * Globals
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic ldi_ident_t term_li = NULL;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_state_t tems; /* common term info */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China_NOTE(MUTEX_PROTECTS_DATA(tems.ts_lock, tems))
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflqextern struct mod_ops mod_miscops;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflqstatic struct modlmisc modlmisc = {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq &mod_miscops, /* modops */
fea9cb91bd8e12d84069b4dab1268363668b4bfflq "ANSI Terminal Emulator", /* name */
fea9cb91bd8e12d84069b4dab1268363668b4bfflq};
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflqstatic struct modlinkage modlinkage = {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq MODREV_1, (void *)&modlmisc, NULL
fea9cb91bd8e12d84069b4dab1268363668b4bfflq};
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflqint
fea9cb91bd8e12d84069b4dab1268363668b4bfflq_init(void)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int ret;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq ret = mod_install(&modlinkage);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq if (ret != 0)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq return (ret);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq ret = ldi_ident_from_mod(&modlinkage, &term_li);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq if (ret != 0) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq (void) mod_remove(&modlinkage);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq return (ret);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_init(&tems.ts_lock, (char *)NULL, MUTEX_DRIVER, NULL);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China list_create(&tems.ts_list, sizeof (struct tem_vt_state),
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China offsetof(struct tem_vt_state, tvs_list_node));
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_active = NULL;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
fea9cb91bd8e12d84069b4dab1268363668b4bfflq return (0);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflqint
fea9cb91bd8e12d84069b4dab1268363668b4bfflq_fini()
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int ret;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq ret = mod_remove(&modlinkage);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq if (ret == 0) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq ldi_ident_release(term_li);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq term_li = NULL;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq return (ret);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflqint
fea9cb91bd8e12d84069b4dab1268363668b4bfflq_info(struct modinfo *modinfop)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
fea9cb91bd8e12d84069b4dab1268363668b4bfflq return (mod_info(&modlinkage, modinfop));
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_add(struct tem_vt_state *tem)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(MUTEX_HELD(&tems.ts_lock) && MUTEX_HELD(&tem->tvs_lock));
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China list_insert_head(&tems.ts_list, tem);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_rm(struct tem_vt_state *tem)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(MUTEX_HELD(&tems.ts_lock) && MUTEX_HELD(&tem->tvs_lock));
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China list_remove(&tems.ts_list, tem);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * This is the main entry point to the module. It handles output requests
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * during normal system operation, when (e.g.) mutexes are available.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinavoid
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_write(tem_vt_state_t tem_arg, uchar_t *buf, ssize_t len, cred_t *credp)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct tem_vt_state *tem = (struct tem_vt_state *)tem_arg;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tem->tvs_lock);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (!tem->tvs_initialized) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_safe_check_first_time(tem, credp, CALLED_FROM_NORMAL);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_safe_terminal_emulate(tem, buf, len, credp, CALLED_FROM_NORMAL);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_internal_init(struct tem_vt_state *ptem, cred_t *credp,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China boolean_t init_color, boolean_t clear_screen)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int i, j;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int width, height;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int total;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China text_color_t fg;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China text_color_t bg;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China size_t tc_size = sizeof (text_color_t);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(MUTEX_HELD(&tems.ts_lock) && MUTEX_HELD(&ptem->tvs_lock));
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tems.ts_display_mode == VIS_PIXEL) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_pix_data_size = tems.ts_pix_data_size;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_pix_data =
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China kmem_alloc(ptem->tvs_pix_data_size, KM_SLEEP);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_outbuf_size = tems.ts_c_dimension.width;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_outbuf =
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (unsigned char *)kmem_alloc(ptem->tvs_outbuf_size, KM_SLEEP);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China width = tems.ts_c_dimension.width;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China height = tems.ts_c_dimension.height;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_screen_buf_size = width * height;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_screen_buf =
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (unsigned char *)kmem_alloc(width * height, KM_SLEEP);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China total = width * height * tc_size;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_fg_buf = (text_color_t *)kmem_alloc(total, KM_SLEEP);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_bg_buf = (text_color_t *)kmem_alloc(total, KM_SLEEP);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_color_buf_size = total;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_safe_reset_display(ptem, credp, CALLED_FROM_NORMAL,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China clear_screen, init_color);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_safe_get_color(ptem, &fg, &bg, TEM_ATTR_SCREEN_REVERSE);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China for (i = 0; i < height; i++)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China for (j = 0; j < width; j++) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_screen_buf[i * width + j] = ' ';
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_fg_buf[(i * width +j) * tc_size] = fg;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_bg_buf[(i * width +j) * tc_size] = bg;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_initialized = 1;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinaint
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_initialized(tem_vt_state_t tem_arg)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct tem_vt_state *ptem = (struct tem_vt_state *)tem_arg;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int ret;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&ptem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ret = ptem->tvs_initialized;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&ptem->tvs_lock);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (ret);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_vt_state_t
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_init(cred_t *credp)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct tem_vt_state *ptem;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem = kmem_zalloc(sizeof (struct tem_vt_state), KM_SLEEP);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_init(&ptem->tvs_lock, (char *)NULL, MUTEX_DRIVER, NULL);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&ptem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_isactive = B_FALSE;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_fbmode = KD_TEXT;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China /*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * A tem is regarded as initialized only after tem_internal_init(),
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * will be set at the end of tem_internal_init().
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ptem->tvs_initialized = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (!tems.ts_initialized) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China /*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * Only happens during early console configuration.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_add(ptem);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&ptem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return ((tem_vt_state_t)ptem);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_internal_init(ptem, credp, B_TRUE, B_FALSE);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_add(ptem);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&ptem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return ((tem_vt_state_t)ptem);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq/*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * re-init the tem after video mode has changed and tems_info has
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * been re-inited. The lock is already held.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_reinit(struct tem_vt_state *tem, boolean_t reset_display)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(MUTEX_HELD(&tems.ts_lock) && MUTEX_HELD(&tem->tvs_lock));
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_free_buf(tem); /* only free virtual buffers */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China /* reserve color */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_internal_init(tem, kcred, B_FALSE, reset_display);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_free_buf(struct tem_vt_state *tem)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(tem != NULL && MUTEX_HELD(&tem->tvs_lock));
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tem->tvs_outbuf != NULL)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China kmem_free(tem->tvs_outbuf, tem->tvs_outbuf_size);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tem->tvs_pix_data != NULL)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China kmem_free(tem->tvs_pix_data, tem->tvs_pix_data_size);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tem->tvs_screen_buf != NULL)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China kmem_free(tem->tvs_screen_buf, tem->tvs_screen_buf_size);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tem->tvs_fg_buf != NULL)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China kmem_free(tem->tvs_fg_buf, tem->tvs_color_buf_size);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tem->tvs_bg_buf != NULL)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China kmem_free(tem->tvs_bg_buf, tem->tvs_color_buf_size);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
fea9cb91bd8e12d84069b4dab1268363668b4bfflqvoid
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_destroy(tem_vt_state_t tem_arg, cred_t *credp)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct tem_vt_state *tem = (struct tem_vt_state *)tem_arg;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tem->tvs_lock);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tem->tvs_isactive && tem->tvs_fbmode == KD_TEXT)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_safe_blank_screen(tem, credp, CALLED_FROM_NORMAL);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_free_buf(tem);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_rm(tem);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tems.ts_active == tem)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_active = NULL;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China kmem_free(tem, sizeof (struct tem_vt_state));
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic int
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatems_failed(cred_t *credp, boolean_t finish_ioctl)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int lyr_rval;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(MUTEX_HELD(&tems.ts_lock));
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (finish_ioctl)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (void) ldi_ioctl(tems.ts_hdl, VIS_DEVFINI, 0,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China FWRITE|FKIOCTL, credp, &lyr_rval);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (void) ldi_close(tems.ts_hdl, NULL, credp);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_hdl = NULL;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (ENXIO);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * only called once during boot
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
fea9cb91bd8e12d84069b4dab1268363668b4bfflqint
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_info_init(char *pathname, cred_t *credp)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int lyr_rval, ret;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct vis_devinit temargs;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China char *pathbuf;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq size_t height = 0;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq size_t width = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct tem_vt_state *p;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tems.ts_lock);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tems.ts_initialized) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (0);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq /*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * Open the layered device using the devfs physical device name
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * after adding the /devices prefix.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
fea9cb91bd8e12d84069b4dab1268363668b4bfflq pathbuf = kmem_alloc(MAXPATHLEN, KM_SLEEP);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq (void) strcpy(pathbuf, "/devices");
fea9cb91bd8e12d84069b4dab1268363668b4bfflq if (i_ddi_prompath_to_devfspath(pathname,
fea9cb91bd8e12d84069b4dab1268363668b4bfflq pathbuf + strlen("/devices")) != DDI_SUCCESS) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "terminal-emulator: path conversion error");
fea9cb91bd8e12d84069b4dab1268363668b4bfflq kmem_free(pathbuf, MAXPATHLEN);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq return (ENXIO);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (ldi_open_by_name(pathbuf, FWRITE, credp,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China &tems.ts_hdl, term_li) != 0) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China cmn_err(CE_WARN, "terminal-emulator: device path open error");
fea9cb91bd8e12d84069b4dab1268363668b4bfflq kmem_free(pathbuf, MAXPATHLEN);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq return (ENXIO);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq kmem_free(pathbuf, MAXPATHLEN);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China temargs.modechg_cb = (vis_modechg_cb_t)tems_modechange_callback;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China temargs.modechg_arg = NULL;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq /*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * Initialize the console and get the device parameters
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (ldi_ioctl(tems.ts_hdl, VIS_DEVINIT,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (intptr_t)&temargs, FWRITE|FKIOCTL, credp, &lyr_rval) != 0) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cmn_err(CE_WARN, "terminal emulator: Compatible fb not found");
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ret = tems_failed(credp, B_FALSE);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (ret);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq /* Make sure the fb driver and terminal emulator versions match */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (temargs.version != VIS_CONS_REV) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cmn_err(CE_WARN,
fea9cb91bd8e12d84069b4dab1268363668b4bfflq "terminal emulator: VIS_CONS_REV %d (see sys/visual_io.h) "
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China "of console fb driver not supported", temargs.version);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ret = tems_failed(credp, B_TRUE);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (ret);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if ((tems.ts_fb_polledio = temargs.polledio) == NULL) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cmn_err(CE_WARN, "terminal emulator: fb doesn't support polled "
fea9cb91bd8e12d84069b4dab1268363668b4bfflq "I/O");
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ret = tems_failed(credp, B_TRUE);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (ret);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq /* other sanity checks */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (!((temargs.depth == 4) || (temargs.depth == 8) ||
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (temargs.depth == 24) || (temargs.depth == 32))) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cmn_err(CE_WARN, "terminal emulator: unsupported depth");
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ret = tems_failed(credp, B_TRUE);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (ret);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if ((temargs.mode != VIS_TEXT) && (temargs.mode != VIS_PIXEL)) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cmn_err(CE_WARN, "terminal emulator: unsupported mode");
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ret = tems_failed(credp, B_TRUE);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (ret);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if ((temargs.mode == VIS_PIXEL) && plat_stdout_is_framebuffer())
fea9cb91bd8e12d84069b4dab1268363668b4bfflq plat_tem_get_prom_size(&height, &width);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq /*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * Initialize the common terminal emulator info
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems_setup_terminal(&temargs, height, width);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems_reset_colormap(credp, CALLED_FROM_NORMAL);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems_get_initial_color(&tems.ts_init_color);
c9503a497f482bf9524b37eea8c69239425bcdf4lq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_initialized = 1; /* initialization flag */
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China for (p = list_head(&tems.ts_list); p != NULL;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China p = list_next(&tems.ts_list, p)) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&p->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_internal_init(p, credp, B_TRUE, B_FALSE);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (temargs.mode == VIS_PIXEL)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_pix_align(p, credp, CALLED_FROM_NORMAL);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&p->tvs_lock);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq return (0);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#define TEMS_DEPTH_DIFF 0x01
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#define TEMS_DIMENSION_DIFF 0x02
c9503a497f482bf9524b37eea8c69239425bcdf4lq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic uchar_t
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatems_check_videomode(struct vis_devinit *tp)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China uchar_t result = 0;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tems.ts_pdepth != tp->depth)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China result |= TEMS_DEPTH_DIFF;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tp->mode == VIS_TEXT) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tems.ts_c_dimension.width != tp->width ||
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_c_dimension.height != tp->height)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China result |= TEMS_DIMENSION_DIFF;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China } else {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tems.ts_p_dimension.width != tp->width ||
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_p_dimension.height != tp->height)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China result |= TEMS_DIMENSION_DIFF;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (result);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatems_setup_terminal(struct vis_devinit *tp, size_t height, size_t width)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int i;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int old_blank_buf_size = tems.ts_c_dimension.width;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(MUTEX_HELD(&tems.ts_lock));
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_pdepth = tp->depth;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_linebytes = tp->linebytes;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_display_mode = tp->mode;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China switch (tp->mode) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq case VIS_TEXT:
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_p_dimension.width = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_p_dimension.height = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_c_dimension.width = tp->width;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_c_dimension.height = tp->height;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_callbacks = &tem_safe_text_callbacks;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq break;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China case VIS_PIXEL:
fea9cb91bd8e12d84069b4dab1268363668b4bfflq /*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * First check to see if the user has specified a screen size.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * If so, use those values. Else use 34x80 as the default.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
fea9cb91bd8e12d84069b4dab1268363668b4bfflq if (width == 0) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq width = TEM_DEFAULT_COLS;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq height = TEM_DEFAULT_ROWS;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_c_dimension.height = (screen_size_t)height;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_c_dimension.width = (screen_size_t)width;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_p_dimension.height = tp->height;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_p_dimension.width = tp->width;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_callbacks = &tem_safe_pix_callbacks;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq /*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * set_font() will select a appropriate sized font for
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * the number of rows and columns selected. If we don't
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * have a font that will fit, then it will use the
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * default builtin font and adjust the rows and columns
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * to fit on the screen.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China set_font(&tems.ts_font,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China &tems.ts_c_dimension.height,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China &tems.ts_c_dimension.width,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_p_dimension.height,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_p_dimension.width);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_p_offset.y = (tems.ts_p_dimension.height -
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (tems.ts_c_dimension.height * tems.ts_font.height)) / 2;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_p_offset.x = (tems.ts_p_dimension.width -
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (tems.ts_c_dimension.width * tems.ts_font.width)) / 2;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_pix_data_size =
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_font.width * tems.ts_font.height;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_pix_data_size *= 4;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_pdepth = tp->depth;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq break;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China /* Now virtual cls also uses the blank_line buffer */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tems.ts_blank_line)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China kmem_free(tems.ts_blank_line, old_blank_buf_size);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_blank_line = (unsigned char *)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China kmem_alloc(tems.ts_c_dimension.width, KM_SLEEP);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China for (i = 0; i < tems.ts_c_dimension.width; i++)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_blank_line[i] = ' ';
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * This is a callback function that we register with the frame
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * buffer driver layered underneath. It gets invoked from
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * the underlying frame buffer driver to reconfigure the terminal
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * emulator to a new screen size and depth in conjunction with
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * framebuffer videomode changes.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * Here we keep the foreground/background color and attributes,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * which may be different with the initial settings, so that
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * the color won't change while the framebuffer videomode changes.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * And we also reset the kernel terminal emulator and clear the
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * whole screen.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China/* ARGSUSED */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinavoid
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatems_modechange_callback(struct vis_modechg_arg *arg,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct vis_devinit *devinit)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China uchar_t diff;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct tem_vt_state *p;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_modechg_cb_t cb;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_modechg_cb_arg_t cb_arg;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(!(list_is_empty(&tems.ts_list)));
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China /*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * currently only for pixel mode
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China diff = tems_check_videomode(devinit);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (diff == 0) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China diff = diff & TEMS_DIMENSION_DIFF;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (diff == 0) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq /*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * Only need to reinit the active tem.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct tem_vt_state *active = tems.ts_active;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_pdepth = devinit->depth;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&active->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ASSERT(active->tvs_isactive);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_reinit(active, B_TRUE);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&active->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems_setup_terminal(devinit, tems.ts_c_dimension.height,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_c_dimension.width);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China for (p = list_head(&tems.ts_list); p != NULL;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China p = list_next(&tems.ts_list, p)) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&p->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_reinit(p, p->tvs_isactive);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&p->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tems.ts_modechg_cb == NULL) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China cb = tems.ts_modechg_cb;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China cb_arg = tems.ts_modechg_arg;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China /*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * Release the lock while doing callback.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China cb(cb_arg);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq/*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * This function is used to display a rectangular blit of data
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * of a given size and location via the underlying framebuffer driver.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * The blit can be as small as a pixel or as large as the screen.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
fea9cb91bd8e12d84069b4dab1268363668b4bfflqvoid
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatems_display_layered(
fea9cb91bd8e12d84069b4dab1268363668b4bfflq struct vis_consdisplay *pda,
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cred_t *credp)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int rval;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (void) ldi_ioctl(tems.ts_hdl, VIS_CONSDISPLAY,
fea9cb91bd8e12d84069b4dab1268363668b4bfflq (intptr_t)pda, FKIOCTL, credp, &rval);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq/*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * This function is used to invoke a block copy operation in the
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * underlying framebuffer driver. Rectangle copies are how scrolling
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * is implemented, as well as horizontal text shifting escape seqs.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * such as from vi when deleting characters and words.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
fea9cb91bd8e12d84069b4dab1268363668b4bfflqvoid
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatems_copy_layered(
fea9cb91bd8e12d84069b4dab1268363668b4bfflq struct vis_conscopy *pma,
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cred_t *credp)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int rval;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (void) ldi_ioctl(tems.ts_hdl, VIS_CONSCOPY,
fea9cb91bd8e12d84069b4dab1268363668b4bfflq (intptr_t)pma, FKIOCTL, credp, &rval);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq/*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * This function is used to show or hide a rectangluar monochrom
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * pixel inverting, text block cursor via the underlying framebuffer.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
fea9cb91bd8e12d84069b4dab1268363668b4bfflqvoid
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatems_cursor_layered(
fea9cb91bd8e12d84069b4dab1268363668b4bfflq struct vis_conscursor *pca,
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cred_t *credp)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int rval;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (void) ldi_ioctl(tems.ts_hdl, VIS_CONSCURSOR,
fea9cb91bd8e12d84069b4dab1268363668b4bfflq (intptr_t)pca, FKIOCTL, credp, &rval);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_kdsetmode(int mode, cred_t *credp)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China int rval;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (void) ldi_ioctl(tems.ts_hdl, KDSETMODE,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (intptr_t)mode, FKIOCTL, credp, &rval);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinastatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatems_reset_colormap(cred_t *credp, enum called_from called_from)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
fea9cb91bd8e12d84069b4dab1268363668b4bfflq struct vis_cmap cm;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int rval;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq if (called_from == CALLED_FROM_STANDALONE)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq return;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China switch (tems.ts_pdepth) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq case 8:
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cm.index = 0;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cm.count = 16;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cm.red = cmap4_to_24.red; /* 8-bits (1/3 of TrueColor 24) */
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cm.blue = cmap4_to_24.blue; /* 8-bits (1/3 of TrueColor 24) */
fea9cb91bd8e12d84069b4dab1268363668b4bfflq cm.green = cmap4_to_24.green; /* 8-bits (1/3 of TrueColor 24) */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (void) ldi_ioctl(tems.ts_hdl, VIS_PUTCMAP, (intptr_t)&cm,
fea9cb91bd8e12d84069b4dab1268363668b4bfflq FKIOCTL, credp, &rval);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq break;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflqvoid
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soometem_get_size(ushort_t *r, ushort_t *c, ushort_t *x, ushort_t *y)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *r = (ushort_t)tems.ts_c_dimension.height;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *c = (ushort_t)tems.ts_c_dimension.width;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *x = (ushort_t)tems.ts_p_dimension.width;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China *y = (ushort_t)tems.ts_p_dimension.height;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflqvoid
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soometem_register_modechg_cb(tem_modechg_cb_t func, tem_modechg_cb_arg_t arg)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_modechg_cb = func;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_modechg_arg = arg;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq/*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * This function is to scroll up the OBP output, which has
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * different screen height and width with our kernel console.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
fea9cb91bd8e12d84069b4dab1268363668b4bfflqstatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_prom_scroll_up(struct tem_vt_state *tem, int nrows, cred_t *credp,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China enum called_from called_from)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
fea9cb91bd8e12d84069b4dab1268363668b4bfflq struct vis_conscopy ma;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int ncols, width;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq /* copy */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ma.s_row = nrows * tems.ts_font.height;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ma.e_row = tems.ts_p_dimension.height - 1;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq ma.t_row = 0;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq ma.s_col = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ma.e_col = tems.ts_p_dimension.width - 1;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq ma.t_col = 0;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems_safe_copy(&ma, credp, called_from);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq /* clear */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China width = tems.ts_font.width;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China ncols = (tems.ts_p_dimension.width + (width - 1))/ width;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_safe_pix_cls_range(tem, 0, nrows, tems.ts_p_offset.y,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China 0, ncols, 0, B_TRUE, credp, called_from);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq#define PROM_DEFAULT_FONT_HEIGHT 22
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China#define PROM_DEFAULT_WINDOW_TOP 0x8a
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq/*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * This function is to compute the starting row of the console, according to
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * PROM cursor's position. Here we have to take different fonts into account.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
fea9cb91bd8e12d84069b4dab1268363668b4bfflqstatic int
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_adjust_row(struct tem_vt_state *tem, int prom_row, cred_t *credp,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China enum called_from called_from)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq{
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int tem_row;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int tem_y;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int prom_charheight = 0;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int prom_window_top = 0;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq int scroll_up_lines;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq plat_tem_get_prom_font_size(&prom_charheight, &prom_window_top);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq if (prom_charheight == 0)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq prom_charheight = PROM_DEFAULT_FONT_HEIGHT;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq if (prom_window_top == 0)
fea9cb91bd8e12d84069b4dab1268363668b4bfflq prom_window_top = PROM_DEFAULT_WINDOW_TOP;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq tem_y = (prom_row + 1) * prom_charheight + prom_window_top -
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_p_offset.y;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_row = (tem_y + tems.ts_font.height - 1) /
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_font.height - 1;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq if (tem_row < 0) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq tem_row = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China } else if (tem_row >= (tems.ts_c_dimension.height - 1)) {
fea9cb91bd8e12d84069b4dab1268363668b4bfflq /*
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * Scroll up the prom outputs if the PROM cursor's position is
fea9cb91bd8e12d84069b4dab1268363668b4bfflq * below our tem's lower boundary.
fea9cb91bd8e12d84069b4dab1268363668b4bfflq */
fea9cb91bd8e12d84069b4dab1268363668b4bfflq scroll_up_lines = tem_row -
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (tems.ts_c_dimension.height - 1);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_prom_scroll_up(tem, scroll_up_lines, credp, called_from);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_row = tems.ts_c_dimension.height - 1;
fea9cb91bd8e12d84069b4dab1268363668b4bfflq }
fea9cb91bd8e12d84069b4dab1268363668b4bfflq
fea9cb91bd8e12d84069b4dab1268363668b4bfflq return (tem_row);
fea9cb91bd8e12d84069b4dab1268363668b4bfflq}
c9503a497f482bf9524b37eea8c69239425bcdf4lq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinavoid
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_pix_align(struct tem_vt_state *tem, cred_t *credp,
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China enum called_from called_from)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China uint32_t row = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China uint32_t col = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (plat_stdout_is_framebuffer()) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China plat_tem_hide_prom_cursor();
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China /*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * We are getting the current cursor position in pixel
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * mode so that we don't over-write the console output
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * during boot.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China plat_tem_get_prom_pos(&row, &col);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China /*
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * Adjust the row if necessary when the font of our
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * kernel console tem is different with that of prom
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China * tem.
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China row = tem_adjust_row(tem, row, credp, called_from);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China /* first line of our kernel console output */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem->tvs_first_line = row + 1;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China /* re-set and align cusror position */
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem->tvs_s_cursor.row = tem->tvs_c_cursor.row =
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China (screen_pos_t)row;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem->tvs_s_cursor.col = tem->tvs_c_cursor.col = 0;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China } else {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_safe_reset_display(tem, credp, called_from, B_TRUE, B_TRUE);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
c9503a497f482bf9524b37eea8c69239425bcdf4lqstatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatems_get_inverses(boolean_t *p_inverse, boolean_t *p_inverse_screen)
c9503a497f482bf9524b37eea8c69239425bcdf4lq{
c9503a497f482bf9524b37eea8c69239425bcdf4lq int i_inverse = 0;
c9503a497f482bf9524b37eea8c69239425bcdf4lq int i_inverse_screen = 0;
c9503a497f482bf9524b37eea8c69239425bcdf4lq
c9503a497f482bf9524b37eea8c69239425bcdf4lq plat_tem_get_inverses(&i_inverse, &i_inverse_screen);
c9503a497f482bf9524b37eea8c69239425bcdf4lq
c9503a497f482bf9524b37eea8c69239425bcdf4lq *p_inverse = (i_inverse == 0) ? B_FALSE : B_TRUE;
c9503a497f482bf9524b37eea8c69239425bcdf4lq *p_inverse_screen = (i_inverse_screen == 0) ? B_FALSE : B_TRUE;
c9503a497f482bf9524b37eea8c69239425bcdf4lq}
c9503a497f482bf9524b37eea8c69239425bcdf4lq
c9503a497f482bf9524b37eea8c69239425bcdf4lq/*
c9503a497f482bf9524b37eea8c69239425bcdf4lq * Get the foreground/background color and attributes from the initial
c9503a497f482bf9524b37eea8c69239425bcdf4lq * PROM, so that our kernel console can keep the same visual behaviour.
c9503a497f482bf9524b37eea8c69239425bcdf4lq */
c9503a497f482bf9524b37eea8c69239425bcdf4lqstatic void
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatems_get_initial_color(tem_color_t *pcolor)
c9503a497f482bf9524b37eea8c69239425bcdf4lq{
c9503a497f482bf9524b37eea8c69239425bcdf4lq boolean_t inverse, inverse_screen;
c9503a497f482bf9524b37eea8c69239425bcdf4lq unsigned short flags = 0;
c9503a497f482bf9524b37eea8c69239425bcdf4lq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China pcolor->fg_color = DEFAULT_ANSI_FOREGROUND;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China pcolor->bg_color = DEFAULT_ANSI_BACKGROUND;
c9503a497f482bf9524b37eea8c69239425bcdf4lq
c9503a497f482bf9524b37eea8c69239425bcdf4lq if (plat_stdout_is_framebuffer()) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems_get_inverses(&inverse, &inverse_screen);
c9503a497f482bf9524b37eea8c69239425bcdf4lq if (inverse)
c9503a497f482bf9524b37eea8c69239425bcdf4lq flags |= TEM_ATTR_REVERSE;
c9503a497f482bf9524b37eea8c69239425bcdf4lq if (inverse_screen)
c9503a497f482bf9524b37eea8c69239425bcdf4lq flags |= TEM_ATTR_SCREEN_REVERSE;
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome if (flags != 0) {
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome /*
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome * If either reverse flag is set, the screen is in
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome * white-on-black mode. We set the bold flag to
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome * improve readability.
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome */
c9503a497f482bf9524b37eea8c69239425bcdf4lq flags |= TEM_ATTR_BOLD;
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome } else {
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome /*
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome * Otherwise, the screen is in black-on-white mode.
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome * The SPARC PROM console, which starts in this mode,
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome * uses the bright white background colour so we
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome * match it here.
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome */
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome if (pcolor->bg_color == ANSI_COLOR_WHITE)
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome flags |= TEM_ATTR_BRIGHT_BG;
b6bd4f488cd95b4b547777e8a8ca2045ebb34fadToomas Soome }
c9503a497f482bf9524b37eea8c69239425bcdf4lq }
c9503a497f482bf9524b37eea8c69239425bcdf4lq
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China pcolor->a_flags = flags;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinauchar_t
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_get_fbmode(tem_vt_state_t tem_arg)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct tem_vt_state *tem = (struct tem_vt_state *)tem_arg;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China uchar_t fbmode;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China fbmode = tem->tvs_fbmode;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return (fbmode);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinavoid
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_set_fbmode(tem_vt_state_t tem_arg, uchar_t fbmode, cred_t *credp)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct tem_vt_state *tem = (struct tem_vt_state *)tem_arg;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (fbmode == tem->tvs_fbmode) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China return;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem->tvs_fbmode = fbmode;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tem->tvs_isactive) {
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_kdsetmode(tem->tvs_fbmode, credp);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (fbmode == KD_TEXT)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_safe_unblank_screen(tem, credp, CALLED_FROM_NORMAL);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China }
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinavoid
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_activate(tem_vt_state_t tem_arg, boolean_t unblank, cred_t *credp)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct tem_vt_state *tem = (struct tem_vt_state *)tem_arg;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_active = tem;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem->tvs_isactive = B_TRUE;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_kdsetmode(tem->tvs_fbmode, credp);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (unblank)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_safe_unblank_screen(tem, credp, CALLED_FROM_NORMAL);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tem->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China}
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinavoid
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing Chinatem_switch(tem_vt_state_t tem_arg1, tem_vt_state_t tem_arg2, cred_t *credp)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China{
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct tem_vt_state *cur = (struct tem_vt_state *)tem_arg1;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China struct tem_vt_state *tobe = (struct tem_vt_state *)tem_arg2;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tems.ts_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&tobe->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_enter(&cur->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tems.ts_active = tobe;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China cur->tvs_isactive = B_FALSE;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tobe->tvs_isactive = B_TRUE;
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&cur->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (cur->tvs_fbmode != tobe->tvs_fbmode)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_kdsetmode(tobe->tvs_fbmode, credp);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China if (tobe->tvs_fbmode == KD_TEXT)
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China tem_safe_unblank_screen(tobe, credp, CALLED_FROM_NORMAL);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tobe->tvs_lock);
aecfc01d1bad84e66649703f7fc2926ef70b34barui zang - Sun Microsystems - Beijing China mutex_exit(&tems.ts_lock);
c9503a497f482bf9524b37eea8c69239425bcdf4lq}