2008-10-23 09:26:29 +04:00
# ifndef _ASM_X86_UACCESS_32_H
# define _ASM_X86_UACCESS_32_H
2005-04-17 02:20:36 +04:00
/*
* User space memory access functions
*/
# include <linux/errno.h>
# include <linux/thread_info.h>
# include <linux/prefetch.h>
# include <linux/string.h>
2008-02-04 18:47:59 +03:00
# include <asm/asm.h>
2005-04-17 02:20:36 +04:00
# include <asm/page.h>
2008-03-23 11:03:48 +03:00
unsigned long __must_check __copy_to_user_ll
( void __user * to , const void * from , unsigned long n ) ;
unsigned long __must_check __copy_from_user_ll
( void * to , const void __user * from , unsigned long n ) ;
unsigned long __must_check __copy_from_user_ll_nozero
( void * to , const void __user * from , unsigned long n ) ;
unsigned long __must_check __copy_from_user_ll_nocache
( void * to , const void __user * from , unsigned long n ) ;
unsigned long __must_check __copy_from_user_ll_nocache_nozero
( void * to , const void __user * from , unsigned long n ) ;
2005-04-17 02:20:36 +04:00
2007-05-02 21:27:06 +04:00
/**
* __copy_to_user_inatomic : - Copy a block of data into user space , with less checking .
* @ to : Destination address , in user space .
* @ from : Source address , in kernel space .
* @ n : Number of bytes to copy .
*
* Context : User context only .
*
* Copy data from kernel space to user space . Caller must check
* the specified block with access_ok ( ) before calling this function .
* The caller should also make sure he pins the user space address
2009-09-17 16:54:01 +04:00
* so that we don ' t result in page fault and sleep .
2007-05-02 21:27:06 +04:00
*
2005-04-17 02:20:36 +04:00
* Here we special - case 1 , 2 and 4 - byte copy_ * _user invocations . On a fault
* we return the initial request size ( 1 , 2 or 4 ) , as copy_ * _user should do .
* If a store crosses a page boundary and gets a fault , the x86 will not write
* anything , so this is accurate .
*/
2006-01-15 00:21:30 +03:00
static __always_inline unsigned long __must_check
2005-04-17 02:20:36 +04:00
__copy_to_user_inatomic ( void __user * to , const void * from , unsigned long n )
{
if ( __builtin_constant_p ( n ) ) {
unsigned long ret ;
switch ( n ) {
case 1 :
2008-03-23 11:03:48 +03:00
__put_user_size ( * ( u8 * ) from , ( u8 __user * ) to ,
1 , ret , 1 ) ;
2005-04-17 02:20:36 +04:00
return ret ;
case 2 :
2008-03-23 11:03:48 +03:00
__put_user_size ( * ( u16 * ) from , ( u16 __user * ) to ,
2 , ret , 2 ) ;
2005-04-17 02:20:36 +04:00
return ret ;
case 4 :
2008-03-23 11:03:48 +03:00
__put_user_size ( * ( u32 * ) from , ( u32 __user * ) to ,
4 , ret , 4 ) ;
2005-04-17 02:20:36 +04:00
return ret ;
}
}
return __copy_to_user_ll ( to , from , n ) ;
}
/**
2006-10-11 12:22:10 +04:00
* __copy_to_user : - Copy a block of data into user space , with less checking .
* @ to : Destination address , in user space .
* @ from : Source address , in kernel space .
2005-04-17 02:20:36 +04:00
* @ n : Number of bytes to copy .
*
* Context : User context only . This function may sleep .
*
2006-10-11 12:22:10 +04:00
* Copy data from kernel space to user space . Caller must check
2005-04-17 02:20:36 +04:00
* the specified block with access_ok ( ) before calling this function .
*
* Returns number of bytes that could not be copied .
* On success , this will be zero .
*/
2006-10-11 12:22:10 +04:00
static __always_inline unsigned long __must_check
__copy_to_user ( void __user * to , const void * from , unsigned long n )
{
2008-09-10 15:37:17 +04:00
might_fault ( ) ;
2008-09-10 15:37:17 +04:00
return __copy_to_user_inatomic ( to , from , n ) ;
2006-10-11 12:22:10 +04:00
}
2006-01-15 00:21:30 +03:00
static __always_inline unsigned long
2005-04-17 02:20:36 +04:00
__copy_from_user_inatomic ( void * to , const void __user * from , unsigned long n )
{
2006-06-25 16:48:02 +04:00
/* Avoid zeroing the tail if the copy fails..
* If ' n ' is constant and 1 , 2 , or 4 , we do still zero on a failure ,
* but as the zeroing behaviour is only significant when n is not
* constant , that shouldn ' t be a problem .
*/
if ( __builtin_constant_p ( n ) ) {
unsigned long ret ;
switch ( n ) {
case 1 :
__get_user_size ( * ( u8 * ) to , from , 1 , ret , 1 ) ;
return ret ;
case 2 :
__get_user_size ( * ( u16 * ) to , from , 2 , ret , 2 ) ;
return ret ;
case 4 :
__get_user_size ( * ( u32 * ) to , from , 4 , ret , 4 ) ;
return ret ;
}
}
return __copy_from_user_ll_nozero ( to , from , n ) ;
}
2006-10-11 12:22:10 +04:00
/**
* __copy_from_user : - Copy a block of data from user space , with less checking .
* @ to : Destination address , in kernel space .
* @ from : Source address , in user space .
* @ n : Number of bytes to copy .
*
* Context : User context only . This function may sleep .
*
* Copy data from user space to kernel space . Caller must check
* the specified block with access_ok ( ) before calling this function .
*
* Returns number of bytes that could not be copied .
* On success , this will be zero .
*
* If some data could not be copied , this function will pad the copied
* data to the requested size using zero bytes .
*
* An alternate version - __copy_from_user_inatomic ( ) - may be called from
* atomic context and will fail rather than sleep . In this case the
* uncopied bytes will * NOT * be padded with zeros . See fs / filemap . h
* for explanation of why this is needed .
*/
2006-06-25 16:48:02 +04:00
static __always_inline unsigned long
__copy_from_user ( void * to , const void __user * from , unsigned long n )
{
2008-09-10 15:37:17 +04:00
might_fault ( ) ;
2005-04-17 02:20:36 +04:00
if ( __builtin_constant_p ( n ) ) {
unsigned long ret ;
switch ( n ) {
case 1 :
__get_user_size ( * ( u8 * ) to , from , 1 , ret , 1 ) ;
return ret ;
case 2 :
__get_user_size ( * ( u16 * ) to , from , 2 , ret , 2 ) ;
return ret ;
case 4 :
__get_user_size ( * ( u32 * ) to , from , 4 , ret , 4 ) ;
return ret ;
}
}
return __copy_from_user_ll ( to , from , n ) ;
}
2006-06-25 16:48:02 +04:00
static __always_inline unsigned long __copy_from_user_nocache ( void * to ,
2006-06-23 13:04:16 +04:00
const void __user * from , unsigned long n )
{
2008-09-10 15:37:17 +04:00
might_fault ( ) ;
2006-06-23 13:04:16 +04:00
if ( __builtin_constant_p ( n ) ) {
unsigned long ret ;
switch ( n ) {
case 1 :
__get_user_size ( * ( u8 * ) to , from , 1 , ret , 1 ) ;
return ret ;
case 2 :
__get_user_size ( * ( u16 * ) to , from , 2 , ret , 2 ) ;
return ret ;
case 4 :
__get_user_size ( * ( u32 * ) to , from , 4 , ret , 4 ) ;
return ret ;
}
}
return __copy_from_user_ll_nocache ( to , from , n ) ;
}
2006-01-15 00:21:30 +03:00
static __always_inline unsigned long
2008-03-23 11:03:48 +03:00
__copy_from_user_inatomic_nocache ( void * to , const void __user * from ,
unsigned long n )
2005-04-17 02:20:36 +04:00
{
2006-06-25 16:48:02 +04:00
return __copy_from_user_ll_nocache_nozero ( to , from , n ) ;
2006-06-23 13:04:16 +04:00
}
2005-04-17 02:20:36 +04:00
unsigned long __must_check copy_to_user ( void __user * to ,
2008-03-23 11:03:48 +03:00
const void * from , unsigned long n ) ;
2009-09-26 16:33:01 +04:00
unsigned long __must_check _copy_from_user ( void * to ,
2008-03-23 11:03:48 +03:00
const void __user * from ,
unsigned long n ) ;
2009-09-26 16:33:01 +04:00
2009-09-30 15:05:23 +04:00
extern void copy_from_user_overflow ( void )
2009-10-02 18:50:50 +04:00
# ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
__compiletime_error ( " copy_from_user() buffer size is not provably correct " )
# else
2009-09-30 15:05:23 +04:00
__compiletime_warning ( " copy_from_user() buffer size is not provably correct " )
# endif
;
2009-09-26 16:33:01 +04:00
static inline unsigned long __must_check copy_from_user ( void * to ,
const void __user * from ,
unsigned long n )
{
int sz = __compiletime_object_size ( to ) ;
if ( likely ( sz = = - 1 | | sz > = n ) )
2010-01-05 16:19:11 +03:00
n = _copy_from_user ( to , from , n ) ;
2009-09-26 16:33:01 +04:00
else
2009-09-30 15:05:23 +04:00
copy_from_user_overflow ( ) ;
2010-01-05 16:19:11 +03:00
return n ;
2009-09-26 16:33:01 +04:00
}
2005-04-17 02:20:36 +04:00
long __must_check strncpy_from_user ( char * dst , const char __user * src ,
2008-03-23 11:03:48 +03:00
long count ) ;
2005-04-17 02:20:36 +04:00
long __must_check __strncpy_from_user ( char * dst ,
2008-03-23 11:03:48 +03:00
const char __user * src , long count ) ;
2005-04-17 02:20:36 +04:00
/**
* strlen_user : - Get the size of a string in user space .
* @ str : The string to measure .
*
* Context : User context only . This function may sleep .
*
* Get the size of a NUL - terminated string in user space .
*
* Returns the size of the string INCLUDING the terminating NUL .
* On exception , returns 0.
*
* If there is a limit on the length of a valid string , you may wish to
* consider using strnlen_user ( ) instead .
*/
2007-07-21 19:11:26 +04:00
# define strlen_user(str) strnlen_user(str, LONG_MAX)
2005-04-17 02:20:36 +04:00
long strnlen_user ( const char __user * str , long n ) ;
unsigned long __must_check clear_user ( void __user * mem , unsigned long len ) ;
unsigned long __must_check __clear_user ( void __user * mem , unsigned long len ) ;
2008-10-23 09:26:29 +04:00
# endif /* _ASM_X86_UACCESS_32_H */