Branch data Line data Source code
1 : : #ifndef _ASM_GENERIC_TERMIOS_H
2 : : #define _ASM_GENERIC_TERMIOS_H
3 : :
4 : :
5 : : #include <asm/uaccess.h>
6 : : #include <uapi/asm-generic/termios.h>
7 : :
8 : : /* intr=^C quit=^\ erase=del kill=^U
9 : : eof=^D vtime=\0 vmin=\1 sxtc=\0
10 : : start=^Q stop=^S susp=^Z eol=\0
11 : : reprint=^R discard=^U werase=^W lnext=^V
12 : : eol2=\0
13 : : */
14 : : #define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
15 : :
16 : : /*
17 : : * Translate a "termio" structure into a "termios". Ugh.
18 : : */
19 : : static inline int user_termio_to_kernel_termios(struct ktermios *termios,
20 : : const struct termio __user *termio)
21 : : {
22 : : unsigned short tmp;
23 : :
24 [ + - ]: 131 : if (get_user(tmp, &termio->c_iflag) < 0)
25 : : goto fault;
26 : 131 : termios->c_iflag = (0xffff0000 & termios->c_iflag) | tmp;
27 : :
28 [ + - ]: 131 : if (get_user(tmp, &termio->c_oflag) < 0)
29 : : goto fault;
30 : 131 : termios->c_oflag = (0xffff0000 & termios->c_oflag) | tmp;
31 : :
32 [ + - ]: 131 : if (get_user(tmp, &termio->c_cflag) < 0)
33 : : goto fault;
34 : 131 : termios->c_cflag = (0xffff0000 & termios->c_cflag) | tmp;
35 : :
36 [ + - ]: 131 : if (get_user(tmp, &termio->c_lflag) < 0)
37 : : goto fault;
38 : 131 : termios->c_lflag = (0xffff0000 & termios->c_lflag) | tmp;
39 : :
40 [ + - ]: 131 : if (get_user(termios->c_line, &termio->c_line) < 0)
41 : : goto fault;
42 : :
43 [ - + ]: 131 : if (copy_from_user(termios->c_cc, termio->c_cc, NCC) != 0)
44 : : goto fault;
45 : :
46 : : return 0;
47 : :
48 : : fault:
49 : : return -EFAULT;
50 : : }
51 : :
52 : : /*
53 : : * Translate a "termios" structure into a "termio". Ugh.
54 : : */
55 : : static inline int kernel_termios_to_user_termio(struct termio __user *termio,
56 : : struct ktermios *termios)
57 : : {
58 [ + + + - ]: 386 : if (put_user(termios->c_iflag, &termio->c_iflag) < 0 ||
59 [ + - ]: 258 : put_user(termios->c_oflag, &termio->c_oflag) < 0 ||
60 [ + - ]: 258 : put_user(termios->c_cflag, &termio->c_cflag) < 0 ||
61 [ + - ]: 258 : put_user(termios->c_lflag, &termio->c_lflag) < 0 ||
62 [ - + ]: 515 : put_user(termios->c_line, &termio->c_line) < 0 ||
63 : 129 : copy_to_user(termio->c_cc, termios->c_cc, NCC) != 0)
64 : : return -EFAULT;
65 : :
66 : : return 0;
67 : : }
68 : :
69 : : #ifdef TCGETS2
70 : : static inline int user_termios_to_kernel_termios(struct ktermios *k,
71 : : struct termios2 __user *u)
72 : : {
73 : : return copy_from_user(k, u, sizeof(struct termios2));
74 : : }
75 : :
76 : : static inline int kernel_termios_to_user_termios(struct termios2 __user *u,
77 : : struct ktermios *k)
78 : : {
79 : : return copy_to_user(u, k, sizeof(struct termios2));
80 : : }
81 : :
82 : : static inline int user_termios_to_kernel_termios_1(struct ktermios *k,
83 : : struct termios __user *u)
84 : : {
85 : : return copy_from_user(k, u, sizeof(struct termios));
86 : : }
87 : :
88 : : static inline int kernel_termios_to_user_termios_1(struct termios __user *u,
89 : : struct ktermios *k)
90 : : {
91 : : return copy_to_user(u, k, sizeof(struct termios));
92 : : }
93 : : #else /* TCGETS2 */
94 : : static inline int user_termios_to_kernel_termios(struct ktermios *k,
95 : : struct termios __user *u)
96 : : {
97 : : return copy_from_user(k, u, sizeof(struct termios));
98 : : }
99 : :
100 : : static inline int kernel_termios_to_user_termios(struct termios __user *u,
101 : : struct ktermios *k)
102 : : {
103 : : return copy_to_user(u, k, sizeof(struct termios));
104 : : }
105 : : #endif /* TCGETS2 */
106 : :
107 : : #endif /* _ASM_GENERIC_TERMIOS_H */
|