@@ -128,60 +128,38 @@ DEFINE_PUT_USER(short);
128
128
DEFINE_PUT_USER (int );
129
129
DEFINE_PUT_USER (long );
130
130
131
- static __always_inline int __put_user_fn (void * x , void __user * ptr , unsigned long size )
132
- {
133
- int rc ;
134
-
135
- switch (size ) {
136
- case 1 :
137
- rc = __put_user_char ((unsigned char __user * )ptr ,
138
- (unsigned char * )x ,
139
- size );
140
- break ;
141
- case 2 :
142
- rc = __put_user_short ((unsigned short __user * )ptr ,
143
- (unsigned short * )x ,
144
- size );
145
- break ;
146
- case 4 :
147
- rc = __put_user_int ((unsigned int __user * )ptr ,
148
- (unsigned int * )x ,
149
- size );
150
- break ;
151
- case 8 :
152
- rc = __put_user_long ((unsigned long __user * )ptr ,
153
- (unsigned long * )x ,
154
- size );
155
- break ;
156
- default :
157
- __put_user_bad ();
158
- break ;
159
- }
160
- return rc ;
161
- }
162
-
163
- /*
164
- * These are the main single-value transfer routines. They automatically
165
- * use the right size if we just have the right pointer type.
166
- */
167
131
#define __put_user (x , ptr ) \
168
132
({ \
169
133
__typeof__(*(ptr)) __x = (x); \
170
- int __pu_err = -EFAULT; \
134
+ int __prc; \
171
135
\
172
136
__chk_user_ptr(ptr); \
173
137
switch (sizeof(*(ptr))) { \
174
138
case 1: \
139
+ __prc = __put_user_char((unsigned char __user *)(ptr), \
140
+ (unsigned char *)&__x, \
141
+ sizeof(*(ptr))); \
142
+ break; \
175
143
case 2: \
144
+ __prc = __put_user_short((unsigned short __user *)(ptr),\
145
+ (unsigned short *)&__x, \
146
+ sizeof(*(ptr))); \
147
+ break; \
176
148
case 4: \
149
+ __prc = __put_user_int((unsigned int __user *)(ptr), \
150
+ (unsigned int *)&__x, \
151
+ sizeof(*(ptr))); \
152
+ break; \
177
153
case 8: \
178
- __pu_err = __put_user_fn(&__x, ptr, sizeof(*(ptr))); \
154
+ __prc = __put_user_long((unsigned long __user *)(ptr), \
155
+ (unsigned long *)&__x, \
156
+ sizeof(*(ptr))); \
179
157
break; \
180
158
default: \
181
- __put_user_bad(); \
159
+ __prc = __put_user_bad(); \
182
160
break; \
183
161
} \
184
- __builtin_expect(__pu_err , 0); \
162
+ __builtin_expect(__prc , 0); \
185
163
})
186
164
187
165
#define put_user (x , ptr ) \
@@ -195,7 +173,7 @@ int __noreturn __get_user_bad(void);
195
173
#define DEFINE_GET_USER (type ) \
196
174
static get_put_user_noinstr_attributes int \
197
175
__get_user_##type##_noinstr(unsigned type *to, \
198
- unsigned type __user *from, \
176
+ const unsigned type __user *from, \
199
177
unsigned long size) \
200
178
{ \
201
179
union oac __oac_spec = { \
@@ -220,7 +198,7 @@ __get_user_##type##_noinstr(unsigned type *to, \
220
198
} \
221
199
\
222
200
static __always_inline int \
223
- __get_user_##type(unsigned type *to, unsigned type __user *from, \
201
+ __get_user_##type(unsigned type *to, const unsigned type __user *from, \
224
202
unsigned long size) \
225
203
{ \
226
204
int rc; \
@@ -235,77 +213,50 @@ DEFINE_GET_USER(short);
235
213
DEFINE_GET_USER (int );
236
214
DEFINE_GET_USER (long );
237
215
238
- static __always_inline int __get_user_fn (void * x , const void __user * ptr , unsigned long size )
239
- {
240
- int rc ;
241
-
242
- switch (size ) {
243
- case 1 :
244
- rc = __get_user_char ((unsigned char * )x ,
245
- (unsigned char __user * )ptr ,
246
- size );
247
- break ;
248
- case 2 :
249
- rc = __get_user_short ((unsigned short * )x ,
250
- (unsigned short __user * )ptr ,
251
- size );
252
- break ;
253
- case 4 :
254
- rc = __get_user_int ((unsigned int * )x ,
255
- (unsigned int __user * )ptr ,
256
- size );
257
- break ;
258
- case 8 :
259
- rc = __get_user_long ((unsigned long * )x ,
260
- (unsigned long __user * )ptr ,
261
- size );
262
- break ;
263
- default :
264
- __get_user_bad ();
265
- break ;
266
- }
267
- return rc ;
268
- }
269
-
270
216
#define __get_user (x , ptr ) \
271
217
({ \
272
- int __gu_err = -EFAULT; \
218
+ const __user void *____guptr = (ptr); \
219
+ int __grc; \
273
220
\
274
221
__chk_user_ptr(ptr); \
275
222
switch (sizeof(*(ptr))) { \
276
223
case 1: { \
224
+ const unsigned char __user *__guptr = ____guptr; \
277
225
unsigned char __x; \
278
226
\
279
- __gu_err = __get_user_fn (&__x, ptr , sizeof(*(ptr))); \
227
+ __grc = __get_user_char (&__x, __guptr , sizeof(*(ptr))); \
280
228
(x) = *(__force __typeof__(*(ptr)) *)&__x; \
281
229
break; \
282
230
}; \
283
231
case 2: { \
232
+ const unsigned short __user *__guptr = ____guptr; \
284
233
unsigned short __x; \
285
234
\
286
- __gu_err = __get_user_fn (&__x, ptr , sizeof(*(ptr))); \
235
+ __grc = __get_user_short (&__x, __guptr , sizeof(*(ptr)));\
287
236
(x) = *(__force __typeof__(*(ptr)) *)&__x; \
288
237
break; \
289
238
}; \
290
239
case 4: { \
240
+ const unsigned int __user *__guptr = ____guptr; \
291
241
unsigned int __x; \
292
242
\
293
- __gu_err = __get_user_fn (&__x, ptr , sizeof(*(ptr))); \
243
+ __grc = __get_user_int (&__x, __guptr , sizeof(*(ptr))); \
294
244
(x) = *(__force __typeof__(*(ptr)) *)&__x; \
295
245
break; \
296
246
}; \
297
247
case 8: { \
248
+ const unsigned long __user *__guptr = ____guptr; \
298
249
unsigned long __x; \
299
250
\
300
- __gu_err = __get_user_fn (&__x, ptr , sizeof(*(ptr))); \
251
+ __grc = __get_user_long (&__x, __guptr , sizeof(*(ptr))); \
301
252
(x) = *(__force __typeof__(*(ptr)) *)&__x; \
302
253
break; \
303
254
}; \
304
255
default: \
305
- __get_user_bad(); \
256
+ __grc = __get_user_bad(); \
306
257
break; \
307
258
} \
308
- __builtin_expect(__gu_err , 0); \
259
+ __builtin_expect(__grc , 0); \
309
260
})
310
261
311
262
#define get_user (x , ptr ) \
0 commit comments