aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Ravnborg <sam@ravnborg.org>2008-06-06 15:27:54 -0400
committerDavid S. Miller <davem@davemloft.net>2008-07-18 00:42:15 -0400
commitc6d1b0e3d2b71ded7c457c2c9f1ab8c2c957aafe (patch)
tree18700d1b847b6c47c91cfbd356b6499f0145cc9f
parent943d0e86133a3f2e69b24e9754390a60d92ad224 (diff)
sparc: Merge asm-sparc{,64}/termios.h
Bring the commit e55c57e0b51c68d78845549505057169c6c3cba6 ("[SPARC64]: Report any user access faults in termios accessors") over to sparc when unifying the two files. The diff was manually inspected to contain no other relevant changes. This unification therefore changes functionality of sparc. Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
-rw-r--r--include/asm-sparc/termios.h79
-rw-r--r--include/asm-sparc64/termios.h187
2 files changed, 42 insertions, 224 deletions
diff --git a/include/asm-sparc/termios.h b/include/asm-sparc/termios.h
index f7b4409c35ff..e8ba95399643 100644
--- a/include/asm-sparc/termios.h
+++ b/include/asm-sparc/termios.h
@@ -53,7 +53,6 @@ struct winsize {
53#define _VMIN 4 53#define _VMIN 4
54#define _VTIME 5 54#define _VTIME 5
55 55
56
57/* intr=^C quit=^\ erase=del kill=^U 56/* intr=^C quit=^\ erase=del kill=^U
58 eof=^D eol=\0 eol2=\0 sxtc=\0 57 eof=^D eol=\0 eol2=\0 sxtc=\0
59 start=^Q stop=^S susp=^Z dsusp=^Y 58 start=^Q stop=^S susp=^Z dsusp=^Y
@@ -68,16 +67,17 @@ struct winsize {
68#define user_termio_to_kernel_termios(termios, termio) \ 67#define user_termio_to_kernel_termios(termios, termio) \
69({ \ 68({ \
70 unsigned short tmp; \ 69 unsigned short tmp; \
71 get_user(tmp, &(termio)->c_iflag); \ 70 int err; \
71 err = get_user(tmp, &(termio)->c_iflag); \
72 (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \ 72 (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \
73 get_user(tmp, &(termio)->c_oflag); \ 73 err |= get_user(tmp, &(termio)->c_oflag); \
74 (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \ 74 (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \
75 get_user(tmp, &(termio)->c_cflag); \ 75 err |= get_user(tmp, &(termio)->c_cflag); \
76 (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \ 76 (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \
77 get_user(tmp, &(termio)->c_lflag); \ 77 err |= get_user(tmp, &(termio)->c_lflag); \
78 (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \ 78 (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \
79 copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ 79 err |= copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
80 0; \ 80 err; \
81}) 81})
82 82
83/* 83/*
@@ -87,17 +87,18 @@ struct winsize {
87 */ 87 */
88#define kernel_termios_to_user_termio(termio, termios) \ 88#define kernel_termios_to_user_termio(termio, termios) \
89({ \ 89({ \
90 put_user((termios)->c_iflag, &(termio)->c_iflag); \ 90 int err; \
91 put_user((termios)->c_oflag, &(termio)->c_oflag); \ 91 err = put_user((termios)->c_iflag, &(termio)->c_iflag); \
92 put_user((termios)->c_cflag, &(termio)->c_cflag); \ 92 err |= put_user((termios)->c_oflag, &(termio)->c_oflag); \
93 put_user((termios)->c_lflag, &(termio)->c_lflag); \ 93 err |= put_user((termios)->c_cflag, &(termio)->c_cflag); \
94 put_user((termios)->c_line, &(termio)->c_line); \ 94 err |= put_user((termios)->c_lflag, &(termio)->c_lflag); \
95 copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ 95 err |= put_user((termios)->c_line, &(termio)->c_line); \
96 err |= copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
96 if (!((termios)->c_lflag & ICANON)) { \ 97 if (!((termios)->c_lflag & ICANON)) { \
97 put_user((termios)->c_cc[VMIN], &(termio)->c_cc[_VMIN]); \ 98 err |= put_user((termios)->c_cc[VMIN], &(termio)->c_cc[_VMIN]); \
98 put_user((termios)->c_cc[VTIME], &(termio)->c_cc[_VTIME]); \ 99 err |= put_user((termios)->c_cc[VTIME], &(termio)->c_cc[_VTIME]); \
99 } \ 100 } \
100 0; \ 101 err; \
101}) 102})
102 103
103#define user_termios_to_kernel_termios(k, u) \ 104#define user_termios_to_kernel_termios(k, u) \
@@ -144,38 +145,40 @@ struct winsize {
144 145
145#define user_termios_to_kernel_termios_1(k, u) \ 146#define user_termios_to_kernel_termios_1(k, u) \
146({ \ 147({ \
147 get_user((k)->c_iflag, &(u)->c_iflag); \ 148 int err; \
148 get_user((k)->c_oflag, &(u)->c_oflag); \ 149 err = get_user((k)->c_iflag, &(u)->c_iflag); \
149 get_user((k)->c_cflag, &(u)->c_cflag); \ 150 err |= get_user((k)->c_oflag, &(u)->c_oflag); \
150 get_user((k)->c_lflag, &(u)->c_lflag); \ 151 err |= get_user((k)->c_cflag, &(u)->c_cflag); \
151 get_user((k)->c_line, &(u)->c_line); \ 152 err |= get_user((k)->c_lflag, &(u)->c_lflag); \
152 copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \ 153 err |= get_user((k)->c_line, &(u)->c_line); \
154 err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
153 if ((k)->c_lflag & ICANON) { \ 155 if ((k)->c_lflag & ICANON) { \
154 get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ 156 err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
155 get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ 157 err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
156 } else { \ 158 } else { \
157 get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ 159 err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
158 get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ 160 err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
159 } \ 161 } \
160 0; \ 162 err; \
161}) 163})
162 164
163#define kernel_termios_to_user_termios_1(u, k) \ 165#define kernel_termios_to_user_termios_1(u, k) \
164({ \ 166({ \
165 put_user((k)->c_iflag, &(u)->c_iflag); \ 167 int err; \
166 put_user((k)->c_oflag, &(u)->c_oflag); \ 168 err = put_user((k)->c_iflag, &(u)->c_iflag); \
167 put_user((k)->c_cflag, &(u)->c_cflag); \ 169 err |= put_user((k)->c_oflag, &(u)->c_oflag); \
168 put_user((k)->c_lflag, &(u)->c_lflag); \ 170 err |= put_user((k)->c_cflag, &(u)->c_cflag); \
169 put_user((k)->c_line, &(u)->c_line); \ 171 err |= put_user((k)->c_lflag, &(u)->c_lflag); \
170 copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \ 172 err |= put_user((k)->c_line, &(u)->c_line); \
173 err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
171 if (!((k)->c_lflag & ICANON)) { \ 174 if (!((k)->c_lflag & ICANON)) { \
172 put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \ 175 err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
173 put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \ 176 err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
174 } else { \ 177 } else { \
175 put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \ 178 err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
176 put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \ 179 err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
177 } \ 180 } \
178 0; \ 181 err; \
179}) 182})
180 183
181#endif /* __KERNEL__ */ 184#endif /* __KERNEL__ */
diff --git a/include/asm-sparc64/termios.h b/include/asm-sparc64/termios.h
index 1f5dab25dda5..940495eb05cc 100644
--- a/include/asm-sparc64/termios.h
+++ b/include/asm-sparc64/termios.h
@@ -1,186 +1 @@
1#ifndef _SPARC64_TERMIOS_H #include <asm-sparc/termios.h>
2#define _SPARC64_TERMIOS_H
3
4#include <asm/ioctls.h>
5#include <asm/termbits.h>
6
7#if defined(__KERNEL__) || defined(__DEFINE_BSD_TERMIOS)
8struct sgttyb {
9 char sg_ispeed;
10 char sg_ospeed;
11 char sg_erase;
12 char sg_kill;
13 short sg_flags;
14};
15
16struct tchars {
17 char t_intrc;
18 char t_quitc;
19 char t_startc;
20 char t_stopc;
21 char t_eofc;
22 char t_brkc;
23};
24
25struct ltchars {
26 char t_suspc;
27 char t_dsuspc;
28 char t_rprntc;
29 char t_flushc;
30 char t_werasc;
31 char t_lnextc;
32};
33#endif /* __KERNEL__ */
34
35struct winsize {
36 unsigned short ws_row;
37 unsigned short ws_col;
38 unsigned short ws_xpixel;
39 unsigned short ws_ypixel;
40};
41
42#ifdef __KERNEL__
43#include <linux/module.h>
44
45/*
46 * c_cc characters in the termio structure. Oh, how I love being
47 * backwardly compatible. Notice that character 4 and 5 are
48 * interpreted differently depending on whether ICANON is set in
49 * c_lflag. If it's set, they are used as _VEOF and _VEOL, otherwise
50 * as _VMIN and V_TIME. This is for compatibility with OSF/1 (which
51 * is compatible with sysV)...
52 */
53#define _VMIN 4
54#define _VTIME 5
55
56/* intr=^C quit=^\ erase=del kill=^U
57 eof=^D eol=\0 eol2=\0 sxtc=\0
58 start=^Q stop=^S susp=^Z dsusp=^Y
59 reprint=^R discard=^U werase=^W lnext=^V
60 vmin=\1 vtime=\0
61*/
62#define INIT_C_CC "\003\034\177\025\004\000\000\000\021\023\032\031\022\025\027\026\001"
63
64/*
65 * Translate a "termio" structure into a "termios". Ugh.
66 */
67#define user_termio_to_kernel_termios(termios, termio) \
68({ \
69 unsigned short tmp; \
70 int err; \
71 err = get_user(tmp, &(termio)->c_iflag); \
72 (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \
73 err |= get_user(tmp, &(termio)->c_oflag); \
74 (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \
75 err |= get_user(tmp, &(termio)->c_cflag); \
76 (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \
77 err |= get_user(tmp, &(termio)->c_lflag); \
78 (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \
79 err |= copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
80 err; \
81})
82
83/*
84 * Translate a "termios" structure into a "termio". Ugh.
85 *
86 * Note the "fun" _VMIN overloading.
87 */
88#define kernel_termios_to_user_termio(termio, termios) \
89({ \
90 int err; \
91 err = put_user((termios)->c_iflag, &(termio)->c_iflag); \
92 err |= put_user((termios)->c_oflag, &(termio)->c_oflag); \
93 err |= put_user((termios)->c_cflag, &(termio)->c_cflag); \
94 err |= put_user((termios)->c_lflag, &(termio)->c_lflag); \
95 err |= put_user((termios)->c_line, &(termio)->c_line); \
96 err |= copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
97 if (!((termios)->c_lflag & ICANON)) { \
98 err |= put_user((termios)->c_cc[VMIN], &(termio)->c_cc[_VMIN]); \
99 err |= put_user((termios)->c_cc[VTIME], &(termio)->c_cc[_VTIME]); \
100 } \
101 err; \
102})
103
104#define user_termios_to_kernel_termios(k, u) \
105({ \
106 int err; \
107 err = get_user((k)->c_iflag, &(u)->c_iflag); \
108 err |= get_user((k)->c_oflag, &(u)->c_oflag); \
109 err |= get_user((k)->c_cflag, &(u)->c_cflag); \
110 err |= get_user((k)->c_lflag, &(u)->c_lflag); \
111 err |= get_user((k)->c_line, &(u)->c_line); \
112 err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
113 if((k)->c_lflag & ICANON) { \
114 err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
115 err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
116 } else { \
117 err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
118 err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
119 } \
120 err |= get_user((k)->c_ispeed, &(u)->c_ispeed); \
121 err |= get_user((k)->c_ospeed, &(u)->c_ospeed); \
122 err; \
123})
124
125#define kernel_termios_to_user_termios(u, k) \
126({ \
127 int err; \
128 err = put_user((k)->c_iflag, &(u)->c_iflag); \
129 err |= put_user((k)->c_oflag, &(u)->c_oflag); \
130 err |= put_user((k)->c_cflag, &(u)->c_cflag); \
131 err |= put_user((k)->c_lflag, &(u)->c_lflag); \
132 err |= put_user((k)->c_line, &(u)->c_line); \
133 err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
134 if(!((k)->c_lflag & ICANON)) { \
135 err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
136 err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
137 } else { \
138 err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
139 err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
140 } \
141 err |= put_user((k)->c_ispeed, &(u)->c_ispeed); \
142 err |= put_user((k)->c_ospeed, &(u)->c_ospeed); \
143 err; \
144})
145
146#define user_termios_to_kernel_termios_1(k, u) \
147({ \
148 int err; \
149 err = get_user((k)->c_iflag, &(u)->c_iflag); \
150 err |= get_user((k)->c_oflag, &(u)->c_oflag); \
151 err |= get_user((k)->c_cflag, &(u)->c_cflag); \
152 err |= get_user((k)->c_lflag, &(u)->c_lflag); \
153 err |= get_user((k)->c_line, &(u)->c_line); \
154 err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
155 if((k)->c_lflag & ICANON) { \
156 err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
157 err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
158 } else { \
159 err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
160 err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
161 } \
162 err; \
163})
164
165#define kernel_termios_to_user_termios_1(u, k) \
166({ \
167 int err; \
168 err = put_user((k)->c_iflag, &(u)->c_iflag); \
169 err |= put_user((k)->c_oflag, &(u)->c_oflag); \
170 err |= put_user((k)->c_cflag, &(u)->c_cflag); \
171 err |= put_user((k)->c_lflag, &(u)->c_lflag); \
172 err |= put_user((k)->c_line, &(u)->c_line); \
173 err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
174 if(!((k)->c_lflag & ICANON)) { \
175 err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
176 err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
177 } else { \
178 err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
179 err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
180 } \
181 err; \
182})
183
184#endif /* __KERNEL__ */
185
186#endif /* _SPARC64_TERMIOS_H */