1 #ifndef _ALPHA_TERMIOS_H
2 #define _ALPHA_TERMIOS_H
3 
4 #include <asm/ioctls.h>
5 #include <asm/termbits.h>
6 
7 struct sgttyb {
8 	char	sg_ispeed;
9 	char	sg_ospeed;
10 	char	sg_erase;
11 	char	sg_kill;
12 	short	sg_flags;
13 };
14 
15 struct tchars {
16 	char	t_intrc;
17 	char	t_quitc;
18 	char	t_startc;
19 	char	t_stopc;
20 	char	t_eofc;
21 	char	t_brkc;
22 };
23 
24 struct ltchars {
25 	char	t_suspc;
26 	char	t_dsuspc;
27 	char	t_rprntc;
28 	char	t_flushc;
29 	char	t_werasc;
30 	char	t_lnextc;
31 };
32 
33 struct winsize {
34 	unsigned short ws_row;
35 	unsigned short ws_col;
36 	unsigned short ws_xpixel;
37 	unsigned short ws_ypixel;
38 };
39 
40 #define NCC 8
41 struct termio {
42 	unsigned short c_iflag;		/* input mode flags */
43 	unsigned short c_oflag;		/* output mode flags */
44 	unsigned short c_cflag;		/* control mode flags */
45 	unsigned short c_lflag;		/* local mode flags */
46 	unsigned char c_line;		/* line discipline */
47 	unsigned char c_cc[NCC];	/* control characters */
48 };
49 
50 /*
51  * c_cc characters in the termio structure.  Oh, how I love being
52  * backwardly compatible.  Notice that character 4 and 5 are
53  * interpreted differently depending on whether ICANON is set in
54  * c_lflag.  If it's set, they are used as _VEOF and _VEOL, otherwise
55  * as _VMIN and V_TIME.  This is for compatibility with OSF/1 (which
56  * is compatible with sysV)...
57  */
58 #define _VINTR	0
59 #define _VQUIT	1
60 #define _VERASE	2
61 #define _VKILL	3
62 #define _VEOF	4
63 #define _VMIN	4
64 #define _VEOL	5
65 #define _VTIME	5
66 #define _VEOL2	6
67 #define _VSWTC	7
68 
69 #ifdef __KERNEL__
70 /*	eof=^D		eol=\0		eol2=\0		erase=del
71 	werase=^W	kill=^U		reprint=^R	sxtc=\0
72 	intr=^C		quit=^\		susp=^Z		<OSF/1 VDSUSP>
73 	start=^Q	stop=^S		lnext=^V	discard=^U
74 	vmin=\1		vtime=\0
75 */
76 #define INIT_C_CC "\004\000\000\177\027\025\022\000\003\034\032\000\021\023\026\025\001\000"
77 
78 /*
79  * Translate a "termio" structure into a "termios". Ugh.
80  */
81 
82 #define user_termio_to_kernel_termios(a_termios, u_termio)			\
83 ({										\
84 	struct ktermios *k_termios = (a_termios);				\
85 	struct termio k_termio;							\
86 	int canon, ret;								\
87 										\
88 	ret = copy_from_user(&k_termio, u_termio, sizeof(k_termio));		\
89 	if (!ret) {								\
90 		/* Overwrite only the low bits.  */				\
91 		*(unsigned short *)&k_termios->c_iflag = k_termio.c_iflag;	\
92 		*(unsigned short *)&k_termios->c_oflag = k_termio.c_oflag;	\
93 		*(unsigned short *)&k_termios->c_cflag = k_termio.c_cflag;	\
94 		*(unsigned short *)&k_termios->c_lflag = k_termio.c_lflag;	\
95 		canon = k_termio.c_lflag & ICANON;				\
96 										\
97 		k_termios->c_cc[VINTR]  = k_termio.c_cc[_VINTR];		\
98 		k_termios->c_cc[VQUIT]  = k_termio.c_cc[_VQUIT];		\
99 		k_termios->c_cc[VERASE] = k_termio.c_cc[_VERASE];		\
100 		k_termios->c_cc[VKILL]  = k_termio.c_cc[_VKILL];		\
101 		k_termios->c_cc[VEOL2]  = k_termio.c_cc[_VEOL2];		\
102 		k_termios->c_cc[VSWTC]  = k_termio.c_cc[_VSWTC];		\
103 		k_termios->c_cc[canon ? VEOF : VMIN]  = k_termio.c_cc[_VEOF];	\
104 		k_termios->c_cc[canon ? VEOL : VTIME] = k_termio.c_cc[_VEOL];	\
105 	}									\
106 	ret;									\
107 })
108 
109 /*
110  * Translate a "termios" structure into a "termio". Ugh.
111  *
112  * Note the "fun" _VMIN overloading.
113  */
114 #define kernel_termios_to_user_termio(u_termio, a_termios)		\
115 ({									\
116 	struct ktermios *k_termios = (a_termios);			\
117 	struct termio k_termio;						\
118 	int canon;							\
119 									\
120 	k_termio.c_iflag = k_termios->c_iflag;				\
121 	k_termio.c_oflag = k_termios->c_oflag;				\
122 	k_termio.c_cflag = k_termios->c_cflag;				\
123 	canon = (k_termio.c_lflag = k_termios->c_lflag) & ICANON;	\
124 									\
125 	k_termio.c_line = k_termios->c_line;				\
126 	k_termio.c_cc[_VINTR]  = k_termios->c_cc[VINTR];		\
127 	k_termio.c_cc[_VQUIT]  = k_termios->c_cc[VQUIT];		\
128 	k_termio.c_cc[_VERASE] = k_termios->c_cc[VERASE];		\
129 	k_termio.c_cc[_VKILL]  = k_termios->c_cc[VKILL];		\
130 	k_termio.c_cc[_VEOF]   = k_termios->c_cc[canon ? VEOF : VMIN];	\
131 	k_termio.c_cc[_VEOL]   = k_termios->c_cc[canon ? VEOL : VTIME];	\
132 	k_termio.c_cc[_VEOL2]  = k_termios->c_cc[VEOL2];		\
133 	k_termio.c_cc[_VSWTC]  = k_termios->c_cc[VSWTC];		\
134 									\
135 	copy_to_user(u_termio, &k_termio, sizeof(k_termio));		\
136 })
137 
138 #define user_termios_to_kernel_termios(k, u) \
139 	copy_from_user(k, u, sizeof(struct termios))
140 
141 #define kernel_termios_to_user_termios(u, k) \
142 	copy_to_user(u, k, sizeof(struct termios))
143 
144 #endif	/* __KERNEL__ */
145 
146 #endif	/* _ALPHA_TERMIOS_H */
147