xref: /illumos-gate/usr/src/uts/common/sys/tem_impl.h (revision 627ade2ad3d27999387b31183c830a2d42c63ef5)
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 /*
33  * Copyright 2021 RackTop Systems, Inc.
34  */
35 
36 #ifndef	_SYS_TEM_IMPL_H
37 #define	_SYS_TEM_IMPL_H
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
43 #include <sys/types.h>
44 #include <sys/font.h>
45 #include <sys/rgb.h>
46 #if !defined(_BOOT)
47 #include <sys/sunddi.h>
48 #include <sys/sunldi.h>
49 #include <sys/visual_io.h>
50 #include <sys/list.h>
51 #include <sys/tem.h>
52 #include <sys/note.h>
53 #endif
54 
55 /*
56  * Definitions for ANSI x3.64 terminal control language parser.
57  * With UTF-8 support we use 32-bit value for Unicode codepoints.
58  *
59  * However, as we only need 21 bits for unicode char, we will use the
60  * rest of the bits for attributes, so we can save memory and
61  * have combined attribute+char in screen buffer. This will also allow us
62  * to keep better track about attributes and apply other optimizations.
63  *
64  * This setup will give us 11 bits for attributes (mask 0x7FF).
65  *  Bits  Meaning
66  *  0-20  char
67  * 21-31  attributes
68  *
69  * The current implementation is building the screen buffer in three parts,
70  * tvs_screen_buf is implementing the character array and the foreground
71  * and the background colors have tvs_fg_color and tvs_bg_color arrays.
72  * The character and color arrays are currently only used to restore the
73  * screen from tem switch (vt switch, or switch from Xorg session).
74  * To implement the console history, this buffering needs to be reviewed.
75  */
76 
77 #define	TEM_ATTR_MASK		0x7FF
78 #define	TEM_CHAR(c)		((c) & 0x1fffff)
79 #define	TEM_CHAR_ATTR(c)	(((c) >> 21) & TEM_ATTR_MASK)
80 #define	TEM_ATTR(c)		(((c) & TEM_ATTR_MASK) << 21)
81 #define	TEM_ATTR_ISSET(c, a)	((TEM_CHAR_ATTR(c) & (a)) == (a))
82 
83 #define	TEM_MAXPARAMS	32	/* maximum number of ANSI paramters */
84 #define	TEM_MAXFKEY	30	/* max length of function key with <ESC>Q */
85 
86 #define	TEM_SCROLL_UP		0
87 #define	TEM_SCROLL_DOWN		1
88 #define	TEM_SHIFT_LEFT		0
89 #define	TEM_SHIFT_RIGHT		1
90 
91 /* Attributes 0-0x7ff */
92 #define	TEM_ATTR_NORMAL		0x0000
93 #define	TEM_ATTR_REVERSE	0x0001
94 #define	TEM_ATTR_BOLD		0x0002
95 #define	TEM_ATTR_BLINK		0x0004
96 #define	TEM_ATTR_UNDERLINE	0x0008
97 #define	TEM_ATTR_SCREEN_REVERSE	0x0010
98 #define	TEM_ATTR_BRIGHT_FG	0x0020
99 #define	TEM_ATTR_BRIGHT_BG	0x0040
100 #define	TEM_ATTR_TRANSPARENT	0x0080
101 #define	TEM_ATTR_IMAGE		0x0100
102 #define	TEM_ATTR_RGB_FG		0x0200
103 #define	TEM_ATTR_RGB_BG		0x0400
104 
105 #define	ANSI_COLOR_BLACK	0
106 #define	ANSI_COLOR_RED		1
107 #define	ANSI_COLOR_GREEN	2
108 #define	ANSI_COLOR_BROWN	3
109 #define	ANSI_COLOR_BLUE		4
110 #define	ANSI_COLOR_MAGENTA	5
111 #define	ANSI_COLOR_CYAN		6
112 #define	ANSI_COLOR_WHITE	7
113 
114 #define	TEM_TEXT_WHITE		0
115 #define	TEM_TEXT_BLACK		1
116 #define	TEM_TEXT_BLACK24_RED	0x00
117 #define	TEM_TEXT_BLACK24_GREEN	0x00
118 #define	TEM_TEXT_BLACK24_BLUE	0x00
119 #define	TEM_TEXT_WHITE24_RED	0xff
120 #define	TEM_TEXT_WHITE24_GREEN	0xff
121 #define	TEM_TEXT_WHITE24_BLUE	0xff
122 
123 #define	A_STATE_START			0
124 #define	A_STATE_ESC			1
125 #define	A_STATE_CSI			2
126 #define	A_STATE_CSI_QMARK		3
127 #define	A_STATE_CSI_EQUAL		4
128 
129 /*
130  * Default number of rows and columns
131  */
132 #ifdef _HAVE_TEM_FIRMWARE
133 #define	TEM_DEFAULT_ROWS	34
134 #define	TEM_DEFAULT_COLS	80
135 #else
136 #define	TEM_DEFAULT_ROWS	25
137 #define	TEM_DEFAULT_COLS	80
138 #endif
139 
140 /*
141  * Default foreground/background color
142  */
143 
144 #define	DEFAULT_ANSI_FOREGROUND	ANSI_COLOR_BLACK
145 #define	DEFAULT_ANSI_BACKGROUND	ANSI_COLOR_WHITE
146 
147 typedef uint32_t tem_char_t;	/* 32bit char to support UTF-8 */
148 typedef union {
149 	uint32_t n;
150 	struct bgra {
151 		uint8_t b;
152 		uint8_t g;
153 		uint8_t r;
154 		uint8_t a;
155 	} rgb;
156 } text_color_t;
157 typedef uint16_t text_attr_t;
158 
159 #if !defined(_BOOT)
160 typedef struct tem_color {
161 	text_color_t	fg_color;
162 	text_color_t	bg_color;
163 	text_attr_t	a_flags;
164 } tem_color_t;
165 
166 enum called_from { CALLED_FROM_NORMAL, CALLED_FROM_STANDALONE };
167 
168 struct tem_pix_pos {
169 	screen_pos_t	x;
170 	screen_pos_t	y;
171 };
172 
173 struct tem_char_pos {
174 	screen_pos_t	col;
175 	screen_pos_t	row;
176 };
177 
178 struct tem_size {
179 	screen_size_t	width;
180 	screen_size_t	height;
181 };
182 
183 /* Combined color and 32bit tem char */
184 typedef struct term_char {
185 	text_color_t	tc_fg_color;
186 	text_color_t	tc_bg_color;
187 	tem_char_t	tc_char;
188 } term_char_t;
189 
190 /*
191  * Values for tvs_stateflags.
192  */
193 #define	TVS_AUTOWRAP	0x00000001	/* autowrap is on by default */
194 #define	TVS_WRAPPED	0x00000002	/* line wrap in progress */
195 
196 /*
197  * State structure for each virtual terminal emulator
198  */
199 struct tem_vt_state {
200 	queue_t		*tvs_queue;	/* read queue for console */
201 	kmutex_t	tvs_lock;
202 	uchar_t		tvs_fbmode;	/* framebuffer mode */
203 	uchar_t		tvs_alpha;	/* rgb alpha channel */
204 	text_attr_t	tvs_flags;	/* flags for this x3.64 terminal */
205 	int		tvs_state;	/* state in output esc seq processing */
206 	uint_t		tvs_stateflags;	/* state of some features */
207 	boolean_t	tvs_gotparam;	/* does output esc seq have a param */
208 
209 	int	tvs_curparam;	/* current param # of output esc seq */
210 	int	tvs_paramval;	/* value of current param */
211 	int	tvs_params[TEM_MAXPARAMS];  /* parameters of output esc seq */
212 	screen_pos_t	*tvs_tabs;	/* tab stops */
213 	size_t	tvs_maxtab;		/* maximum number of tab stops */
214 	size_t	tvs_ntabs;		/* number of tabs used */
215 	int	tvs_nscroll;		/* number of lines to scroll */
216 
217 	struct tem_char_pos tvs_s_cursor;	/* start cursor position */
218 	struct tem_char_pos tvs_c_cursor;	/* current cursor position */
219 	struct tem_char_pos tvs_r_cursor;	/* remembered cursor position */
220 
221 	term_char_t	*tvs_outbuf;	/* place to keep incomplete lines */
222 	size_t		tvs_outbuf_size;
223 	size_t		tvs_outindex;	/* index into a_outbuf */
224 	void		*tvs_pix_data;	/* pointer to tmp bitmap area */
225 	size_t		tvs_pix_data_size;
226 
227 	text_color_t	tvs_fg_color;	/* console foreground */
228 	text_color_t	tvs_bg_color;	/* console background */
229 
230 	int		tvs_first_line;	/* kernel console output begins */
231 
232 	term_char_t	*tvs_screen_buf;	/* whole screen buffer */
233 	term_char_t	**tvs_screen_rows;	/* screen buffer rows */
234 	size_t		tvs_screen_buf_size;
235 	size_t		tvs_screen_history_size;
236 
237 	unsigned	tvs_utf8_left;		/* UTF-8 code points */
238 	tem_char_t	tvs_utf8_partial;	/* UTF-8 char being completed */
239 
240 	boolean_t	tvs_isactive;
241 	boolean_t	tvs_initialized;	/* initialization flag */
242 	boolean_t	tvs_cursor_hidden;
243 
244 	list_node_t	tvs_list_node;
245 };
246 _NOTE(MUTEX_PROTECTS_DATA(tem_vt_state::tvs_lock, tem_vt_state))
247 
248 typedef struct tem_safe_callbacks {
249 	void (*tsc_display)(struct tem_vt_state *, term_char_t *, int,
250 	    screen_pos_t, screen_pos_t, cred_t *, enum called_from);
251 	void (*tsc_copy)(struct tem_vt_state *,
252 	    screen_pos_t, screen_pos_t, screen_pos_t, screen_pos_t,
253 	    screen_pos_t, screen_pos_t, cred_t *, enum called_from);
254 	void (*tsc_cursor)(struct tem_vt_state *, short, cred_t *,
255 	    enum called_from);
256 	void (*tsc_bit2pix)(struct tem_vt_state *, term_char_t *);
257 	void (*tsc_cls)(struct tem_vt_state *, int,
258 	    screen_pos_t, screen_pos_t, cred_t *, enum called_from);
259 } tem_safe_callbacks_t;
260 
261 /*
262  * common term soft state structure shared by all virtual terminal emulators
263  */
264 typedef struct tem_state {
265 	ldi_handle_t	ts_hdl;	/* Framework handle for layered on dev */
266 	screen_size_t	ts_linebytes;	/* Layered on bytes per scan line */
267 
268 	int	ts_display_mode;	/* What mode we are in */
269 	struct	vis_polledio	*ts_fb_polledio;
270 
271 	struct tem_size ts_c_dimension;	/* window dimensions in characters */
272 	struct tem_size ts_p_dimension;	/* screen dimensions in pixels */
273 	struct tem_pix_pos ts_p_offset;	/* pix offset to center the display */
274 
275 	int	ts_pix_data_size;	/* size of bitmap data areas */
276 	int	ts_pdepth;		/* pixel depth */
277 	struct font	ts_font;	/* font table */
278 
279 	term_char_t	*ts_blank_line;	/* a blank line for scrolling */
280 	tem_safe_callbacks_t	*ts_callbacks;	/* internal output functions */
281 
282 	int	ts_initialized;		/* initialization flag */
283 
284 	tem_modechg_cb_t	ts_modechg_cb;
285 	tem_modechg_cb_arg_t	ts_modechg_arg;
286 
287 	color_map_fn_t	ts_color_map;
288 
289 	tem_color_t	ts_init_color; /* initial color and attributes */
290 
291 	struct tem_vt_state	*ts_active;
292 	kmutex_t	ts_lock;
293 	list_t		ts_list;	/* chain of all tems */
294 } tem_state_t;
295 
296 extern tem_state_t tems;
297 extern tem_safe_callbacks_t tem_safe_text_callbacks;
298 extern tem_safe_callbacks_t tem_safe_pix_callbacks;
299 
300 
301 /*
302  * tems_* fuctions mean that they just operate on the common soft state
303  * (tem_state_t), and tem_* functions mean that they operate on the
304  * per-tem structure (tem_vt_state). All "safe" interfaces are in tem_safe.c.
305  */
306 int	tems_cls_layered(struct vis_consclear *, cred_t *);
307 void	tems_display_layered(struct vis_consdisplay *, cred_t *);
308 void	tems_copy_layered(struct vis_conscopy *, cred_t *);
309 void	tems_cursor_layered(struct vis_conscursor *, cred_t *);
310 void	tems_safe_copy(struct vis_conscopy *, cred_t *, enum called_from);
311 
312 void	tem_align(struct tem_vt_state *, cred_t *, enum called_from);
313 void	tem_safe_check_first_time(struct tem_vt_state *tem, cred_t *,
314 	    enum called_from);
315 void	tem_safe_reset_display(struct tem_vt_state *, cred_t *,
316 	    enum called_from, boolean_t, boolean_t);
317 void	tem_safe_terminal_emulate(struct tem_vt_state *, uchar_t *, int,
318 	    cred_t *, enum called_from);
319 void	tem_safe_text_display(struct tem_vt_state *, term_char_t *,
320 	    int, screen_pos_t, screen_pos_t, cred_t *, enum called_from);
321 void	tem_safe_text_copy(struct tem_vt_state *,
322 	    screen_pos_t, screen_pos_t,
323 	    screen_pos_t, screen_pos_t,
324 	    screen_pos_t, screen_pos_t,
325 	    cred_t *, enum called_from);
326 void	tem_safe_text_cursor(struct tem_vt_state *, short, cred_t *,
327 	    enum called_from);
328 void	tem_safe_text_cls(struct tem_vt_state *,
329 	    int count, screen_pos_t row, screen_pos_t col,
330 	    cred_t *credp, enum called_from called_from);
331 void	tem_safe_pix_display(struct tem_vt_state *, term_char_t *,
332 	    int, screen_pos_t, screen_pos_t, cred_t *, enum called_from);
333 void	tem_safe_pix_copy(struct tem_vt_state *,
334 	    screen_pos_t, screen_pos_t,
335 	    screen_pos_t, screen_pos_t,
336 	    screen_pos_t, screen_pos_t,
337 	    cred_t *, enum called_from);
338 void	tem_safe_pix_cursor(struct tem_vt_state *, short, cred_t *,
339 	    enum called_from);
340 void	tem_safe_pix_bit2pix(struct tem_vt_state *, term_char_t *);
341 void	tem_safe_pix_cls(struct tem_vt_state *, int, screen_pos_t, screen_pos_t,
342 	    cred_t *, enum called_from);
343 void	tem_safe_pix_cls_range(struct tem_vt_state *,
344 	    screen_pos_t, int, int,
345 	    screen_pos_t, int, int,
346 	    boolean_t, cred_t *, enum called_from);
347 
348 void	tem_safe_pix_clear_entire_screen(struct tem_vt_state *,
349 	    cred_t *, enum called_from);
350 
351 void	tem_safe_get_attr(struct tem_vt_state *, text_color_t *,
352 	    text_color_t *, text_attr_t *, uint8_t);
353 
354 void	tem_safe_blank_screen(struct tem_vt_state *, cred_t *,
355 	    enum called_from);
356 void	tem_safe_unblank_screen(struct tem_vt_state *, cred_t *,
357 	    enum called_from);
358 #endif	/* _BOOT */
359 
360 #ifdef __cplusplus
361 }
362 #endif
363 
364 #endif /* _SYS_TEM_IMPL_H */
365