0001
0002 #ifndef _SPARC_TERMIOS_H
0003 #define _SPARC_TERMIOS_H
0004
0005 #include <uapi/asm/termios.h>
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #define _VMIN 4
0017 #define _VTIME 5
0018
0019
0020
0021
0022
0023
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
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
0048
0049
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