|
@@ -60,47 +60,14 @@ static inline int __range_ok(unsigned long addr, unsigned long size)
|
|
|
|
|
|
#define access_ok(type, addr, size) __access_ok(addr, size)
|
|
|
|
|
|
-/**
|
|
|
- * __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 if pagefaults are
|
|
|
- * enabled.
|
|
|
- *
|
|
|
- * 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.
|
|
|
- */
|
|
|
-unsigned long __must_check __copy_from_user(void *to, const void __user *from,
|
|
|
- unsigned long n);
|
|
|
+unsigned long __must_check
|
|
|
+raw_copy_from_user(void *to, const void __user *from, unsigned long n);
|
|
|
|
|
|
-/**
|
|
|
- * __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.
|
|
|
- * @n: Number of bytes to copy.
|
|
|
- *
|
|
|
- * Context: User context only. This function may sleep if pagefaults are
|
|
|
- * enabled.
|
|
|
- *
|
|
|
- * Copy data from kernel space to user 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.
|
|
|
- */
|
|
|
-unsigned long __must_check __copy_to_user(void __user *to, const void *from,
|
|
|
- unsigned long n);
|
|
|
+unsigned long __must_check
|
|
|
+raw_copy_to_user(void __user *to, const void *from, unsigned long n);
|
|
|
|
|
|
-#define __copy_to_user_inatomic __copy_to_user
|
|
|
-#define __copy_from_user_inatomic __copy_from_user
|
|
|
+#define INLINE_COPY_FROM_USER
|
|
|
+#define INLINE_COPY_TO_USER
|
|
|
|
|
|
#ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
|
|
|
|
|
@@ -189,13 +156,13 @@ static inline int __get_user_fn(void *x, const void __user *ptr, unsigned long s
|
|
|
|
|
|
static inline int __put_user_fn(void *x, void __user *ptr, unsigned long size)
|
|
|
{
|
|
|
- size = __copy_to_user(ptr, x, size);
|
|
|
+ size = raw_copy_to_user(ptr, x, size);
|
|
|
return size ? -EFAULT : 0;
|
|
|
}
|
|
|
|
|
|
static inline int __get_user_fn(void *x, const void __user *ptr, unsigned long size)
|
|
|
{
|
|
|
- size = __copy_from_user(x, ptr, size);
|
|
|
+ size = raw_copy_from_user(x, ptr, size);
|
|
|
return size ? -EFAULT : 0;
|
|
|
}
|
|
|
|
|
@@ -285,77 +252,8 @@ int __get_user_bad(void) __attribute__((noreturn));
|
|
|
#define __put_user_unaligned __put_user
|
|
|
#define __get_user_unaligned __get_user
|
|
|
|
|
|
-extern void __compiletime_error("usercopy buffer size is too small")
|
|
|
-__bad_copy_user(void);
|
|
|
-
|
|
|
-static inline void copy_user_overflow(int size, unsigned long count)
|
|
|
-{
|
|
|
- WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * copy_to_user: - Copy a block of data into user space.
|
|
|
- * @to: Destination address, in user space.
|
|
|
- * @from: Source address, in kernel space.
|
|
|
- * @n: Number of bytes to copy.
|
|
|
- *
|
|
|
- * Context: User context only. This function may sleep if pagefaults are
|
|
|
- * enabled.
|
|
|
- *
|
|
|
- * Copy data from kernel space to user space.
|
|
|
- *
|
|
|
- * Returns number of bytes that could not be copied.
|
|
|
- * On success, this will be zero.
|
|
|
- */
|
|
|
-static inline unsigned long __must_check
|
|
|
-copy_to_user(void __user *to, const void *from, unsigned long n)
|
|
|
-{
|
|
|
- might_fault();
|
|
|
- return __copy_to_user(to, from, n);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * copy_from_user: - Copy a block of data from user space.
|
|
|
- * @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 if pagefaults are
|
|
|
- * enabled.
|
|
|
- *
|
|
|
- * Copy data from user space to kernel space.
|
|
|
- *
|
|
|
- * 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.
|
|
|
- */
|
|
|
-static inline unsigned long __must_check
|
|
|
-copy_from_user(void *to, const void __user *from, unsigned long n)
|
|
|
-{
|
|
|
- unsigned int sz = __compiletime_object_size(to);
|
|
|
-
|
|
|
- might_fault();
|
|
|
- if (unlikely(sz != -1 && sz < n)) {
|
|
|
- if (!__builtin_constant_p(n))
|
|
|
- copy_user_overflow(sz, n);
|
|
|
- else
|
|
|
- __bad_copy_user();
|
|
|
- return n;
|
|
|
- }
|
|
|
- return __copy_from_user(to, from, n);
|
|
|
-}
|
|
|
-
|
|
|
unsigned long __must_check
|
|
|
-__copy_in_user(void __user *to, const void __user *from, unsigned long n);
|
|
|
-
|
|
|
-static inline unsigned long __must_check
|
|
|
-copy_in_user(void __user *to, const void __user *from, unsigned long n)
|
|
|
-{
|
|
|
- might_fault();
|
|
|
- return __copy_in_user(to, from, n);
|
|
|
-}
|
|
|
+raw_copy_in_user(void __user *to, const void __user *from, unsigned long n);
|
|
|
|
|
|
/*
|
|
|
* Copy a null terminated string from userspace.
|