diff options
author | Sam Ravnborg <sam@ravnborg.org> | 2008-06-06 15:27:54 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-07-18 00:42:15 -0400 |
commit | c6d1b0e3d2b71ded7c457c2c9f1ab8c2c957aafe (patch) | |
tree | 18700d1b847b6c47c91cfbd356b6499f0145cc9f | |
parent | 943d0e86133a3f2e69b24e9754390a60d92ad224 (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.h | 79 | ||||
-rw-r--r-- | include/asm-sparc64/termios.h | 187 |
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) | ||
8 | struct sgttyb { | ||
9 | char sg_ispeed; | ||
10 | char sg_ospeed; | ||
11 | char sg_erase; | ||
12 | char sg_kill; | ||
13 | short sg_flags; | ||
14 | }; | ||
15 | |||
16 | struct 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 | |||
25 | struct 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 | |||
35 | struct 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 */ | ||