uaccess_32.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * User space memory access functions
  4. *
  5. * Copyright (C) 1999, 2002 Niibe Yutaka
  6. * Copyright (C) 2003 - 2008 Paul Mundt
  7. *
  8. * Based on:
  9. * MIPS implementation version 1.15 by
  10. * Copyright (C) 1996, 1997, 1998 by Ralf Baechle
  11. * and i386 version.
  12. */
  13. #ifndef __ASM_SH_UACCESS_32_H
  14. #define __ASM_SH_UACCESS_32_H
  15. #define __get_user_size(x,ptr,size,retval) \
  16. do { \
  17. retval = 0; \
  18. switch (size) { \
  19. case 1: \
  20. __get_user_asm(x, ptr, retval, "b"); \
  21. break; \
  22. case 2: \
  23. __get_user_asm(x, ptr, retval, "w"); \
  24. break; \
  25. case 4: \
  26. __get_user_asm(x, ptr, retval, "l"); \
  27. break; \
  28. case 8: \
  29. __get_user_u64(x, ptr, retval); \
  30. break; \
  31. default: \
  32. __get_user_unknown(); \
  33. break; \
  34. } \
  35. } while (0)
  36. #ifdef CONFIG_MMU
  37. #define __get_user_asm(x, addr, err, insn) \
  38. ({ \
  39. __asm__ __volatile__( \
  40. "1:\n\t" \
  41. "mov." insn " %2, %1\n\t" \
  42. "2:\n" \
  43. ".section .fixup,\"ax\"\n" \
  44. "3:\n\t" \
  45. "mov #0, %1\n\t" \
  46. "mov.l 4f, %0\n\t" \
  47. "jmp @%0\n\t" \
  48. " mov %3, %0\n\t" \
  49. ".balign 4\n" \
  50. "4: .long 2b\n\t" \
  51. ".previous\n" \
  52. ".section __ex_table,\"a\"\n\t" \
  53. ".long 1b, 3b\n\t" \
  54. ".previous" \
  55. :"=&r" (err), "=&r" (x) \
  56. :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); })
  57. #else
  58. #define __get_user_asm(x, addr, err, insn) \
  59. do { \
  60. __asm__ __volatile__ ( \
  61. "mov." insn " %1, %0\n\t" \
  62. : "=&r" (x) \
  63. : "m" (__m(addr)) \
  64. ); \
  65. } while (0)
  66. #endif /* CONFIG_MMU */
  67. extern void __get_user_unknown(void);
  68. #if defined(CONFIG_CPU_LITTLE_ENDIAN)
  69. #define __get_user_u64(x, addr, err) \
  70. ({ \
  71. __asm__ __volatile__( \
  72. "1:\n\t" \
  73. "mov.l %2,%R1\n\t" \
  74. "mov.l %T2,%S1\n\t" \
  75. "2:\n" \
  76. ".section .fixup,\"ax\"\n" \
  77. "3:\n\t" \
  78. "mov #0,%R1\n\t" \
  79. "mov #0,%S1\n\t" \
  80. "mov.l 4f, %0\n\t" \
  81. "jmp @%0\n\t" \
  82. " mov %3, %0\n\t" \
  83. ".balign 4\n" \
  84. "4: .long 2b\n\t" \
  85. ".previous\n" \
  86. ".section __ex_table,\"a\"\n\t" \
  87. ".long 1b, 3b\n\t" \
  88. ".long 1b + 2, 3b\n\t" \
  89. ".previous" \
  90. :"=&r" (err), "=&r" (x) \
  91. :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); })
  92. #else
  93. #define __get_user_u64(x, addr, err) \
  94. ({ \
  95. __asm__ __volatile__( \
  96. "1:\n\t" \
  97. "mov.l %2,%S1\n\t" \
  98. "mov.l %T2,%R1\n\t" \
  99. "2:\n" \
  100. ".section .fixup,\"ax\"\n" \
  101. "3:\n\t" \
  102. "mov #0,%S1\n\t" \
  103. "mov #0,%R1\n\t" \
  104. "mov.l 4f, %0\n\t" \
  105. "jmp @%0\n\t" \
  106. " mov %3, %0\n\t" \
  107. ".balign 4\n" \
  108. "4: .long 2b\n\t" \
  109. ".previous\n" \
  110. ".section __ex_table,\"a\"\n\t" \
  111. ".long 1b, 3b\n\t" \
  112. ".long 1b + 2, 3b\n\t" \
  113. ".previous" \
  114. :"=&r" (err), "=&r" (x) \
  115. :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); })
  116. #endif
  117. #define __put_user_size(x,ptr,size,retval) \
  118. do { \
  119. retval = 0; \
  120. switch (size) { \
  121. case 1: \
  122. __put_user_asm(x, ptr, retval, "b"); \
  123. break; \
  124. case 2: \
  125. __put_user_asm(x, ptr, retval, "w"); \
  126. break; \
  127. case 4: \
  128. __put_user_asm(x, ptr, retval, "l"); \
  129. break; \
  130. case 8: \
  131. __put_user_u64(x, ptr, retval); \
  132. break; \
  133. default: \
  134. __put_user_unknown(); \
  135. } \
  136. } while (0)
  137. #ifdef CONFIG_MMU
  138. #define __put_user_asm(x, addr, err, insn) \
  139. do { \
  140. __asm__ __volatile__ ( \
  141. "1:\n\t" \
  142. "mov." insn " %1, %2\n\t" \
  143. "2:\n" \
  144. ".section .fixup,\"ax\"\n" \
  145. "3:\n\t" \
  146. "mov.l 4f, %0\n\t" \
  147. "jmp @%0\n\t" \
  148. " mov %3, %0\n\t" \
  149. ".balign 4\n" \
  150. "4: .long 2b\n\t" \
  151. ".previous\n" \
  152. ".section __ex_table,\"a\"\n\t" \
  153. ".long 1b, 3b\n\t" \
  154. ".previous" \
  155. : "=&r" (err) \
  156. : "r" (x), "m" (__m(addr)), "i" (-EFAULT), \
  157. "0" (err) \
  158. : "memory" \
  159. ); \
  160. } while (0)
  161. #else
  162. #define __put_user_asm(x, addr, err, insn) \
  163. do { \
  164. __asm__ __volatile__ ( \
  165. "mov." insn " %0, %1\n\t" \
  166. : /* no outputs */ \
  167. : "r" (x), "m" (__m(addr)) \
  168. : "memory" \
  169. ); \
  170. } while (0)
  171. #endif /* CONFIG_MMU */
  172. #if defined(CONFIG_CPU_LITTLE_ENDIAN)
  173. #define __put_user_u64(val,addr,retval) \
  174. ({ \
  175. __asm__ __volatile__( \
  176. "1:\n\t" \
  177. "mov.l %R1,%2\n\t" \
  178. "mov.l %S1,%T2\n\t" \
  179. "2:\n" \
  180. ".section .fixup,\"ax\"\n" \
  181. "3:\n\t" \
  182. "mov.l 4f,%0\n\t" \
  183. "jmp @%0\n\t" \
  184. " mov %3,%0\n\t" \
  185. ".balign 4\n" \
  186. "4: .long 2b\n\t" \
  187. ".previous\n" \
  188. ".section __ex_table,\"a\"\n\t" \
  189. ".long 1b, 3b\n\t" \
  190. ".previous" \
  191. : "=r" (retval) \
  192. : "r" (val), "m" (__m(addr)), "i" (-EFAULT), "0" (retval) \
  193. : "memory"); })
  194. #else
  195. #define __put_user_u64(val,addr,retval) \
  196. ({ \
  197. __asm__ __volatile__( \
  198. "1:\n\t" \
  199. "mov.l %S1,%2\n\t" \
  200. "mov.l %R1,%T2\n\t" \
  201. "2:\n" \
  202. ".section .fixup,\"ax\"\n" \
  203. "3:\n\t" \
  204. "mov.l 4f,%0\n\t" \
  205. "jmp @%0\n\t" \
  206. " mov %3,%0\n\t" \
  207. ".balign 4\n" \
  208. "4: .long 2b\n\t" \
  209. ".previous\n" \
  210. ".section __ex_table,\"a\"\n\t" \
  211. ".long 1b, 3b\n\t" \
  212. ".previous" \
  213. : "=r" (retval) \
  214. : "r" (val), "m" (__m(addr)), "i" (-EFAULT), "0" (retval) \
  215. : "memory"); })
  216. #endif
  217. extern void __put_user_unknown(void);
  218. #endif /* __ASM_SH_UACCESS_32_H */