xref: /illumos-gate/usr/src/uts/common/sys/tem_impl.h (revision 0bead3cac461a1ad4d49bae1dc8a3be05110aa74)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1990, 1991 UNIX System Laboratories, Inc.	*/
28 
29 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T	*/
30 /*	  All Rights Reserved	*/
31 
32 #ifndef	_SYS_TEM_IMPL_H
33 #define	_SYS_TEM_IMPL_H
34 
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38 
39 #include <sys/types.h>
40 #include <sys/sunddi.h>
41 #include <sys/sunldi.h>
42 #include <sys/visual_io.h>
43 #include <sys/font.h>
44 #include <sys/list.h>
45 #include <sys/tem.h>
46 #include <sys/note.h>
47 
48 /*
49  * definitions for ANSI x3.64 terminal control language parser
50  */
51 
52 #define	TEM_MAXPARAMS	5	/* maximum number of ANSI paramters */
53 #define	TEM_MAXTAB	40	/* maximum number of tab stops */
54 #define	TEM_MAXFKEY	30	/* max length of function key with <ESC>Q */
55 #define	MAX_TEM		2	/* max number of loadable terminal emulators */
56 
57 #define	TEM_SCROLL_UP		0
58 #define	TEM_SCROLL_DOWN		1
59 #define	TEM_SHIFT_LEFT		0
60 #define	TEM_SHIFT_RIGHT		1
61 
62 #define	TEM_ATTR_NORMAL		0x0000
63 #define	TEM_ATTR_REVERSE	0x0001
64 #define	TEM_ATTR_BOLD		0x0002
65 #define	TEM_ATTR_BLINK		0x0004
66 #define	TEM_ATTR_TRANSPARENT	0x0008
67 #define	TEM_ATTR_SCREEN_REVERSE	0x0010
68 #define	TEM_ATTR_BRIGHT_FG	0x0020
69 #define	TEM_ATTR_BRIGHT_BG	0x0040
70 
71 #define	ANSI_COLOR_BLACK	0
72 #define	ANSI_COLOR_WHITE	7
73 
74 #define	TEM_TEXT_WHITE		0
75 #define	TEM_TEXT_BLACK		1
76 #define	TEM_TEXT_BLACK24_RED	0x00
77 #define	TEM_TEXT_BLACK24_GREEN	0x00
78 #define	TEM_TEXT_BLACK24_BLUE	0x00
79 #define	TEM_TEXT_WHITE24_RED	0xff
80 #define	TEM_TEXT_WHITE24_GREEN	0xff
81 #define	TEM_TEXT_WHITE24_BLUE	0xff
82 
83 #define	A_STATE_START			0
84 #define	A_STATE_ESC			1
85 #define	A_STATE_CSI			2
86 #define	A_STATE_CSI_QMARK		3
87 #define	A_STATE_CSI_EQUAL		4
88 
89 /*
90  * Default number of rows and columns
91  */
92 #ifdef _HAVE_TEM_FIRMWARE
93 #define	TEM_DEFAULT_ROWS	34
94 #define	TEM_DEFAULT_COLS	80
95 #else
96 #define	TEM_DEFAULT_ROWS	25
97 #define	TEM_DEFAULT_COLS	80
98 #endif
99 
100 /*
101  * Default foreground/background color
102  */
103 
104 #define	DEFAULT_ANSI_FOREGROUND	ANSI_COLOR_BLACK
105 #define	DEFAULT_ANSI_BACKGROUND	ANSI_COLOR_WHITE
106 
107 #define	BUF_LEN		160 /* Two lines of data can be processed at a time */
108 
109 typedef uint32_t tem_char_t;	/* 32bit char to support UTF-8 */
110 typedef uint8_t text_color_t;
111 
112 typedef struct tem_color {
113 	text_color_t	fg_color;
114 	text_color_t	bg_color;
115 	unsigned short	a_flags;
116 } tem_color_t;
117 
118 enum called_from { CALLED_FROM_NORMAL, CALLED_FROM_STANDALONE };
119 
120 struct tem_pix_pos {
121 	screen_pos_t	x;
122 	screen_pos_t	y;
123 };
124 
125 struct tem_char_pos {
126 	screen_pos_t	col;
127 	screen_pos_t	row;
128 };
129 
130 struct tem_size {
131 	screen_size_t	width;
132 	screen_size_t	height;
133 };
134 
135 typedef struct {
136 	uint8_t red[16];
137 	uint8_t green[16];
138 	uint8_t blue[16];
139 } text_cmap_t;
140 
141 extern text_cmap_t cmap4_to_24;
142 
143 /*
144  * State structure for each virtual terminal emulator
145  */
146 struct tem_vt_state {
147 	kmutex_t	tvs_lock;
148 	uchar_t		tvs_fbmode;	/* framebuffer mode */
149 	unsigned short	tvs_flags;	/* flags for this x3.64 terminal */
150 	int		tvs_state;	/* state in output esc seq processing */
151 	boolean_t	tvs_gotparam;	/* does output esc seq have a param */
152 
153 	int	tvs_curparam;	/* current param # of output esc seq */
154 	int	tvs_paramval;	/* value of current param */
155 	int	tvs_params[TEM_MAXPARAMS];  /* parameters of output esc seq */
156 	screen_pos_t	tvs_tabs[TEM_MAXTAB];	/* tab stops */
157 	int	tvs_ntabs;		/* number of tabs used */
158 	int	tvs_nscroll;		/* number of lines to scroll */
159 
160 	struct tem_char_pos tvs_s_cursor;	/* start cursor position */
161 	struct tem_char_pos tvs_c_cursor;	/* current cursor position */
162 	struct tem_char_pos tvs_r_cursor;	/* remembered cursor position */
163 
164 	tem_char_t	*tvs_outbuf;	/* place to keep incomplete lines */
165 	int		tvs_outbuf_size;
166 	int		tvs_outindex;	/* index into a_outbuf */
167 	void		*tvs_pix_data;	/* pointer to tmp bitmap area */
168 	int		tvs_pix_data_size;
169 	text_color_t	tvs_fg_color;
170 	text_color_t	tvs_bg_color;
171 	int		tvs_first_line;	/* kernel console output begins */
172 
173 	tem_char_t	*tvs_screen_buf;	/* whole screen buffer */
174 	int		tvs_screen_buf_size;
175 	text_color_t	*tvs_fg_buf;	/* fg_color attribute cache */
176 	text_color_t	*tvs_bg_buf;	/* bg_color attribute cache */
177 	int		tvs_color_buf_size;
178 
179 	unsigned	tvs_utf8_left;		/* UTF-8 code points */
180 	tem_char_t	tvs_utf8_partial;	/* UTF-8 char being completed */
181 
182 	boolean_t	tvs_isactive;
183 	int		tvs_initialized;	/* initialization flag */
184 
185 	list_node_t	tvs_list_node;
186 };
187 _NOTE(MUTEX_PROTECTS_DATA(tem_vt_state::tvs_lock, tem_vt_state))
188 
189 typedef struct tem_safe_callbacks {
190 	void (*tsc_display)(struct tem_vt_state *, tem_char_t *, int,
191 	    screen_pos_t, screen_pos_t, unsigned char, unsigned char,
192 	    cred_t *, enum called_from);
193 	void (*tsc_copy)(struct tem_vt_state *,
194 	    screen_pos_t, screen_pos_t, screen_pos_t, screen_pos_t,
195 	    screen_pos_t, screen_pos_t, cred_t *, enum called_from);
196 	void (*tsc_cursor)(struct tem_vt_state *, short, cred_t *,
197 	    enum called_from);
198 	void (*tsc_bit2pix)(struct tem_vt_state *, tem_char_t,
199 	    unsigned char, unsigned char);
200 	void (*tsc_cls)(struct tem_vt_state *, int,
201 	    screen_pos_t, screen_pos_t, cred_t *, enum called_from);
202 } tem_safe_callbacks_t;
203 
204 /*
205  * common term soft state structure shared by all virtual terminal emulators
206  */
207 typedef struct tem_state {
208 	ldi_handle_t	ts_hdl;	/* Framework handle for layered on dev */
209 	screen_size_t	ts_linebytes;	/* Layered on bytes per scan line */
210 
211 	int	ts_display_mode;	/* What mode we are in */
212 	struct	vis_polledio	*ts_fb_polledio;
213 
214 	struct tem_size ts_c_dimension;	/* window dimensions in characters */
215 	struct tem_size ts_p_dimension;	/* screen dimensions in pixels */
216 	struct tem_pix_pos ts_p_offset;	/* pix offset to center the display */
217 
218 	int	ts_pix_data_size;	/* size of bitmap data areas */
219 	int	ts_pdepth;		/* pixel depth */
220 	struct font	ts_font;	/* font table */
221 
222 	tem_char_t	*ts_blank_line;	/* a blank line for scrolling */
223 	tem_safe_callbacks_t	*ts_callbacks;	/* internal output functions */
224 
225 	int	ts_initialized;		/* initialization flag */
226 
227 	tem_modechg_cb_t	ts_modechg_cb;
228 	tem_modechg_cb_arg_t	ts_modechg_arg;
229 
230 	color_map_fn_t	ts_color_map;
231 
232 	tem_color_t	ts_init_color; /* initial color and attributes */
233 
234 	struct tem_vt_state	*ts_active;
235 	kmutex_t	ts_lock;
236 	list_t		ts_list;	/* chain of all tems */
237 } tem_state_t;
238 
239 extern tem_state_t tems;
240 extern tem_safe_callbacks_t tem_safe_text_callbacks;
241 extern tem_safe_callbacks_t tem_safe_pix_callbacks;
242 
243 
244 /*
245  * tems_* fuctions mean that they just operate on the common soft state
246  * (tem_state_t), and tem_* functions mean that they operate on the
247  * per-tem structure (tem_vt_state). All "safe" interfaces are in tem_safe.c.
248  */
249 int	tems_cls_layered(struct vis_consclear *, cred_t *);
250 void	tems_display_layered(struct vis_consdisplay *, cred_t *);
251 void	tems_copy_layered(struct vis_conscopy *, cred_t *);
252 void	tems_cursor_layered(struct vis_conscursor *, cred_t *);
253 void	tems_safe_copy(struct vis_conscopy *, cred_t *, enum called_from);
254 
255 void	tem_pix_align(struct tem_vt_state *, cred_t *, enum called_from);
256 void	tem_safe_check_first_time(struct tem_vt_state *tem, cred_t *,
257 	    enum called_from);
258 void	tem_safe_reset_display(struct tem_vt_state *, cred_t *,
259 	    enum called_from, boolean_t, boolean_t);
260 void	tem_safe_terminal_emulate(struct tem_vt_state *, uchar_t *, int,
261 	    cred_t *, enum called_from);
262 void	tem_safe_text_display(struct tem_vt_state *, tem_char_t *,
263 	    int, screen_pos_t, screen_pos_t,
264 	    text_color_t, text_color_t,
265 	    cred_t *, enum called_from);
266 void	tem_safe_text_copy(struct tem_vt_state *,
267 	    screen_pos_t, screen_pos_t,
268 	    screen_pos_t, screen_pos_t,
269 	    screen_pos_t, screen_pos_t,
270 	    cred_t *, enum called_from);
271 void	tem_safe_text_cursor(struct tem_vt_state *, short, cred_t *,
272 	    enum called_from);
273 void	tem_safe_text_cls(struct tem_vt_state *,
274 	    int count, screen_pos_t row, screen_pos_t col,
275 	    cred_t *credp, enum called_from called_from);
276 void	tem_safe_pix_display(struct tem_vt_state *, tem_char_t *,
277 	    int, screen_pos_t, screen_pos_t,
278 	    text_color_t, text_color_t,
279 	    cred_t *, enum called_from);
280 void	tem_safe_pix_copy(struct tem_vt_state *,
281 	    screen_pos_t, screen_pos_t,
282 	    screen_pos_t, screen_pos_t,
283 	    screen_pos_t, screen_pos_t,
284 	    cred_t *, enum called_from);
285 void	tem_safe_pix_cursor(struct tem_vt_state *, short, cred_t *,
286 	    enum called_from);
287 void	tem_safe_pix_bit2pix(struct tem_vt_state *, tem_char_t,
288 	    unsigned char, unsigned char);
289 void	tem_safe_pix_cls(struct tem_vt_state *, int, screen_pos_t, screen_pos_t,
290 	    cred_t *, enum called_from);
291 void	tem_safe_pix_cls_range(struct tem_vt_state *,
292 	    screen_pos_t, int, int,
293 	    screen_pos_t, int, int,
294 	    boolean_t, cred_t *, enum called_from);
295 
296 void	tem_safe_pix_clear_entire_screen(struct tem_vt_state *,
297 	    cred_t *, enum called_from);
298 
299 void	tem_safe_get_color(struct tem_vt_state *, text_color_t *,
300 	    text_color_t *, uint8_t);
301 
302 void	tem_safe_blank_screen(struct tem_vt_state *, cred_t *,
303 	    enum called_from);
304 void	tem_safe_unblank_screen(struct tem_vt_state *, cred_t *,
305 	    enum called_from);
306 
307 #ifdef __cplusplus
308 }
309 #endif
310 
311 #endif /* _SYS_TEM_IMPL_H */
312