x86: move __get_user and __put_user into uaccess.h.
We also carry the unaligned version with us. Only x86_64 uses it, but there's no problem in defining it. Signed-off-by: Glauber Costa <gcosta@redhat.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
e30a44fdbf
commit
8cb834e99f
3 changed files with 47 additions and 54 deletions
|
@ -383,7 +383,54 @@ struct __large_struct { unsigned long buf[100]; };
|
||||||
_ASM_EXTABLE(1b, 3b) \
|
_ASM_EXTABLE(1b, 3b) \
|
||||||
: "=r"(err) \
|
: "=r"(err) \
|
||||||
: ltype(x), "m" (__m(addr)), "i" (errret), "0" (err))
|
: ltype(x), "m" (__m(addr)), "i" (errret), "0" (err))
|
||||||
|
/**
|
||||||
|
* __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.
|
||||||
|
*
|
||||||
|
* Returns zero on success, or -EFAULT on error.
|
||||||
|
* On error, the variable @x is set to zero.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define __get_user(x, ptr) \
|
||||||
|
__get_user_nocheck((x), (ptr), sizeof(*(ptr)))
|
||||||
|
/**
|
||||||
|
* __put_user: - Write a simple value into user space, with less checking.
|
||||||
|
* @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.
|
||||||
|
*
|
||||||
|
* Caller must check the pointer with access_ok() before calling this
|
||||||
|
* function.
|
||||||
|
*
|
||||||
|
* Returns zero on success, or -EFAULT on error.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define __put_user(x, ptr) \
|
||||||
|
__put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
|
||||||
|
|
||||||
|
#define __get_user_unaligned __get_user
|
||||||
|
#define __put_user_unaligned __put_user
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
# include "uaccess_32.h"
|
# include "uaccess_32.h"
|
||||||
|
|
|
@ -20,52 +20,6 @@ extern struct movsl_mask {
|
||||||
} ____cacheline_aligned_in_smp movsl_mask;
|
} ____cacheline_aligned_in_smp movsl_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
|
||||||
* __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.
|
|
||||||
*
|
|
||||||
* Returns zero on success, or -EFAULT on error.
|
|
||||||
* On error, the variable @x is set to zero.
|
|
||||||
*/
|
|
||||||
#define __get_user(x, ptr) \
|
|
||||||
__get_user_nocheck((x), (ptr), sizeof(*(ptr)))
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* __put_user: - Write a simple value into user space, with less checking.
|
|
||||||
* @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.
|
|
||||||
*
|
|
||||||
* Caller must check the pointer with access_ok() before calling this
|
|
||||||
* function.
|
|
||||||
*
|
|
||||||
* Returns zero on success, or -EFAULT on error.
|
|
||||||
*/
|
|
||||||
#define __put_user(x, ptr) \
|
|
||||||
__put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
|
|
||||||
|
|
||||||
unsigned long __must_check __copy_to_user_ll
|
unsigned long __must_check __copy_to_user_ll
|
||||||
(void __user *to, const void *from, unsigned long n);
|
(void __user *to, const void *from, unsigned long n);
|
||||||
unsigned long __must_check __copy_from_user_ll
|
unsigned long __must_check __copy_from_user_ll
|
||||||
|
|
|
@ -11,14 +11,6 @@
|
||||||
|
|
||||||
#define ARCH_HAS_SEARCH_EXTABLE
|
#define ARCH_HAS_SEARCH_EXTABLE
|
||||||
|
|
||||||
#define __get_user(x, ptr) \
|
|
||||||
__get_user_nocheck((x), (ptr), sizeof(*(ptr)))
|
|
||||||
#define __put_user(x, ptr) \
|
|
||||||
__put_user_nocheck((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)))
|
|
||||||
|
|
||||||
#define __get_user_unaligned __get_user
|
|
||||||
#define __put_user_unaligned __put_user
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy To/From Userspace
|
* Copy To/From Userspace
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue