1#ifndef _ASM_GENERIC_TERMIOS_H 2#define _ASM_GENERIC_TERMIOS_H 3/* 4 * Most architectures have straight copies of the x86 code, with 5 * varying levels of bug fixes on top. Usually it's a good idea 6 * to use this generic version instead, but be careful to avoid 7 * ABI changes. 8 * New architectures should not provide their own version. 9 */ 10 11#include <asm/termbits.h> 12#include <asm/ioctls.h> 13 14struct winsize { 15 unsigned short ws_row; 16 unsigned short ws_col; 17 unsigned short ws_xpixel; 18 unsigned short ws_ypixel; 19}; 20 21#define NCC 8 22struct termio { 23 unsigned short c_iflag; /* input mode flags */ 24 unsigned short c_oflag; /* output mode flags */ 25 unsigned short c_cflag; /* control mode flags */ 26 unsigned short c_lflag; /* local mode flags */ 27 unsigned char c_line; /* line discipline */ 28 unsigned char c_cc[NCC]; /* control characters */ 29}; 30 31/* modem lines */ 32#define TIOCM_LE 0x001 33#define TIOCM_DTR 0x002 34#define TIOCM_RTS 0x004 35#define TIOCM_ST 0x008 36#define TIOCM_SR 0x010 37#define TIOCM_CTS 0x020 38#define TIOCM_CAR 0x040 39#define TIOCM_RNG 0x080 40#define TIOCM_DSR 0x100 41#define TIOCM_CD TIOCM_CAR 42#define TIOCM_RI TIOCM_RNG 43#define TIOCM_OUT1 0x2000 44#define TIOCM_OUT2 0x4000 45#define TIOCM_LOOP 0x8000 46 47/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ 48 49#ifdef __KERNEL__ 50 51#include <asm/uaccess.h> 52 53/* intr=^C quit=^\ erase=del kill=^U 54 eof=^D vtime=\0 vmin=\1 sxtc=\0 55 start=^Q stop=^S susp=^Z eol=\0 56 reprint=^R discard=^U werase=^W lnext=^V 57 eol2=\0 58*/ 59#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" 60 61/* 62 * Translate a "termio" structure into a "termios". Ugh. 63 */ 64static inline int user_termio_to_kernel_termios(struct ktermios *termios, 65 const struct termio __user *termio) 66{ 67 unsigned short tmp; 68 69 if (get_user(tmp, &termio->c_iflag) < 0) 70 goto fault; 71 termios->c_iflag = (0xffff0000 & termios->c_iflag) | tmp; 72 73 if (get_user(tmp, &termio->c_oflag) < 0) 74 goto fault; 75 termios->c_oflag = (0xffff0000 & termios->c_oflag) | tmp; 76 77 if (get_user(tmp, &termio->c_cflag) < 0) 78 goto fault; 79 termios->c_cflag = (0xffff0000 & termios->c_cflag) | tmp; 80 81 if (get_user(tmp, &termio->c_lflag) < 0) 82 goto fault; 83 termios->c_lflag = (0xffff0000 & termios->c_lflag) | tmp; 84 85 if (get_user(termios->c_line, &termio->c_line) < 0) 86 goto fault; 87 88 if (copy_from_user(termios->c_cc, termio->c_cc, NCC) != 0) 89 goto fault; 90 91 return 0; 92 93 fault: 94 return -EFAULT; 95} 96 97/* 98 * Translate a "termios" structure into a "termio". Ugh. 99 */ 100static inline int kernel_termios_to_user_termio(struct termio __user *termio, 101 struct ktermios *termios) 102{ 103 if (put_user(termios->c_iflag, &termio->c_iflag) < 0 || 104 put_user(termios->c_oflag, &termio->c_oflag) < 0 || 105 put_user(termios->c_cflag, &termio->c_cflag) < 0 || 106 put_user(termios->c_lflag, &termio->c_lflag) < 0 || 107 put_user(termios->c_line, &termio->c_line) < 0 || 108 copy_to_user(termio->c_cc, termios->c_cc, NCC) != 0) 109 return -EFAULT; 110 111 return 0; 112} 113 114#ifdef TCGETS2 115static inline int user_termios_to_kernel_termios(struct ktermios *k, 116 struct termios2 __user *u) 117{ 118 return copy_from_user(k, u, sizeof(struct termios2)); 119} 120 121static inline int kernel_termios_to_user_termios(struct termios2 __user *u, 122 struct ktermios *k) 123{ 124 return copy_to_user(u, k, sizeof(struct termios2)); 125} 126 127static inline int user_termios_to_kernel_termios_1(struct ktermios *k, 128 struct termios __user *u) 129{ 130 return copy_from_user(k, u, sizeof(struct termios)); 131} 132 133static inline int kernel_termios_to_user_termios_1(struct termios __user *u, 134 struct ktermios *k) 135{ 136 return copy_to_user(u, k, sizeof(struct termios)); 137} 138#else /* TCGETS2 */ 139static inline int user_termios_to_kernel_termios(struct ktermios *k, 140 struct termios __user *u) 141{ 142 return copy_from_user(k, u, sizeof(struct termios)); 143} 144 145static inline int kernel_termios_to_user_termios(struct termios __user *u, 146 struct ktermios *k) 147{ 148 return copy_to_user(u, k, sizeof(struct termios)); 149} 150#endif /* TCGETS2 */ 151 152#endif /* __KERNEL__ */ 153 154#endif /* _ASM_GENERIC_TERMIOS_H */ 155