1 /* SPDX-License-Identifier: GPL-2.0 */
3 #ifndef __ASM_CSKY_UACCESS_H
4 #define __ASM_CSKY_UACCESS_H
6 #define user_addr_max() \
7 (uaccess_kernel() ? KERNEL_DS.seg : get_fs().seg)
9 static inline int __access_ok(unsigned long addr, unsigned long size)
11 unsigned long limit = current_thread_info()->addr_limit.seg;
13 return ((addr < limit) && ((addr + size) < limit));
15 #define __access_ok __access_ok
20 extern int __put_user_bad(void);
22 #define __put_user_asm_b(x, ptr, err) \
25 __asm__ __volatile__( \
26 "1: stb %1, (%2,0) \n" \
30 ".section __ex_table, \"a\" \n" \
35 : "=r"(err), "=r"(x), "=r"(ptr), "=r"(errcode) \
36 : "0"(err), "1"(x), "2"(ptr), "3"(-EFAULT) \
40 #define __put_user_asm_h(x, ptr, err) \
43 __asm__ __volatile__( \
44 "1: sth %1, (%2,0) \n" \
48 ".section __ex_table, \"a\" \n" \
53 : "=r"(err), "=r"(x), "=r"(ptr), "=r"(errcode) \
54 : "0"(err), "1"(x), "2"(ptr), "3"(-EFAULT) \
58 #define __put_user_asm_w(x, ptr, err) \
61 __asm__ __volatile__( \
62 "1: stw %1, (%2,0) \n" \
66 ".section __ex_table,\"a\" \n" \
71 : "=r"(err), "=r"(x), "=r"(ptr), "=r"(errcode) \
72 : "0"(err), "1"(x), "2"(ptr), "3"(-EFAULT) \
76 #define __put_user_asm_64(x, ptr, err) \
81 __asm__ __volatile__( \
82 " ldw %3, (%1, 0) \n" \
83 "1: stw %3, (%2, 0) \n" \
84 " ldw %3, (%1, 4) \n" \
85 "2: stw %3, (%2, 4) \n" \
89 ".section __ex_table, \"a\" \n" \
95 : "=r"(err), "=r"(x), "=r"(ptr), \
96 "=r"(tmp), "=r"(errcode) \
97 : "0"(err), "1"(x), "2"(ptr), "3"(0), \
102 static inline int __put_user_fn(size_t size, void __user *ptr, void *x)
110 __put_user_asm_b(tmp, ptr, retval);
114 __put_user_asm_h(tmp, ptr, retval);
118 __put_user_asm_w(tmp, ptr, retval);
121 __put_user_asm_64(x, (u64 *)ptr, retval);
127 #define __put_user_fn __put_user_fn
132 extern int __get_user_bad(void);
134 #define __get_user_asm_common(x, ptr, ins, err) \
137 __asm__ __volatile__( \
138 "1: " ins " %1, (%4, 0) \n" \
143 ".section __ex_table,\"a\" \n" \
148 : "=r"(err), "=r"(x), "=r"(errcode) \
149 : "0"(0), "r"(ptr), "2"(-EFAULT) \
153 #define __get_user_asm_64(x, ptr, err) \
158 __asm__ __volatile__( \
159 "1: ldw %3, (%2, 0) \n" \
160 " stw %3, (%1, 0) \n" \
161 "2: ldw %3, (%2, 4) \n" \
162 " stw %3, (%1, 4) \n" \
166 ".section __ex_table, \"a\" \n" \
172 : "=r"(err), "=r"(x), "=r"(ptr), \
173 "=r"(tmp), "=r"(errcode) \
174 : "0"(err), "1"(x), "2"(ptr), "3"(0), \
179 static inline int __get_user_fn(size_t size, const void __user *ptr, void *x)
186 __get_user_asm_common(tmp, ptr, "ldb", retval);
190 __get_user_asm_common(tmp, ptr, "ldh", retval);
191 *(u16 *)x = (u16)tmp;
194 __get_user_asm_common(tmp, ptr, "ldw", retval);
195 *(u32 *)x = (u32)tmp;
198 __get_user_asm_64(x, ptr, retval);
204 #define __get_user_fn __get_user_fn
206 unsigned long raw_copy_from_user(void *to, const void *from, unsigned long n);
207 unsigned long raw_copy_to_user(void *to, const void *from, unsigned long n);
209 unsigned long __clear_user(void __user *to, unsigned long n);
210 #define __clear_user __clear_user
212 long __strncpy_from_user(char *dst, const char *src, long count);
213 #define __strncpy_from_user __strncpy_from_user
215 long __strnlen_user(const char *s, long n);
216 #define __strnlen_user __strnlen_user
218 #include <asm/segment.h>
219 #include <asm-generic/uaccess.h>
221 #endif /* __ASM_CSKY_UACCESS_H */