aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-generic/termios.h
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2009-05-13 18:56:27 -0400
committerArnd Bergmann <arnd@klappe2.(none)>2009-06-11 15:02:15 -0400
commit6103ec56c65c33774c7c38652c8204120c3c7519 (patch)
tree5d510da8f5aeb46b796a27192b04eec99d375886 /include/asm-generic/termios.h
parent2864d32be31a20a4617e37a857dd9915a57e2efb (diff)
asm-generic: add generic ABI headers
These header files are typically copied from an existing architecture into any new one, slightly modified and then remain untouched until the end of time in the name of ABI stability. To make it easier for future architectures, provide a sane generic version here. In cases where multiple architectures already use identical code, I used the most common version. In cases like stat.h that are more or less broken everywhere, I provide a version that is meant to be ideal for new architectures. Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'include/asm-generic/termios.h')
-rw-r--r--include/asm-generic/termios.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/include/asm-generic/termios.h b/include/asm-generic/termios.h
new file mode 100644
index 000000000000..d0922adc56d4
--- /dev/null
+++ b/include/asm-generic/termios.h
@@ -0,0 +1,154 @@
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 */