Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek...
[sfrench/cifs-2.6.git] / arch / alpha / include / asm / termios.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ALPHA_TERMIOS_H
3 #define _ALPHA_TERMIOS_H
4
5 #include <uapi/asm/termios.h>
6
7 /*      eof=^D          eol=\0          eol2=\0         erase=del
8         werase=^W       kill=^U         reprint=^R      sxtc=\0
9         intr=^C         quit=^\         susp=^Z         <OSF/1 VDSUSP>
10         start=^Q        stop=^S         lnext=^V        discard=^U
11         vmin=\1         vtime=\0
12 */
13 #define INIT_C_CC "\004\000\000\177\027\025\022\000\003\034\032\000\021\023\026\025\001\000"
14
15 /*
16  * Translate a "termio" structure into a "termios". Ugh.
17  */
18
19 #define user_termio_to_kernel_termios(a_termios, u_termio)                      \
20 ({                                                                              \
21         struct ktermios *k_termios = (a_termios);                               \
22         struct termio k_termio;                                                 \
23         int canon, ret;                                                         \
24                                                                                 \
25         ret = copy_from_user(&k_termio, u_termio, sizeof(k_termio));            \
26         if (!ret) {                                                             \
27                 /* Overwrite only the low bits.  */                             \
28                 *(unsigned short *)&k_termios->c_iflag = k_termio.c_iflag;      \
29                 *(unsigned short *)&k_termios->c_oflag = k_termio.c_oflag;      \
30                 *(unsigned short *)&k_termios->c_cflag = k_termio.c_cflag;      \
31                 *(unsigned short *)&k_termios->c_lflag = k_termio.c_lflag;      \
32                 canon = k_termio.c_lflag & ICANON;                              \
33                                                                                 \
34                 k_termios->c_cc[VINTR]  = k_termio.c_cc[_VINTR];                \
35                 k_termios->c_cc[VQUIT]  = k_termio.c_cc[_VQUIT];                \
36                 k_termios->c_cc[VERASE] = k_termio.c_cc[_VERASE];               \
37                 k_termios->c_cc[VKILL]  = k_termio.c_cc[_VKILL];                \
38                 k_termios->c_cc[VEOL2]  = k_termio.c_cc[_VEOL2];                \
39                 k_termios->c_cc[VSWTC]  = k_termio.c_cc[_VSWTC];                \
40                 k_termios->c_cc[canon ? VEOF : VMIN]  = k_termio.c_cc[_VEOF];   \
41                 k_termios->c_cc[canon ? VEOL : VTIME] = k_termio.c_cc[_VEOL];   \
42         }                                                                       \
43         ret;                                                                    \
44 })
45
46 /*
47  * Translate a "termios" structure into a "termio". Ugh.
48  *
49  * Note the "fun" _VMIN overloading.
50  */
51 #define kernel_termios_to_user_termio(u_termio, a_termios)              \
52 ({                                                                      \
53         struct ktermios *k_termios = (a_termios);                       \
54         struct termio k_termio;                                         \
55         int canon;                                                      \
56                                                                         \
57         k_termio.c_iflag = k_termios->c_iflag;                          \
58         k_termio.c_oflag = k_termios->c_oflag;                          \
59         k_termio.c_cflag = k_termios->c_cflag;                          \
60         canon = (k_termio.c_lflag = k_termios->c_lflag) & ICANON;       \
61                                                                         \
62         k_termio.c_line = k_termios->c_line;                            \
63         k_termio.c_cc[_VINTR]  = k_termios->c_cc[VINTR];                \
64         k_termio.c_cc[_VQUIT]  = k_termios->c_cc[VQUIT];                \
65         k_termio.c_cc[_VERASE] = k_termios->c_cc[VERASE];               \
66         k_termio.c_cc[_VKILL]  = k_termios->c_cc[VKILL];                \
67         k_termio.c_cc[_VEOF]   = k_termios->c_cc[canon ? VEOF : VMIN];  \
68         k_termio.c_cc[_VEOL]   = k_termios->c_cc[canon ? VEOL : VTIME]; \
69         k_termio.c_cc[_VEOL2]  = k_termios->c_cc[VEOL2];                \
70         k_termio.c_cc[_VSWTC]  = k_termios->c_cc[VSWTC];                \
71                                                                         \
72         copy_to_user(u_termio, &k_termio, sizeof(k_termio));            \
73 })
74
75 #define user_termios_to_kernel_termios(k, u) \
76         copy_from_user(k, u, sizeof(struct termios))
77
78 #define kernel_termios_to_user_termios(u, k) \
79         copy_to_user(u, k, sizeof(struct termios))
80
81 #endif  /* _ALPHA_TERMIOS_H */