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