Commit | Line | Data |
---|---|---|
6103ec56 AB |
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 | ||
14 | struct 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 | |
22 | struct 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 | */ | |
64 | static 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 | */ | |
100 | static 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 | |
115 | static 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 | ||
121 | static 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 | ||
127 | static 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 | ||
133 | static 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 */ | |
139 | static 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 | ||
145 | static 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 */ |