Go to the documentation of this file.
11 #ifndef _ASM_MICROBLAZE_UACCESS_H
12 #define _ASM_MICROBLAZE_UACCESS_H
17 #include <linux/kernel.h>
18 #include <linux/errno.h>
19 #include <linux/sched.h>
24 #include <asm/pgtable.h>
25 #include <linux/string.h>
28 #define VERIFY_WRITE 1
42 # define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
45 # define KERNEL_DS MAKE_MM_SEG(0)
46 # define USER_DS KERNEL_DS
48 # define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)
49 # define USER_DS MAKE_MM_SEG(TASK_SIZE - 1)
52 # define get_ds() (KERNEL_DS)
53 # define get_fs() (current_thread_info()->addr_limit)
54 # define set_fs(val) (current_thread_info()->addr_limit = (val))
56 # define segment_eq(a, b) ((a).seg == (b).seg)
80 static inline int ___range_ok(
unsigned long addr,
unsigned long size)
86 #define __range_ok(addr, size) \
87 ___range_ok((unsigned long)(addr), (unsigned long)(size))
89 #define access_ok(type, addr, size) (__range_ok((addr), (size)) == 0)
97 #define access_ok(type, addr, size) \
98 (get_fs().seg >= (((unsigned long)(addr)) | \
99 (size) | ((unsigned long)(addr) + (size))))
107 # define __FIXUP_SECTION ".section .fixup,\"ax\"\n"
108 # define __EX_TABLE_SECTION ".section __ex_table,\"a\"\n"
110 # define __FIXUP_SECTION ".section .discard,\"ax\"\n"
111 # define __EX_TABLE_SECTION ".section .discard,\"a\"\n"
115 const void __user *
from,
unsigned long size);
123 "1: sb r0, %1, r0;" \
124 " addik %0, %0, -1;" \
126 " addik %1, %1, 1;" \
131 :
"=r"(n),
"=r"(to) \
148 extern long __user_bad(
void);
150 #define __get_user_asm(insn, __gu_ptr, __gu_val, __gu_err) \
152 __asm__ __volatile__ ( \
153 "1:" insn " %1, %2, r0;" \
154 " addk %0, r0, r0;" \
158 " addik %0, r0, %3;" \
163 : "=&r"(__gu_err), "=r"(__gu_val) \
164 : "r"(__gu_ptr), "i"(-EFAULT) \
185 #define get_user(x, ptr) \
186 __get_user_check((x), (ptr), sizeof(*(ptr)))
188 #define __get_user_check(x, ptr, size) \
190 unsigned long __gu_val = 0; \
191 const typeof(*(ptr)) __user *__gu_addr = (ptr); \
194 if (access_ok(VERIFY_READ, __gu_addr, size)) { \
197 __get_user_asm("lbu", __gu_addr, __gu_val, \
201 __get_user_asm("lhu", __gu_addr, __gu_val, \
205 __get_user_asm("lw", __gu_addr, __gu_val, \
209 __gu_err = __user_bad(); \
213 __gu_err = -EFAULT; \
215 x = (typeof(*(ptr)))__gu_val; \
219 #define __get_user(x, ptr) \
221 unsigned long __gu_val; \
224 switch (sizeof(*(ptr))) { \
226 __get_user_asm("lbu", (ptr), __gu_val, __gu_err); \
229 __get_user_asm("lhu", (ptr), __gu_val, __gu_err); \
232 __get_user_asm("lw", (ptr), __gu_val, __gu_err); \
235 __gu_err = __user_bad();\
237 x = (__typeof__(*(ptr))) __gu_val; \
242 #define __put_user_asm(insn, __gu_ptr, __gu_val, __gu_err) \
244 __asm__ __volatile__ ( \
245 "1:" insn " %1, %2, r0;" \
246 " addk %0, r0, r0;" \
250 " addik %0, r0, %3;" \
256 : "r"(__gu_val), "r"(__gu_ptr), "i"(-EFAULT) \
260 #define __put_user_asm_8(__gu_ptr, __gu_val, __gu_err) \
262 __asm__ __volatile__ (" lwi %0, %1, 0;" \
263 "1: swi %0, %2, 0;" \
265 "2: swi %0, %2, 4;" \
266 " addk %0, r0, r0;" \
270 " addik %0, r0, %3;" \
273 ".word 1b,4b,2b,4b;" \
276 : "r"(&__gu_val), "r"(__gu_ptr), "i"(-EFAULT) \
296 #define put_user(x, ptr) \
297 __put_user_check((x), (ptr), sizeof(*(ptr)))
299 #define __put_user_check(x, ptr, size) \
301 typeof(*(ptr)) __pu_val; \
302 typeof(*(ptr)) __user *__pu_addr = (ptr); \
306 if (access_ok(VERIFY_WRITE, __pu_addr, size)) { \
309 __put_user_asm("sb", __pu_addr, __pu_val, \
313 __put_user_asm("sh", __pu_addr, __pu_val, \
317 __put_user_asm("sw", __pu_addr, __pu_val, \
321 __put_user_asm_8(__pu_addr, __pu_val, __pu_err);\
324 __pu_err = __user_bad(); \
328 __pu_err = -EFAULT; \
333 #define __put_user(x, ptr) \
335 __typeof__(*(ptr)) volatile __gu_val = (x); \
337 switch (sizeof(__gu_val)) { \
339 __put_user_asm("sb", (ptr), __gu_val, __gu_err); \
342 __put_user_asm("sh", (ptr), __gu_val, __gu_err); \
345 __put_user_asm("sw", (ptr), __gu_val, __gu_err); \
348 __put_user_asm_8((ptr), __gu_val, __gu_err); \
351 __gu_err = __user_bad(); \
358 #define __copy_from_user(to, from, n) \
359 __copy_tofrom_user((__force void __user *)(to), \
360 (void __user *)(from), (n))
361 #define __copy_from_user_inatomic(to, from, n) \
362 __copy_from_user((to), (from), (n))
365 const void __user *
from,
unsigned long n)
373 #define __copy_to_user(to, from, n) \
374 __copy_tofrom_user((void __user *)(to), \
375 (__force const void __user *)(from), (n))
376 #define __copy_to_user_inatomic(to, from, n) __copy_to_user((to), (from), (n))
379 const void *from,
unsigned long n)
390 extern int __strncpy_user(
char *to,
const char __user *from,
int len);
392 #define __strncpy_from_user __strncpy_user
409 static inline long strnlen_user(
const char __user *src,
long n)