|
@@ -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.
|
|
|
+ *
|