@@ -128,60 +128,38 @@ DEFINE_PUT_USER(short);
128128DEFINE_PUT_USER (int );
129129DEFINE_PUT_USER (long );
130130
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- */
167131#define __put_user (x , ptr ) \
168132({ \
169133 __typeof__(*(ptr)) __x = (x); \
170- int __pu_err = -EFAULT; \
134+ int __prc; \
171135 \
172136 __chk_user_ptr(ptr); \
173137 switch (sizeof(*(ptr))) { \
174138 case 1: \
139+ __prc = __put_user_char((unsigned char __user *)(ptr), \
140+ (unsigned char *)&__x, \
141+ sizeof(*(ptr))); \
142+ break; \
175143 case 2: \
144+ __prc = __put_user_short((unsigned short __user *)(ptr),\
145+ (unsigned short *)&__x, \
146+ sizeof(*(ptr))); \
147+ break; \
176148 case 4: \
149+ __prc = __put_user_int((unsigned int __user *)(ptr), \
150+ (unsigned int *)&__x, \
151+ sizeof(*(ptr))); \
152+ break; \
177153 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))); \
179157 break; \
180158 default: \
181- __put_user_bad(); \
159+ __prc = __put_user_bad(); \
182160 break; \
183161 } \
184- __builtin_expect(__pu_err , 0); \
162+ __builtin_expect(__prc , 0); \
185163})
186164
187165#define put_user (x , ptr ) \
@@ -195,7 +173,7 @@ int __noreturn __get_user_bad(void);
195173#define DEFINE_GET_USER (type ) \
196174static get_put_user_noinstr_attributes int \
197175__get_user_##type##_noinstr(unsigned type *to, \
198- unsigned type __user *from, \
176+ const unsigned type __user *from, \
199177 unsigned long size) \
200178{ \
201179 union oac __oac_spec = { \
@@ -220,7 +198,7 @@ __get_user_##type##_noinstr(unsigned type *to, \
220198} \
221199 \
222200static __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, \
224202 unsigned long size) \
225203{ \
226204 int rc; \
@@ -235,77 +213,50 @@ DEFINE_GET_USER(short);
235213DEFINE_GET_USER (int );
236214DEFINE_GET_USER (long );
237215
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-
270216#define __get_user (x , ptr ) \
271217({ \
272- int __gu_err = -EFAULT; \
218+ const __user void *____guptr = (ptr); \
219+ int __grc; \
273220 \
274221 __chk_user_ptr(ptr); \
275222 switch (sizeof(*(ptr))) { \
276223 case 1: { \
224+ const unsigned char __user *__guptr = ____guptr; \
277225 unsigned char __x; \
278226 \
279- __gu_err = __get_user_fn (&__x, ptr , sizeof(*(ptr))); \
227+ __grc = __get_user_char (&__x, __guptr , sizeof(*(ptr))); \
280228 (x) = *(__force __typeof__(*(ptr)) *)&__x; \
281229 break; \
282230 }; \
283231 case 2: { \
232+ const unsigned short __user *__guptr = ____guptr; \
284233 unsigned short __x; \
285234 \
286- __gu_err = __get_user_fn (&__x, ptr , sizeof(*(ptr))); \
235+ __grc = __get_user_short (&__x, __guptr , sizeof(*(ptr)));\
287236 (x) = *(__force __typeof__(*(ptr)) *)&__x; \
288237 break; \
289238 }; \
290239 case 4: { \
240+ const unsigned int __user *__guptr = ____guptr; \
291241 unsigned int __x; \
292242 \
293- __gu_err = __get_user_fn (&__x, ptr , sizeof(*(ptr))); \
243+ __grc = __get_user_int (&__x, __guptr , sizeof(*(ptr))); \
294244 (x) = *(__force __typeof__(*(ptr)) *)&__x; \
295245 break; \
296246 }; \
297247 case 8: { \
248+ const unsigned long __user *__guptr = ____guptr; \
298249 unsigned long __x; \
299250 \
300- __gu_err = __get_user_fn (&__x, ptr , sizeof(*(ptr))); \
251+ __grc = __get_user_long (&__x, __guptr , sizeof(*(ptr))); \
301252 (x) = *(__force __typeof__(*(ptr)) *)&__x; \
302253 break; \
303254 }; \
304255 default: \
305- __get_user_bad(); \
256+ __grc = __get_user_bad(); \
306257 break; \
307258 } \
308- __builtin_expect(__gu_err , 0); \
259+ __builtin_expect(__grc , 0); \
309260})
310261
311262#define get_user (x , ptr ) \
0 commit comments