1 #ifndef _SPARC_TERMIOS_H 2 #define _SPARC_TERMIOS_H 3 4 #include <asm/ioctls.h> 5 #include <asm/termbits.h> 6 7 #if defined(__KERNEL__) || defined(__DEFINE_BSD_TERMIOS) 8 struct sgttyb { 9 char sg_ispeed; 10 char sg_ospeed; 11 char sg_erase; 12 char sg_kill; 13 short sg_flags; 14 }; 15 16 struct tchars { 17 char t_intrc; 18 char t_quitc; 19 char t_startc; 20 char t_stopc; 21 char t_eofc; 22 char t_brkc; 23 }; 24 25 struct ltchars { 26 char t_suspc; 27 char t_dsuspc; 28 char t_rprntc; 29 char t_flushc; 30 char t_werasc; 31 char t_lnextc; 32 }; 33 #endif /* __KERNEL__ */ 34 35 struct winsize { 36 unsigned short ws_row; 37 unsigned short ws_col; 38 unsigned short ws_xpixel; 39 unsigned short ws_ypixel; 40 }; 41 42 #ifdef __KERNEL__ 43 44 /* 45 * c_cc characters in the termio structure. Oh, how I love being 46 * backwardly compatible. Notice that character 4 and 5 are 47 * interpreted differently depending on whether ICANON is set in 48 * c_lflag. If it's set, they are used as _VEOF and _VEOL, otherwise 49 * as _VMIN and V_TIME. This is for compatibility with OSF/1 (which 50 * is compatible with sysV)... 51 */ 52 #define _VMIN 4 53 #define _VTIME 5 54 55 /* intr=^C quit=^\ erase=del kill=^U 56 eof=^D eol=\0 eol2=\0 sxtc=\0 57 start=^Q stop=^S susp=^Z dsusp=^Y 58 reprint=^R discard=^U werase=^W lnext=^V 59 vmin=\1 vtime=\0 60 */ 61 #define INIT_C_CC "\003\034\177\025\004\000\000\000\021\023\032\031\022\025\027\026\001" 62 63 /* 64 * Translate a "termio" structure into a "termios". Ugh. 65 */ 66 #define user_termio_to_kernel_termios(termios, termio) \ 67 ({ \ 68 unsigned short tmp; \ 69 int err; \ 70 err = get_user(tmp, &(termio)->c_iflag); \ 71 (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \ 72 err |= get_user(tmp, &(termio)->c_oflag); \ 73 (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \ 74 err |= get_user(tmp, &(termio)->c_cflag); \ 75 (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \ 76 err |= get_user(tmp, &(termio)->c_lflag); \ 77 (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \ 78 err |= copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ 79 err; \ 80 }) 81 82 /* 83 * Translate a "termios" structure into a "termio". Ugh. 84 * 85 * Note the "fun" _VMIN overloading. 86 */ 87 #define kernel_termios_to_user_termio(termio, termios) \ 88 ({ \ 89 int err; \ 90 err = put_user((termios)->c_iflag, &(termio)->c_iflag); \ 91 err |= put_user((termios)->c_oflag, &(termio)->c_oflag); \ 92 err |= put_user((termios)->c_cflag, &(termio)->c_cflag); \ 93 err |= put_user((termios)->c_lflag, &(termio)->c_lflag); \ 94 err |= put_user((termios)->c_line, &(termio)->c_line); \ 95 err |= copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ 96 if (!((termios)->c_lflag & ICANON)) { \ 97 err |= put_user((termios)->c_cc[VMIN], &(termio)->c_cc[_VMIN]); \ 98 err |= put_user((termios)->c_cc[VTIME], &(termio)->c_cc[_VTIME]); \ 99 } \ 100 err; \ 101 }) 102 103 #define user_termios_to_kernel_termios(k, u) \ 104 ({ \ 105 int err; \ 106 err = get_user((k)->c_iflag, &(u)->c_iflag); \ 107 err |= get_user((k)->c_oflag, &(u)->c_oflag); \ 108 err |= get_user((k)->c_cflag, &(u)->c_cflag); \ 109 err |= get_user((k)->c_lflag, &(u)->c_lflag); \ 110 err |= get_user((k)->c_line, &(u)->c_line); \ 111 err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \ 112 if ((k)->c_lflag & ICANON) { \ 113 err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ 114 err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ 115 } else { \ 116 err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ 117 err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ 118 } \ 119 err |= get_user((k)->c_ispeed, &(u)->c_ispeed); \ 120 err |= get_user((k)->c_ospeed, &(u)->c_ospeed); \ 121 err; \ 122 }) 123 124 #define kernel_termios_to_user_termios(u, k) \ 125 ({ \ 126 int err; \ 127 err = put_user((k)->c_iflag, &(u)->c_iflag); \ 128 err |= put_user((k)->c_oflag, &(u)->c_oflag); \ 129 err |= put_user((k)->c_cflag, &(u)->c_cflag); \ 130 err |= put_user((k)->c_lflag, &(u)->c_lflag); \ 131 err |= put_user((k)->c_line, &(u)->c_line); \ 132 err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \ 133 if (!((k)->c_lflag & ICANON)) { \ 134 err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ 135 err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ 136 } else { \ 137 err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ 138 err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ 139 } \ 140 err |= put_user((k)->c_ispeed, &(u)->c_ispeed); \ 141 err |= put_user((k)->c_ospeed, &(u)->c_ospeed); \ 142 err; \ 143 }) 144 145 #define user_termios_to_kernel_termios_1(k, u) \ 146 ({ \ 147 int err; \ 148 err = get_user((k)->c_iflag, &(u)->c_iflag); \ 149 err |= get_user((k)->c_oflag, &(u)->c_oflag); \ 150 err |= get_user((k)->c_cflag, &(u)->c_cflag); \ 151 err |= get_user((k)->c_lflag, &(u)->c_lflag); \ 152 err |= get_user((k)->c_line, &(u)->c_line); \ 153 err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \ 154 if ((k)->c_lflag & ICANON) { \ 155 err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ 156 err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ 157 } else { \ 158 err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ 159 err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ 160 } \ 161 err; \ 162 }) 163 164 #define kernel_termios_to_user_termios_1(u, k) \ 165 ({ \ 166 int err; \ 167 err = put_user((k)->c_iflag, &(u)->c_iflag); \ 168 err |= put_user((k)->c_oflag, &(u)->c_oflag); \ 169 err |= put_user((k)->c_cflag, &(u)->c_cflag); \ 170 err |= put_user((k)->c_lflag, &(u)->c_lflag); \ 171 err |= put_user((k)->c_line, &(u)->c_line); \ 172 err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \ 173 if (!((k)->c_lflag & ICANON)) { \ 174 err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ 175 err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ 176 } else { \ 177 err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ 178 err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ 179 } \ 180 err; \ 181 }) 182 183 #endif /* __KERNEL__ */ 184 185 #endif /* _SPARC_TERMIOS_H */ 186