uaccess.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. #ifndef _ASMARM_UACCESS_H
  2. #define _ASMARM_UACCESS_H
  3. /*
  4. * User space memory access functions
  5. */
  6. #include <linux/sched.h>
  7. #include <asm/errno.h>
  8. #define VERIFY_READ 0
  9. #define VERIFY_WRITE 1
  10. /*
  11. * The exception table consists of pairs of addresses: the first is the
  12. * address of an instruction that is allowed to fault, and the second is
  13. * the address at which the program should continue. No registers are
  14. * modified, so it is entirely up to the continuation code to figure out
  15. * what to do.
  16. *
  17. * All the routines below use bits of fixup code that are out of line
  18. * with the main instruction path. This means when everything is well,
  19. * we don't even have to jump over them. Further, they do not intrude
  20. * on our cache or tlb entries.
  21. */
  22. struct exception_table_entry
  23. {
  24. unsigned long insn, fixup;
  25. };
  26. /* Returns 0 if exception not found and fixup otherwise. */
  27. extern unsigned long search_exception_table(unsigned long);
  28. extern int fixup_exception(struct pt_regs *regs);
  29. #define get_ds() (KERNEL_DS)
  30. #define get_fs() (current_thread_info()->addr_limit)
  31. #define segment_eq(a,b) ((a) == (b))
  32. #include <asm/uaccess-asm.h>
  33. #define access_ok(type,addr,size) (__range_ok(addr,size) == 0)
  34. /* this function will go away soon - use access_ok() instead */
  35. static inline int __deprecated verify_area(int type, const void * addr, unsigned long size)
  36. {
  37. return access_ok(type, addr, size) ? 0 : -EFAULT;
  38. }
  39. /*
  40. * Single-value transfer routines. They automatically use the right
  41. * size if we just have the right pointer type. Note that the functions
  42. * which read from user space (*get_*) need to take care not to leak
  43. * kernel data even if the calling code is buggy and fails to check
  44. * the return value. This means zeroing out the destination variable
  45. * or buffer on error. Normally this is done out of line by the
  46. * fixup code, but there are a few places where it intrudes on the
  47. * main code path. When we only write to user space, there is no
  48. * problem.
  49. *
  50. * The "__xxx" versions of the user access functions do not verify the
  51. * address space - it must have been done previously with a separate
  52. * "access_ok()" call.
  53. *
  54. * The "xxx_error" versions set the third argument to EFAULT if an
  55. * error occurs, and leave it unchanged on success. Note that these
  56. * versions are void (ie, don't return a value as such).
  57. */
  58. extern int __get_user_1(void *);
  59. extern int __get_user_2(void *);
  60. extern int __get_user_4(void *);
  61. extern int __get_user_8(void *);
  62. extern int __get_user_bad(void);
  63. #define __get_user_x(__r1,__p,__e,__s,__i...) \
  64. __asm__ __volatile__ ("bl __get_user_" #__s \
  65. : "=&r" (__e), "=r" (__r1) \
  66. : "0" (__p) \
  67. : __i)
  68. #define get_user(x,p) \
  69. ({ \
  70. const register typeof(*(p)) *__p asm("r0") = (p); \
  71. register typeof(*(p)) __r1 asm("r1"); \
  72. register int __e asm("r0"); \
  73. switch (sizeof(*(p))) { \
  74. case 1: \
  75. __get_user_x(__r1, __p, __e, 1, "lr"); \
  76. break; \
  77. case 2: \
  78. __get_user_x(__r1, __p, __e, 2, "r2", "lr"); \
  79. break; \
  80. case 4: \
  81. __get_user_x(__r1, __p, __e, 4, "lr"); \
  82. break; \
  83. case 8: \
  84. __get_user_x(__r1, __p, __e, 8, "lr"); \
  85. break; \
  86. default: __e = __get_user_bad(); break; \
  87. } \
  88. x = __r1; \
  89. __e; \
  90. })
  91. #define __get_user(x,ptr) \
  92. ({ \
  93. long __gu_err = 0; \
  94. __get_user_err((x),(ptr),__gu_err); \
  95. __gu_err; \
  96. })
  97. #define __get_user_error(x,ptr,err) \
  98. ({ \
  99. __get_user_err((x),(ptr),err); \
  100. (void) 0; \
  101. })
  102. #define __get_user_err(x,ptr,err) \
  103. do { \
  104. unsigned long __gu_addr = (unsigned long)(ptr); \
  105. unsigned long __gu_val; \
  106. switch (sizeof(*(ptr))) { \
  107. case 1: __get_user_asm_byte(__gu_val,__gu_addr,err); break; \
  108. case 2: __get_user_asm_half(__gu_val,__gu_addr,err); break; \
  109. case 4: __get_user_asm_word(__gu_val,__gu_addr,err); break; \
  110. default: (__gu_val) = __get_user_bad(); \
  111. } \
  112. (x) = (__typeof__(*(ptr)))__gu_val; \
  113. } while (0)
  114. extern int __put_user_1(void *, unsigned int);
  115. extern int __put_user_2(void *, unsigned int);
  116. extern int __put_user_4(void *, unsigned int);
  117. extern int __put_user_8(void *, unsigned long long);
  118. extern int __put_user_bad(void);
  119. #define __put_user_x(__r1,__p,__e,__s) \
  120. __asm__ __volatile__ ( \
  121. __asmeq("%0", "r0") __asmeq("%2", "r1") \
  122. "bl __put_user_" #__s \
  123. : "=&r" (__e) \
  124. : "0" (__p), "r" (__r1) \
  125. : "ip", "lr", "cc")
  126. #define put_user(x,p) \
  127. ({ \
  128. const register typeof(*(p)) __r1 asm("r1") = (x); \
  129. const register typeof(*(p)) *__p asm("r0") = (p); \
  130. register int __e asm("r0"); \
  131. switch (sizeof(*(__p))) { \
  132. case 1: \
  133. __put_user_x(__r1, __p, __e, 1); \
  134. break; \
  135. case 2: \
  136. __put_user_x(__r1, __p, __e, 2); \
  137. break; \
  138. case 4: \
  139. __put_user_x(__r1, __p, __e, 4); \
  140. break; \
  141. case 8: \
  142. __put_user_x(__r1, __p, __e, 8); \
  143. break; \
  144. default: __e = __put_user_bad(); break; \
  145. } \
  146. __e; \
  147. })
  148. #if 0
  149. /********************* OLD METHOD *******************/
  150. #define __put_user_x(__r1,__p,__e,__s,__i...) \
  151. __asm__ __volatile__ ("bl __put_user_" #__s \
  152. : "=&r" (__e) \
  153. : "0" (__p), "r" (__r1) \
  154. : __i)
  155. #define put_user(x,p) \
  156. ({ \
  157. const register typeof(*(p)) __r1 asm("r1") = (x); \
  158. const register typeof(*(p)) *__p asm("r0") = (p); \
  159. register int __e asm("r0"); \
  160. switch (sizeof(*(p))) { \
  161. case 1: \
  162. __put_user_x(__r1, __p, __e, 1, "r2", "lr"); \
  163. break; \
  164. case 2: \
  165. __put_user_x(__r1, __p, __e, 2, "r2", "lr"); \
  166. break; \
  167. case 4: \
  168. __put_user_x(__r1, __p, __e, 4, "r2", "lr"); \
  169. break; \
  170. case 8: \
  171. __put_user_x(__r1, __p, __e, 8, "r2", "ip", "lr"); \
  172. break; \
  173. default: __e = __put_user_bad(); break; \
  174. } \
  175. __e; \
  176. })
  177. /*************************************************/
  178. #endif
  179. #define __put_user(x,ptr) \
  180. ({ \
  181. long __pu_err = 0; \
  182. __put_user_err((x),(ptr),__pu_err); \
  183. __pu_err; \
  184. })
  185. #define __put_user_error(x,ptr,err) \
  186. ({ \
  187. __put_user_err((x),(ptr),err); \
  188. (void) 0; \
  189. })
  190. #define __put_user_err(x,ptr,err) \
  191. do { \
  192. unsigned long __pu_addr = (unsigned long)(ptr); \
  193. __typeof__(*(ptr)) __pu_val = (x); \
  194. switch (sizeof(*(ptr))) { \
  195. case 1: __put_user_asm_byte(__pu_val,__pu_addr,err); break; \
  196. case 2: __put_user_asm_half(__pu_val,__pu_addr,err); break; \
  197. case 4: __put_user_asm_word(__pu_val,__pu_addr,err); break; \
  198. case 8: __put_user_asm_dword(__pu_val,__pu_addr,err); break; \
  199. default: __put_user_bad(); \
  200. } \
  201. } while (0)
  202. static __inline__ unsigned long copy_from_user(void *to, const void *from, unsigned long n)
  203. {
  204. if (access_ok(VERIFY_READ, from, n))
  205. __do_copy_from_user(to, from, n);
  206. else /* security hole - plug it */
  207. memzero(to, n);
  208. return n;
  209. }
  210. static __inline__ unsigned long __copy_from_user(void *to, const void *from, unsigned long n)
  211. {
  212. __do_copy_from_user(to, from, n);
  213. return n;
  214. }
  215. static __inline__ unsigned long copy_to_user(void *to, const void *from, unsigned long n)
  216. {
  217. if (access_ok(VERIFY_WRITE, to, n))
  218. __do_copy_to_user(to, from, n);
  219. return n;
  220. }
  221. static __inline__ unsigned long __copy_to_user(void *to, const void *from, unsigned long n)
  222. {
  223. __do_copy_to_user(to, from, n);
  224. return n;
  225. }
  226. #define __copy_to_user_inatomic __copy_to_user
  227. #define __copy_from_user_inatomic __copy_from_user
  228. static __inline__ unsigned long clear_user (void *to, unsigned long n)
  229. {
  230. if (access_ok(VERIFY_WRITE, to, n))
  231. __do_clear_user(to, n);
  232. return n;
  233. }
  234. static __inline__ unsigned long __clear_user (void *to, unsigned long n)
  235. {
  236. __do_clear_user(to, n);
  237. return n;
  238. }
  239. static __inline__ long strncpy_from_user (char *dst, const char *src, long count)
  240. {
  241. long res = -EFAULT;
  242. if (access_ok(VERIFY_READ, src, 1))
  243. __do_strncpy_from_user(dst, src, count, res);
  244. return res;
  245. }
  246. static __inline__ long __strncpy_from_user (char *dst, const char *src, long count)
  247. {
  248. long res;
  249. __do_strncpy_from_user(dst, src, count, res);
  250. return res;
  251. }
  252. #define strlen_user(s) strnlen_user(s, ~0UL >> 1)
  253. static inline long strnlen_user(const char *s, long n)
  254. {
  255. unsigned long res = 0;
  256. if (__addr_ok(s))
  257. __do_strnlen_user(s, n, res);
  258. return res;
  259. }
  260. #endif /* _ASMARM_UACCESS_H */