1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _SPARC_TERMIOS_H 3*4882a593Smuzhiyun #define _SPARC_TERMIOS_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <uapi/asm/termios.h> 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun /* 9*4882a593Smuzhiyun * c_cc characters in the termio structure. Oh, how I love being 10*4882a593Smuzhiyun * backwardly compatible. Notice that character 4 and 5 are 11*4882a593Smuzhiyun * interpreted differently depending on whether ICANON is set in 12*4882a593Smuzhiyun * c_lflag. If it's set, they are used as _VEOF and _VEOL, otherwise 13*4882a593Smuzhiyun * as _VMIN and V_TIME. This is for compatibility with OSF/1 (which 14*4882a593Smuzhiyun * is compatible with sysV)... 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun #define _VMIN 4 17*4882a593Smuzhiyun #define _VTIME 5 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* intr=^C quit=^\ erase=del kill=^U 20*4882a593Smuzhiyun eof=^D eol=\0 eol2=\0 sxtc=\0 21*4882a593Smuzhiyun start=^Q stop=^S susp=^Z dsusp=^Y 22*4882a593Smuzhiyun reprint=^R discard=^U werase=^W lnext=^V 23*4882a593Smuzhiyun vmin=\1 vtime=\0 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun #define INIT_C_CC "\003\034\177\025\004\000\000\000\021\023\032\031\022\025\027\026\001" 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* 28*4882a593Smuzhiyun * Translate a "termio" structure into a "termios". Ugh. 29*4882a593Smuzhiyun */ 30*4882a593Smuzhiyun #define user_termio_to_kernel_termios(termios, termio) \ 31*4882a593Smuzhiyun ({ \ 32*4882a593Smuzhiyun unsigned short tmp; \ 33*4882a593Smuzhiyun int err; \ 34*4882a593Smuzhiyun err = get_user(tmp, &(termio)->c_iflag); \ 35*4882a593Smuzhiyun (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \ 36*4882a593Smuzhiyun err |= get_user(tmp, &(termio)->c_oflag); \ 37*4882a593Smuzhiyun (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \ 38*4882a593Smuzhiyun err |= get_user(tmp, &(termio)->c_cflag); \ 39*4882a593Smuzhiyun (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \ 40*4882a593Smuzhiyun err |= get_user(tmp, &(termio)->c_lflag); \ 41*4882a593Smuzhiyun (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \ 42*4882a593Smuzhiyun err |= copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ 43*4882a593Smuzhiyun err; \ 44*4882a593Smuzhiyun }) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* 47*4882a593Smuzhiyun * Translate a "termios" structure into a "termio". Ugh. 48*4882a593Smuzhiyun * 49*4882a593Smuzhiyun * Note the "fun" _VMIN overloading. 50*4882a593Smuzhiyun */ 51*4882a593Smuzhiyun #define kernel_termios_to_user_termio(termio, termios) \ 52*4882a593Smuzhiyun ({ \ 53*4882a593Smuzhiyun int err; \ 54*4882a593Smuzhiyun err = put_user((termios)->c_iflag, &(termio)->c_iflag); \ 55*4882a593Smuzhiyun err |= put_user((termios)->c_oflag, &(termio)->c_oflag); \ 56*4882a593Smuzhiyun err |= put_user((termios)->c_cflag, &(termio)->c_cflag); \ 57*4882a593Smuzhiyun err |= put_user((termios)->c_lflag, &(termio)->c_lflag); \ 58*4882a593Smuzhiyun err |= put_user((termios)->c_line, &(termio)->c_line); \ 59*4882a593Smuzhiyun err |= copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ 60*4882a593Smuzhiyun if (!((termios)->c_lflag & ICANON)) { \ 61*4882a593Smuzhiyun err |= put_user((termios)->c_cc[VMIN], &(termio)->c_cc[_VMIN]); \ 62*4882a593Smuzhiyun err |= put_user((termios)->c_cc[VTIME], &(termio)->c_cc[_VTIME]); \ 63*4882a593Smuzhiyun } \ 64*4882a593Smuzhiyun err; \ 65*4882a593Smuzhiyun }) 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define user_termios_to_kernel_termios(k, u) \ 68*4882a593Smuzhiyun ({ \ 69*4882a593Smuzhiyun int err; \ 70*4882a593Smuzhiyun err = get_user((k)->c_iflag, &(u)->c_iflag); \ 71*4882a593Smuzhiyun err |= get_user((k)->c_oflag, &(u)->c_oflag); \ 72*4882a593Smuzhiyun err |= get_user((k)->c_cflag, &(u)->c_cflag); \ 73*4882a593Smuzhiyun err |= get_user((k)->c_lflag, &(u)->c_lflag); \ 74*4882a593Smuzhiyun err |= get_user((k)->c_line, &(u)->c_line); \ 75*4882a593Smuzhiyun err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \ 76*4882a593Smuzhiyun if ((k)->c_lflag & ICANON) { \ 77*4882a593Smuzhiyun err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ 78*4882a593Smuzhiyun err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ 79*4882a593Smuzhiyun } else { \ 80*4882a593Smuzhiyun err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ 81*4882a593Smuzhiyun err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ 82*4882a593Smuzhiyun } \ 83*4882a593Smuzhiyun err |= get_user((k)->c_ispeed, &(u)->c_ispeed); \ 84*4882a593Smuzhiyun err |= get_user((k)->c_ospeed, &(u)->c_ospeed); \ 85*4882a593Smuzhiyun err; \ 86*4882a593Smuzhiyun }) 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define kernel_termios_to_user_termios(u, k) \ 89*4882a593Smuzhiyun ({ \ 90*4882a593Smuzhiyun int err; \ 91*4882a593Smuzhiyun err = put_user((k)->c_iflag, &(u)->c_iflag); \ 92*4882a593Smuzhiyun err |= put_user((k)->c_oflag, &(u)->c_oflag); \ 93*4882a593Smuzhiyun err |= put_user((k)->c_cflag, &(u)->c_cflag); \ 94*4882a593Smuzhiyun err |= put_user((k)->c_lflag, &(u)->c_lflag); \ 95*4882a593Smuzhiyun err |= put_user((k)->c_line, &(u)->c_line); \ 96*4882a593Smuzhiyun err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \ 97*4882a593Smuzhiyun if (!((k)->c_lflag & ICANON)) { \ 98*4882a593Smuzhiyun err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ 99*4882a593Smuzhiyun err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ 100*4882a593Smuzhiyun } else { \ 101*4882a593Smuzhiyun err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ 102*4882a593Smuzhiyun err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ 103*4882a593Smuzhiyun } \ 104*4882a593Smuzhiyun err |= put_user((k)->c_ispeed, &(u)->c_ispeed); \ 105*4882a593Smuzhiyun err |= put_user((k)->c_ospeed, &(u)->c_ospeed); \ 106*4882a593Smuzhiyun err; \ 107*4882a593Smuzhiyun }) 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun #define user_termios_to_kernel_termios_1(k, u) \ 110*4882a593Smuzhiyun ({ \ 111*4882a593Smuzhiyun int err; \ 112*4882a593Smuzhiyun err = get_user((k)->c_iflag, &(u)->c_iflag); \ 113*4882a593Smuzhiyun err |= get_user((k)->c_oflag, &(u)->c_oflag); \ 114*4882a593Smuzhiyun err |= get_user((k)->c_cflag, &(u)->c_cflag); \ 115*4882a593Smuzhiyun err |= get_user((k)->c_lflag, &(u)->c_lflag); \ 116*4882a593Smuzhiyun err |= get_user((k)->c_line, &(u)->c_line); \ 117*4882a593Smuzhiyun err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \ 118*4882a593Smuzhiyun if ((k)->c_lflag & ICANON) { \ 119*4882a593Smuzhiyun err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ 120*4882a593Smuzhiyun err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ 121*4882a593Smuzhiyun } else { \ 122*4882a593Smuzhiyun err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ 123*4882a593Smuzhiyun err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ 124*4882a593Smuzhiyun } \ 125*4882a593Smuzhiyun err; \ 126*4882a593Smuzhiyun }) 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define kernel_termios_to_user_termios_1(u, k) \ 129*4882a593Smuzhiyun ({ \ 130*4882a593Smuzhiyun int err; \ 131*4882a593Smuzhiyun err = put_user((k)->c_iflag, &(u)->c_iflag); \ 132*4882a593Smuzhiyun err |= put_user((k)->c_oflag, &(u)->c_oflag); \ 133*4882a593Smuzhiyun err |= put_user((k)->c_cflag, &(u)->c_cflag); \ 134*4882a593Smuzhiyun err |= put_user((k)->c_lflag, &(u)->c_lflag); \ 135*4882a593Smuzhiyun err |= put_user((k)->c_line, &(u)->c_line); \ 136*4882a593Smuzhiyun err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \ 137*4882a593Smuzhiyun if (!((k)->c_lflag & ICANON)) { \ 138*4882a593Smuzhiyun err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ 139*4882a593Smuzhiyun err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ 140*4882a593Smuzhiyun } else { \ 141*4882a593Smuzhiyun err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ 142*4882a593Smuzhiyun err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ 143*4882a593Smuzhiyun } \ 144*4882a593Smuzhiyun err; \ 145*4882a593Smuzhiyun }) 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun #endif /* _SPARC_TERMIOS_H */ 148