2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
6 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 03, 04 by Ralf Baechle
7 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
8 * Copyright (C) 2007 Maciej W. Rozycki
9 * Copyright (C) 2014, Imagination Technologies Ltd.
11 #ifndef _ASM_UACCESS_H
12 #define _ASM_UACCESS_H
14 #include <linux/kernel.h>
15 #include <linux/string.h>
16 #include <asm/asm-eva.h>
17 #include <asm/extable.h>
21 #define __UA_LIMIT 0x80000000UL
22 #define TASK_SIZE_MAX KSEG0
24 #define __UA_ADDR ".word"
26 #define __UA_ADDU "addu"
30 #endif /* CONFIG_32BIT */
34 extern u64 __ua_limit
;
36 #define __UA_LIMIT __ua_limit
37 #define TASK_SIZE_MAX XKSSEG
39 #define __UA_ADDR ".dword"
41 #define __UA_ADDU "daddu"
45 #endif /* CONFIG_64BIT */
47 #include <asm-generic/access_ok.h>
50 * put_user: - Write a simple value into user space.
51 * @x: Value to copy to user space.
52 * @ptr: Destination address, in user space.
54 * Context: User context only. This function may sleep if pagefaults are
57 * This macro copies a single simple value from kernel space to user
58 * space. It supports simple types like char and int, but not larger
59 * data types like structures or arrays.
61 * @ptr must have pointer-to-simple-variable type, and @x must be assignable
62 * to the result of dereferencing @ptr.
64 * Returns zero on success, or -EFAULT on error.
66 #define put_user(x, ptr) \
68 __typeof__(*(ptr)) __user *__p = (ptr); \
71 access_ok(__p, sizeof(*__p)) ? __put_user((x), __p) : -EFAULT; \
75 * get_user: - Get a simple variable from user space.
76 * @x: Variable to store result.
77 * @ptr: Source address, in user space.
79 * Context: User context only. This function may sleep if pagefaults are
82 * This macro copies a single simple variable from user space to kernel
83 * space. It supports simple types like char and int, but not larger
84 * data types like structures or arrays.
86 * @ptr must have pointer-to-simple-variable type, and the result of
87 * dereferencing @ptr must be assignable to @x without a cast.
89 * Returns zero on success, or -EFAULT on error.
90 * On error, the variable @x is set to zero.
92 #define get_user(x, ptr) \
94 const __typeof__(*(ptr)) __user *__p = (ptr); \
97 access_ok(__p, sizeof(*__p)) ? __get_user((x), __p) : \
102 * __put_user: - Write a simple value into user space, with less checking.
103 * @x: Value to copy to user space.
104 * @ptr: Destination address, in user space.
106 * Context: User context only. This function may sleep if pagefaults are
109 * This macro copies a single simple value from kernel space to user
110 * space. It supports simple types like char and int, but not larger
111 * data types like structures or arrays.
113 * @ptr must have pointer-to-simple-variable type, and @x must be assignable
114 * to the result of dereferencing @ptr.
116 * Caller must check the pointer with access_ok() before calling this
119 * Returns zero on success, or -EFAULT on error.
121 #define __put_user(x, ptr) \
123 __typeof__(*(ptr)) __user *__pu_ptr = (ptr); \
124 __typeof__(*(ptr)) __pu_val = (x); \
127 __chk_user_ptr(__pu_ptr); \
128 switch (sizeof(*__pu_ptr)) { \
130 __put_data_asm(user_sb, __pu_ptr); \
133 __put_data_asm(user_sh, __pu_ptr); \
136 __put_data_asm(user_sw, __pu_ptr); \
139 __PUT_DW(user_sd, __pu_ptr); \
149 * __get_user: - Get a simple variable from user space, with less checking.
150 * @x: Variable to store result.
151 * @ptr: Source address, in user space.
153 * Context: User context only. This function may sleep if pagefaults are
156 * This macro copies a single simple variable from user space to kernel
157 * space. It supports simple types like char and int, but not larger
158 * data types like structures or arrays.
160 * @ptr must have pointer-to-simple-variable type, and the result of
161 * dereferencing @ptr must be assignable to @x without a cast.
163 * Caller must check the pointer with access_ok() before calling this
166 * Returns zero on success, or -EFAULT on error.
167 * On error, the variable @x is set to zero.
169 #define __get_user(x, ptr) \
171 const __typeof__(*(ptr)) __user *__gu_ptr = (ptr); \
174 __chk_user_ptr(__gu_ptr); \
175 switch (sizeof(*__gu_ptr)) { \
177 __get_data_asm((x), user_lb, __gu_ptr); \
180 __get_data_asm((x), user_lh, __gu_ptr); \
183 __get_data_asm((x), user_lw, __gu_ptr); \
186 __GET_DW((x), user_ld, __gu_ptr); \
195 struct __large_struct
{ unsigned long buf
[100]; };
196 #define __m(x) (*(struct __large_struct __user *)(x))
199 #define __GET_DW(val, insn, ptr) __get_data_asm_ll32(val, insn, ptr)
202 #define __GET_DW(val, insn, ptr) __get_data_asm(val, insn, ptr)
205 #define __get_data_asm(val, insn, addr) \
209 __asm__ __volatile__( \
210 "1: "insn("%1", "%3")" \n" \
213 " .section .fixup,\"ax\" \n" \
218 " .section __ex_table,\"a\" \n" \
219 " "__UA_ADDR "\t1b, 3b \n" \
221 : "=r" (__gu_err), "=r" (__gu_tmp) \
222 : "0" (0), "o" (__m(addr)), "i" (-EFAULT)); \
224 (val) = (__typeof__(*(addr))) __gu_tmp; \
228 * Get a long long 64 using 32 bit registers.
230 #define __get_data_asm_ll32(val, insn, addr) \
233 unsigned long long l; \
234 __typeof__(*(addr)) t; \
237 __asm__ __volatile__( \
238 "1: " insn("%1", "(%3)")" \n" \
239 "2: " insn("%D1", "4(%3)")" \n" \
242 " .section .fixup,\"ax\" \n" \
248 " .section __ex_table,\"a\" \n" \
249 " " __UA_ADDR " 1b, 4b \n" \
250 " " __UA_ADDR " 2b, 4b \n" \
252 : "=r" (__gu_err), "=&r" (__gu_tmp.l) \
253 : "0" (0), "r" (addr), "i" (-EFAULT)); \
255 (val) = __gu_tmp.t; \
258 #define __get_kernel_nofault(dst, src, type, err_label) \
262 switch (sizeof(type)) { \
264 __get_data_asm(*(type *)(dst), kernel_lb, \
265 (__force type *)(src)); \
268 __get_data_asm(*(type *)(dst), kernel_lh, \
269 (__force type *)(src)); \
272 __get_data_asm(*(type *)(dst), kernel_lw, \
273 (__force type *)(src)); \
276 __GET_DW(*(type *)(dst), kernel_ld, \
277 (__force type *)(src)); \
283 if (unlikely(__gu_err)) \
288 * Yuck. We need two variants, one for 64bit operation and one
289 * for 32 bit mode and old iron.
292 #define __PUT_DW(insn, ptr) __put_data_asm_ll32(insn, ptr)
295 #define __PUT_DW(insn, ptr) __put_data_asm(insn, ptr)
298 #define __put_data_asm(insn, ptr) \
300 __asm__ __volatile__( \
301 "1: "insn("%z2", "%3")" # __put_data_asm \n" \
304 " .section .fixup,\"ax\" \n" \
308 " .section __ex_table,\"a\" \n" \
309 " " __UA_ADDR " 1b, 3b \n" \
312 : "0" (0), "Jr" (__pu_val), "o" (__m(ptr)), \
316 #define __put_data_asm_ll32(insn, ptr) \
318 __asm__ __volatile__( \
319 "1: "insn("%2", "(%3)")" # __put_data_asm_ll32 \n" \
320 "2: "insn("%D2", "4(%3)")" \n" \
323 " .section .fixup,\"ax\" \n" \
327 " .section __ex_table,\"a\" \n" \
328 " " __UA_ADDR " 1b, 4b \n" \
329 " " __UA_ADDR " 2b, 4b \n" \
332 : "0" (0), "r" (__pu_val), "r" (ptr), \
336 #define __put_kernel_nofault(dst, src, type, err_label) \
341 __pu_val = *(__force type *)(src); \
342 switch (sizeof(type)) { \
344 __put_data_asm(kernel_sb, (type *)(dst)); \
347 __put_data_asm(kernel_sh, (type *)(dst)); \
350 __put_data_asm(kernel_sw, (type *)(dst)) \
353 __PUT_DW(kernel_sd, (type *)(dst)); \
359 if (unlikely(__pu_err)) \
365 * We're generating jump to subroutines which will be outside the range of
369 #define __MODULE_JAL(destination) \
371 __UA_LA "\t$1, " #destination "\n\t" \
375 #define __MODULE_JAL(destination) \
376 "jal\t" #destination "\n\t"
379 #if defined(CONFIG_CPU_DADDI_WORKAROUNDS) || (defined(CONFIG_EVA) && \
380 defined(CONFIG_CPU_HAS_PREFETCH))
381 #define DADDI_SCRATCH "$3"
383 #define DADDI_SCRATCH "$0"
386 extern size_t __raw_copy_from_user(void *__to
, const void *__from
, size_t __n
);
387 extern size_t __raw_copy_to_user(void *__to
, const void *__from
, size_t __n
);
389 static inline unsigned long
390 raw_copy_from_user(void *to
, const void __user
*from
, unsigned long n
)
392 register void *__cu_to_r
__asm__("$4");
393 register const void __user
*__cu_from_r
__asm__("$5");
394 register long __cu_len_r
__asm__("$6");
400 __asm__
__volatile__(
401 ".set\tnoreorder\n\t"
402 __MODULE_JAL(__raw_copy_from_user
)
404 __UA_ADDU
"\t$1, %1, %2\n\t"
407 : "+r" (__cu_to_r
), "+r" (__cu_from_r
), "+r" (__cu_len_r
)
409 : "$8", "$9", "$10", "$11", "$12", "$14", "$15", "$24", "$31",
410 DADDI_SCRATCH
, "memory");
415 static inline unsigned long
416 raw_copy_to_user(void __user
*to
, const void *from
, unsigned long n
)
418 register void __user
*__cu_to_r
__asm__("$4");
419 register const void *__cu_from_r
__asm__("$5");
420 register long __cu_len_r
__asm__("$6");
423 __cu_from_r
= (from
);
426 __asm__
__volatile__(
427 __MODULE_JAL(__raw_copy_to_user
)
428 : "+r" (__cu_to_r
), "+r" (__cu_from_r
), "+r" (__cu_len_r
)
430 : "$8", "$9", "$10", "$11", "$12", "$14", "$15", "$24", "$31",
431 DADDI_SCRATCH
, "memory");
436 #define INLINE_COPY_FROM_USER
437 #define INLINE_COPY_TO_USER
439 extern __kernel_size_t
__bzero(void __user
*addr
, __kernel_size_t size
);
442 * __clear_user: - Zero a block of memory in user space, with less checking.
443 * @to: Destination address, in user space.
444 * @n: Number of bytes to zero.
446 * Zero a block of memory in user space. Caller must check
447 * the specified block with access_ok() before calling this function.
449 * Returns number of bytes that could not be cleared.
450 * On success, this will be zero.
452 static inline __kernel_size_t
453 __clear_user(void __user
*addr
, __kernel_size_t size
)
457 #ifdef CONFIG_CPU_MICROMIPS
458 /* micromips memset / bzero also clobbers t7 & t8 */
459 #define bzero_clobbers "$4", "$5", "$6", __UA_t0, __UA_t1, "$15", "$24", "$31"
461 #define bzero_clobbers "$4", "$5", "$6", __UA_t0, __UA_t1, "$31"
462 #endif /* CONFIG_CPU_MICROMIPS */
465 __asm__
__volatile__(
469 __MODULE_JAL(__bzero
)
472 : "r" (addr
), "r" (size
)
478 #define clear_user(addr,n) \
480 void __user * __cl_addr = (addr); \
481 unsigned long __cl_size = (n); \
482 if (__cl_size && access_ok(__cl_addr, __cl_size)) \
483 __cl_size = __clear_user(__cl_addr, __cl_size); \
487 extern long __strncpy_from_user_asm(char *__to
, const char __user
*__from
, long __len
);
490 * strncpy_from_user: - Copy a NUL terminated string from userspace.
491 * @dst: Destination address, in kernel space. This buffer must be at
492 * least @count bytes long.
493 * @src: Source address, in user space.
494 * @count: Maximum number of bytes to copy, including the trailing NUL.
496 * Copies a NUL-terminated string from userspace to kernel space.
498 * On success, returns the length of the string (not including the trailing
501 * If access to userspace fails, returns -EFAULT (some data may have been
504 * If @count is smaller than the length of the string, copies @count bytes
505 * and returns @count.
508 strncpy_from_user(char *__to
, const char __user
*__from
, long __len
)
512 if (!access_ok(__from
, __len
))
516 __asm__
__volatile__(
520 __MODULE_JAL(__strncpy_from_user_asm
)
523 : "r" (__to
), "r" (__from
), "r" (__len
)
524 : "$2", "$3", "$4", "$5", "$6", __UA_t0
, "$31", "memory");
529 extern long __strnlen_user_asm(const char __user
*s
, long n
);
532 * strnlen_user: - Get the size of a string in user space.
533 * @str: The string to measure.
535 * Context: User context only. This function may sleep if pagefaults are
538 * Get the size of a NUL-terminated string in user space.
540 * Returns the size of the string INCLUDING the terminating NUL.
541 * On exception, returns 0.
542 * If the string is too long, returns a value greater than @n.
544 static inline long strnlen_user(const char __user
*s
, long n
)
548 if (!access_ok(s
, 1))
552 __asm__
__volatile__(
555 __MODULE_JAL(__strnlen_user_asm
)
559 : "$2", "$4", "$5", __UA_t0
, "$31");
564 #endif /* _ASM_UACCESS_H */