|  | @@ -139,3 +139,70 @@ extern int fixup_exception(struct pt_regs *regs);
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  |   * This gets kind of ugly. We want to return _two_ values in "get_user()"
 | 
	
		
			
				|  |  |   * and yet we don't want to do any pointers, because that is too much
 | 
	
		
			
				|  |  | + * of a performance impact. Thus we have a few rather ugly macros here,
 | 
	
		
			
				|  |  | + * and hide all the uglyness from the user.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * The "__xxx" versions of the user access functions are versions that
 | 
	
		
			
				|  |  | + * do not verify the address space, that must have been done previously
 | 
	
		
			
				|  |  | + * with a separate "access_ok()" call (this is used when we do multiple
 | 
	
		
			
				|  |  | + * accesses to the same area of user memory).
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* Careful: we have to cast the result to the type of the pointer for sign
 | 
	
		
			
				|  |  | +   reasons */
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * get_user: - Get a simple variable from user space.
 | 
	
		
			
				|  |  | + * @x:   Variable to store result.
 | 
	
		
			
				|  |  | + * @ptr: Source address, in user space.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Context: User context only.  This function may sleep.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * This macro copies a single simple variable from user space to kernel
 | 
	
		
			
				|  |  | + * space.  It supports simple types like char and int, but not larger
 | 
	
		
			
				|  |  | + * data types like structures or arrays.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @ptr must have pointer-to-simple-variable type, and the result of
 | 
	
		
			
				|  |  | + * dereferencing @ptr must be assignable to @x without a cast.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Returns zero on success, or -EFAULT on error.
 | 
	
		
			
				|  |  | + * On error, the variable @x is set to zero.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +#define get_user(x,ptr)							\
 | 
	
		
			
				|  |  | +	__get_user_check((x),(ptr),sizeof(*(ptr)))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * put_user: - Write a simple value into user space.
 | 
	
		
			
				|  |  | + * @x:   Value to copy to user space.
 | 
	
		
			
				|  |  | + * @ptr: Destination address, in user space.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Context: User context only.  This function may sleep.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * This macro copies a single simple value from kernel space to user
 | 
	
		
			
				|  |  | + * space.  It supports simple types like char and int, but not larger
 | 
	
		
			
				|  |  | + * data types like structures or arrays.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @ptr must have pointer-to-simple-variable type, and @x must be assignable
 | 
	
		
			
				|  |  | + * to the result of dereferencing @ptr.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Returns zero on success, or -EFAULT on error.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +#define put_user(x,ptr)							\
 | 
	
		
			
				|  |  | +	__put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * __get_user: - Get a simple variable from user space, with less checking.
 | 
	
		
			
				|  |  | + * @x:   Variable to store result.
 | 
	
		
			
				|  |  | + * @ptr: Source address, in user space.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Context: User context only.  This function may sleep.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * This macro copies a single simple variable from user space to kernel
 | 
	
		
			
				|  |  | + * space.  It supports simple types like char and int, but not larger
 | 
	
		
			
				|  |  | + * data types like structures or arrays.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @ptr must have pointer-to-simple-variable type, and the result of
 | 
	
		
			
				|  |  | + * dereferencing @ptr must be assignable to @x without a cast.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * Caller must check the pointer with access_ok() before calling this
 | 
	
		
			
				|  |  | + * function.
 | 
	
		
			
				|  |  | + *
 |