asm-generic: uaccess: Allow arches to over-ride __{get,put}_user_fn()
As of now these default to calling the arch provided __copy_{to,from}_user()
routines which being general purpose (w.r.t buffer alignment and lengths)
would lead to alignment checks in generated code (for arches which don't
support unaligned load/stores).
Given that in this case we already know that data involved is "unit"
sized and aligned, using the vanilla copy backend is a bit wasteful.
This change thus allows arches to over-ride the aforementioned routines.
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
	
	
This commit is contained in:
		
					parent
					
						
							
								43697cb097
							
						
					
				
			
			
				commit
				
					
						05d88a4937
					
				
			
		
					 1 changed files with 11 additions and 0 deletions
				
			
		|  | @ -169,12 +169,18 @@ static inline __must_check long __copy_to_user(void __user *to, | ||||||
| 		-EFAULT;					\ | 		-EFAULT;					\ | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
|  | #ifndef __put_user_fn | ||||||
|  | 
 | ||||||
| static inline int __put_user_fn(size_t size, void __user *ptr, void *x) | static inline int __put_user_fn(size_t size, void __user *ptr, void *x) | ||||||
| { | { | ||||||
| 	size = __copy_to_user(ptr, x, size); | 	size = __copy_to_user(ptr, x, size); | ||||||
| 	return size ? -EFAULT : size; | 	return size ? -EFAULT : size; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #define __put_user_fn(sz, u, k)	__put_user_fn(sz, u, k) | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| extern int __put_user_bad(void) __attribute__((noreturn)); | extern int __put_user_bad(void) __attribute__((noreturn)); | ||||||
| 
 | 
 | ||||||
| #define __get_user(x, ptr)					\ | #define __get_user(x, ptr)					\ | ||||||
|  | @ -225,12 +231,17 @@ extern int __put_user_bad(void) __attribute__((noreturn)); | ||||||
| 		-EFAULT;					\ | 		-EFAULT;					\ | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
|  | #ifndef __get_user_fn | ||||||
| static inline int __get_user_fn(size_t size, const void __user *ptr, void *x) | static inline int __get_user_fn(size_t size, const void __user *ptr, void *x) | ||||||
| { | { | ||||||
| 	size = __copy_from_user(x, ptr, size); | 	size = __copy_from_user(x, ptr, size); | ||||||
| 	return size ? -EFAULT : size; | 	return size ? -EFAULT : size; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #define __get_user_fn(sz, u, k)	__get_user_fn(sz, u, k) | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| extern int __get_user_bad(void) __attribute__((noreturn)); | extern int __get_user_bad(void) __attribute__((noreturn)); | ||||||
| 
 | 
 | ||||||
| #ifndef __copy_from_user_inatomic | #ifndef __copy_from_user_inatomic | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Vineet Gupta
				Vineet Gupta