Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _ALPHA_TERMIOS_H
0003 #define _ALPHA_TERMIOS_H
0004 
0005 #include <uapi/asm/termios.h>
0006 
0007 /*  eof=^D      eol=\0      eol2=\0     erase=del
0008     werase=^W   kill=^U     reprint=^R  sxtc=\0
0009     intr=^C     quit=^\     susp=^Z     <OSF/1 VDSUSP>
0010     start=^Q    stop=^S     lnext=^V    discard=^U
0011     vmin=\1     vtime=\0
0012 */
0013 #define INIT_C_CC "\004\000\000\177\027\025\022\000\003\034\032\000\021\023\026\025\001\000"
0014 
0015 /*
0016  * Translate a "termio" structure into a "termios". Ugh.
0017  */
0018 
0019 #define user_termio_to_kernel_termios(a_termios, u_termio)          \
0020 ({                                      \
0021     struct ktermios *k_termios = (a_termios);               \
0022     struct termio k_termio;                         \
0023     int canon, ret;                             \
0024                                         \
0025     ret = copy_from_user(&k_termio, u_termio, sizeof(k_termio));        \
0026     if (!ret) {                             \
0027         /* Overwrite only the low bits.  */             \
0028         *(unsigned short *)&k_termios->c_iflag = k_termio.c_iflag;  \
0029         *(unsigned short *)&k_termios->c_oflag = k_termio.c_oflag;  \
0030         *(unsigned short *)&k_termios->c_cflag = k_termio.c_cflag;  \
0031         *(unsigned short *)&k_termios->c_lflag = k_termio.c_lflag;  \
0032         canon = k_termio.c_lflag & ICANON;              \
0033                                         \
0034         k_termios->c_cc[VINTR]  = k_termio.c_cc[_VINTR];        \
0035         k_termios->c_cc[VQUIT]  = k_termio.c_cc[_VQUIT];        \
0036         k_termios->c_cc[VERASE] = k_termio.c_cc[_VERASE];       \
0037         k_termios->c_cc[VKILL]  = k_termio.c_cc[_VKILL];        \
0038         k_termios->c_cc[VEOL2]  = k_termio.c_cc[_VEOL2];        \
0039         k_termios->c_cc[VSWTC]  = k_termio.c_cc[_VSWTC];        \
0040         k_termios->c_cc[canon ? VEOF : VMIN]  = k_termio.c_cc[_VEOF];   \
0041         k_termios->c_cc[canon ? VEOL : VTIME] = k_termio.c_cc[_VEOL];   \
0042     }                                   \
0043     ret;                                    \
0044 })
0045 
0046 /*
0047  * Translate a "termios" structure into a "termio". Ugh.
0048  *
0049  * Note the "fun" _VMIN overloading.
0050  */
0051 #define kernel_termios_to_user_termio(u_termio, a_termios)      \
0052 ({                                  \
0053     struct ktermios *k_termios = (a_termios);           \
0054     struct termio k_termio;                     \
0055     int canon;                          \
0056                                     \
0057     k_termio.c_iflag = k_termios->c_iflag;              \
0058     k_termio.c_oflag = k_termios->c_oflag;              \
0059     k_termio.c_cflag = k_termios->c_cflag;              \
0060     canon = (k_termio.c_lflag = k_termios->c_lflag) & ICANON;   \
0061                                     \
0062     k_termio.c_line = k_termios->c_line;                \
0063     k_termio.c_cc[_VINTR]  = k_termios->c_cc[VINTR];        \
0064     k_termio.c_cc[_VQUIT]  = k_termios->c_cc[VQUIT];        \
0065     k_termio.c_cc[_VERASE] = k_termios->c_cc[VERASE];       \
0066     k_termio.c_cc[_VKILL]  = k_termios->c_cc[VKILL];        \
0067     k_termio.c_cc[_VEOF]   = k_termios->c_cc[canon ? VEOF : VMIN];  \
0068     k_termio.c_cc[_VEOL]   = k_termios->c_cc[canon ? VEOL : VTIME]; \
0069     k_termio.c_cc[_VEOL2]  = k_termios->c_cc[VEOL2];        \
0070     k_termio.c_cc[_VSWTC]  = k_termios->c_cc[VSWTC];        \
0071                                     \
0072     copy_to_user(u_termio, &k_termio, sizeof(k_termio));        \
0073 })
0074 
0075 #define user_termios_to_kernel_termios(k, u) \
0076     copy_from_user(k, u, sizeof(struct termios2))
0077 
0078 #define kernel_termios_to_user_termios(u, k) \
0079     copy_to_user(u, k, sizeof(struct termios2))
0080 
0081 #define user_termios_to_kernel_termios_1(k, u) \
0082     copy_from_user(k, u, sizeof(struct termios))
0083 
0084 #define kernel_termios_to_user_termios_1(u, k) \
0085     copy_to_user(u, k, sizeof(struct termios))
0086 
0087 #endif  /* _ALPHA_TERMIOS_H */