Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _SPARC_TERMIOS_H
0003 #define _SPARC_TERMIOS_H
0004 
0005 #include <uapi/asm/termios.h>
0006 
0007 
0008 /*
0009  * c_cc characters in the termio structure.  Oh, how I love being
0010  * backwardly compatible.  Notice that character 4 and 5 are
0011  * interpreted differently depending on whether ICANON is set in
0012  * c_lflag.  If it's set, they are used as _VEOF and _VEOL, otherwise
0013  * as _VMIN and V_TIME.  This is for compatibility with OSF/1 (which
0014  * is compatible with sysV)...
0015  */
0016 #define _VMIN   4
0017 #define _VTIME  5
0018 
0019 /*  intr=^C     quit=^\     erase=del   kill=^U
0020     eof=^D      eol=\0      eol2=\0     sxtc=\0
0021     start=^Q    stop=^S     susp=^Z     dsusp=^Y
0022     reprint=^R  discard=^U  werase=^W   lnext=^V
0023     vmin=\1         vtime=\0
0024 */
0025 #define INIT_C_CC "\003\034\177\025\004\000\000\000\021\023\032\031\022\025\027\026\001"
0026 
0027 /*
0028  * Translate a "termio" structure into a "termios". Ugh.
0029  */
0030 #define user_termio_to_kernel_termios(termios, termio) \
0031 ({ \
0032     unsigned short tmp; \
0033     int err; \
0034     err = get_user(tmp, &(termio)->c_iflag); \
0035     (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \
0036     err |= get_user(tmp, &(termio)->c_oflag); \
0037     (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \
0038     err |= get_user(tmp, &(termio)->c_cflag); \
0039     (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \
0040     err |= get_user(tmp, &(termio)->c_lflag); \
0041     (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \
0042     err |= copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
0043     err; \
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(termio, termios) \
0052 ({ \
0053     int err; \
0054     err  = put_user((termios)->c_iflag, &(termio)->c_iflag); \
0055     err |= put_user((termios)->c_oflag, &(termio)->c_oflag); \
0056     err |= put_user((termios)->c_cflag, &(termio)->c_cflag); \
0057     err |= put_user((termios)->c_lflag, &(termio)->c_lflag); \
0058     err |= put_user((termios)->c_line,  &(termio)->c_line); \
0059     err |= copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
0060     if (!((termios)->c_lflag & ICANON)) { \
0061         err |= put_user((termios)->c_cc[VMIN], &(termio)->c_cc[_VMIN]); \
0062         err |= put_user((termios)->c_cc[VTIME], &(termio)->c_cc[_VTIME]); \
0063     } \
0064     err; \
0065 })
0066 
0067 #define user_termios_to_kernel_termios(k, u) \
0068 ({ \
0069     int err; \
0070     err  = get_user((k)->c_iflag, &(u)->c_iflag); \
0071     err |= get_user((k)->c_oflag, &(u)->c_oflag); \
0072     err |= get_user((k)->c_cflag, &(u)->c_cflag); \
0073     err |= get_user((k)->c_lflag, &(u)->c_lflag); \
0074     err |= get_user((k)->c_line,  &(u)->c_line); \
0075     err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
0076     if ((k)->c_lflag & ICANON) { \
0077         err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
0078         err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
0079     } else { \
0080         err |= get_user((k)->c_cc[VMIN],  &(u)->c_cc[_VMIN]); \
0081         err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
0082     } \
0083     err |= get_user((k)->c_ispeed,  &(u)->c_ispeed); \
0084     err |= get_user((k)->c_ospeed,  &(u)->c_ospeed); \
0085     err; \
0086 })
0087 
0088 #define kernel_termios_to_user_termios(u, k) \
0089 ({ \
0090     int err; \
0091     err  = put_user((k)->c_iflag, &(u)->c_iflag); \
0092     err |= put_user((k)->c_oflag, &(u)->c_oflag); \
0093     err |= put_user((k)->c_cflag, &(u)->c_cflag); \
0094     err |= put_user((k)->c_lflag, &(u)->c_lflag); \
0095     err |= put_user((k)->c_line, &(u)->c_line); \
0096     err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
0097     if (!((k)->c_lflag & ICANON)) { \
0098         err |= put_user((k)->c_cc[VMIN],  &(u)->c_cc[_VMIN]); \
0099         err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
0100     } else { \
0101         err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
0102         err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
0103     } \
0104     err |= put_user((k)->c_ispeed, &(u)->c_ispeed); \
0105     err |= put_user((k)->c_ospeed, &(u)->c_ospeed); \
0106     err; \
0107 })
0108 
0109 #define user_termios_to_kernel_termios_1(k, u) \
0110 ({ \
0111     int err; \
0112     err  = get_user((k)->c_iflag, &(u)->c_iflag); \
0113     err |= get_user((k)->c_oflag, &(u)->c_oflag); \
0114     err |= get_user((k)->c_cflag, &(u)->c_cflag); \
0115     err |= get_user((k)->c_lflag, &(u)->c_lflag); \
0116     err |= get_user((k)->c_line,  &(u)->c_line); \
0117     err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
0118     if ((k)->c_lflag & ICANON) { \
0119         err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
0120         err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
0121     } else { \
0122         err |= get_user((k)->c_cc[VMIN],  &(u)->c_cc[_VMIN]); \
0123         err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
0124     } \
0125     err; \
0126 })
0127 
0128 #define kernel_termios_to_user_termios_1(u, k) \
0129 ({ \
0130     int err; \
0131     err  = put_user((k)->c_iflag, &(u)->c_iflag); \
0132     err |= put_user((k)->c_oflag, &(u)->c_oflag); \
0133     err |= put_user((k)->c_cflag, &(u)->c_cflag); \
0134     err |= put_user((k)->c_lflag, &(u)->c_lflag); \
0135     err |= put_user((k)->c_line, &(u)->c_line); \
0136     err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
0137     if (!((k)->c_lflag & ICANON)) { \
0138         err |= put_user((k)->c_cc[VMIN],  &(u)->c_cc[_VMIN]); \
0139         err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
0140     } else { \
0141         err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
0142         err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
0143     } \
0144     err; \
0145 })
0146 
0147 #endif /* _SPARC_TERMIOS_H */