1 #ifndef _ASM_GENERIC_TERMIOS_H
2 #define _ASM_GENERIC_TERMIOS_H
3 /*
4  * Most architectures have straight copies of the x86 code, with
5  * varying levels of bug fixes on top. Usually it's a good idea
6  * to use this generic version instead, but be careful to avoid
7  * ABI changes.
8  * New architectures should not provide their own version.
9  */
10 
11 #include <asm/termbits.h>
12 #include <asm/ioctls.h>
13 
14 struct winsize {
15 	unsigned short ws_row;
16 	unsigned short ws_col;
17 	unsigned short ws_xpixel;
18 	unsigned short ws_ypixel;
19 };
20 
21 #define NCC 8
22 struct termio {
23 	unsigned short c_iflag;		/* input mode flags */
24 	unsigned short c_oflag;		/* output mode flags */
25 	unsigned short c_cflag;		/* control mode flags */
26 	unsigned short c_lflag;		/* local mode flags */
27 	unsigned char c_line;		/* line discipline */
28 	unsigned char c_cc[NCC];	/* control characters */
29 };
30 
31 /* modem lines */
32 #define TIOCM_LE	0x001
33 #define TIOCM_DTR	0x002
34 #define TIOCM_RTS	0x004
35 #define TIOCM_ST	0x008
36 #define TIOCM_SR	0x010
37 #define TIOCM_CTS	0x020
38 #define TIOCM_CAR	0x040
39 #define TIOCM_RNG	0x080
40 #define TIOCM_DSR	0x100
41 #define TIOCM_CD	TIOCM_CAR
42 #define TIOCM_RI	TIOCM_RNG
43 #define TIOCM_OUT1	0x2000
44 #define TIOCM_OUT2	0x4000
45 #define TIOCM_LOOP	0x8000
46 
47 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
48 
49 #ifdef __KERNEL__
50 
51 #include <asm/uaccess.h>
52 
53 /*	intr=^C		quit=^\		erase=del	kill=^U
54 	eof=^D		vtime=\0	vmin=\1		sxtc=\0
55 	start=^Q	stop=^S		susp=^Z		eol=\0
56 	reprint=^R	discard=^U	werase=^W	lnext=^V
57 	eol2=\0
58 */
59 #define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
60 
61 /*
62  * Translate a "termio" structure into a "termios". Ugh.
63  */
user_termio_to_kernel_termios(struct ktermios * termios,const struct termio __user * termio)64 static inline int user_termio_to_kernel_termios(struct ktermios *termios,
65 						const struct termio __user *termio)
66 {
67 	unsigned short tmp;
68 
69 	if (get_user(tmp, &termio->c_iflag) < 0)
70 		goto fault;
71 	termios->c_iflag = (0xffff0000 & termios->c_iflag) | tmp;
72 
73 	if (get_user(tmp, &termio->c_oflag) < 0)
74 		goto fault;
75 	termios->c_oflag = (0xffff0000 & termios->c_oflag) | tmp;
76 
77 	if (get_user(tmp, &termio->c_cflag) < 0)
78 		goto fault;
79 	termios->c_cflag = (0xffff0000 & termios->c_cflag) | tmp;
80 
81 	if (get_user(tmp, &termio->c_lflag) < 0)
82 		goto fault;
83 	termios->c_lflag = (0xffff0000 & termios->c_lflag) | tmp;
84 
85 	if (get_user(termios->c_line, &termio->c_line) < 0)
86 		goto fault;
87 
88 	if (copy_from_user(termios->c_cc, termio->c_cc, NCC) != 0)
89 		goto fault;
90 
91 	return 0;
92 
93  fault:
94 	return -EFAULT;
95 }
96 
97 /*
98  * Translate a "termios" structure into a "termio". Ugh.
99  */
kernel_termios_to_user_termio(struct termio __user * termio,struct ktermios * termios)100 static inline int kernel_termios_to_user_termio(struct termio __user *termio,
101 						struct ktermios *termios)
102 {
103 	if (put_user(termios->c_iflag, &termio->c_iflag) < 0 ||
104 	    put_user(termios->c_oflag, &termio->c_oflag) < 0 ||
105 	    put_user(termios->c_cflag, &termio->c_cflag) < 0 ||
106 	    put_user(termios->c_lflag, &termio->c_lflag) < 0 ||
107 	    put_user(termios->c_line,  &termio->c_line) < 0 ||
108 	    copy_to_user(termio->c_cc, termios->c_cc, NCC) != 0)
109 		return -EFAULT;
110 
111 	return 0;
112 }
113 
114 #ifdef TCGETS2
user_termios_to_kernel_termios(struct ktermios * k,struct termios2 __user * u)115 static inline int user_termios_to_kernel_termios(struct ktermios *k,
116 						 struct termios2 __user *u)
117 {
118 	return copy_from_user(k, u, sizeof(struct termios2));
119 }
120 
kernel_termios_to_user_termios(struct termios2 __user * u,struct ktermios * k)121 static inline int kernel_termios_to_user_termios(struct termios2 __user *u,
122 						 struct ktermios *k)
123 {
124 	return copy_to_user(u, k, sizeof(struct termios2));
125 }
126 
user_termios_to_kernel_termios_1(struct ktermios * k,struct termios __user * u)127 static inline int user_termios_to_kernel_termios_1(struct ktermios *k,
128 						   struct termios __user *u)
129 {
130 	return copy_from_user(k, u, sizeof(struct termios));
131 }
132 
kernel_termios_to_user_termios_1(struct termios __user * u,struct ktermios * k)133 static inline int kernel_termios_to_user_termios_1(struct termios __user *u,
134 						   struct ktermios *k)
135 {
136 	return copy_to_user(u, k, sizeof(struct termios));
137 }
138 #else /* TCGETS2 */
user_termios_to_kernel_termios(struct ktermios * k,struct termios __user * u)139 static inline int user_termios_to_kernel_termios(struct ktermios *k,
140 						 struct termios __user *u)
141 {
142 	return copy_from_user(k, u, sizeof(struct termios));
143 }
144 
kernel_termios_to_user_termios(struct termios __user * u,struct ktermios * k)145 static inline int kernel_termios_to_user_termios(struct termios __user *u,
146 						 struct ktermios *k)
147 {
148 	return copy_to_user(u, k, sizeof(struct termios));
149 }
150 #endif /* TCGETS2 */
151 
152 #endif	/* __KERNEL__ */
153 
154 #endif /* _ASM_GENERIC_TERMIOS_H */
155