uaccess_32.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. default: \
  29. __get_user_unknown(); \
  30. break; \
  31. } \
  32. } while (0)
  33. #ifdef CONFIG_MMU
  34. #define __get_user_asm(x, addr, err, insn) \
  35. ({ \
  36. __asm__ __volatile__( \
  37. "1:\n\t" \
  38. "mov." insn " %2, %1\n\t" \
  39. "2:\n" \
  40. ".section .fixup,\"ax\"\n" \
  41. "3:\n\t" \
  42. "mov #0, %1\n\t" \
  43. "mov.l 4f, %0\n\t" \
  44. "jmp @%0\n\t" \
  45. " mov %3, %0\n\t" \
  46. ".balign 4\n" \
  47. "4: .long 2b\n\t" \
  48. ".previous\n" \
  49. ".section __ex_table,\"a\"\n\t" \
  50. ".long 1b, 3b\n\t" \
  51. ".previous" \
  52. :"=&r" (err), "=&r" (x) \
  53. :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); })
  54. #else
  55. #define __get_user_asm(x, addr, err, insn) \
  56. do { \
  57. __asm__ __volatile__ ( \
  58. "mov." insn " %1, %0\n\t" \
  59. : "=&r" (x) \
  60. : "m" (__m(addr)) \
  61. ); \
  62. } while (0)
  63. #endif /* CONFIG_MMU */
  64. extern void __get_user_unknown(void);
  65. #define __put_user_size(x,ptr,size,retval) \
  66. do { \
  67. retval = 0; \
  68. switch (size) { \
  69. case 1: \
  70. __put_user_asm(x, ptr, retval, "b"); \
  71. break; \
  72. case 2: \
  73. __put_user_asm(x, ptr, retval, "w"); \
  74. break; \
  75. case 4: \
  76. __put_user_asm(x, ptr, retval, "l"); \
  77. break; \
  78. case 8: \
  79. __put_user_u64(x, ptr, retval); \
  80. break; \
  81. default: \
  82. __put_user_unknown(); \
  83. } \
  84. } while (0)
  85. #ifdef CONFIG_MMU
  86. #define __put_user_asm(x, addr, err, insn) \
  87. do { \
  88. __asm__ __volatile__ ( \
  89. "1:\n\t" \
  90. "mov." insn " %1, %2\n\t" \
  91. "2:\n" \
  92. ".section .fixup,\"ax\"\n" \
  93. "3:\n\t" \
  94. "mov.l 4f, %0\n\t" \
  95. "jmp @%0\n\t" \
  96. " mov %3, %0\n\t" \
  97. ".balign 4\n" \
  98. "4: .long 2b\n\t" \
  99. ".previous\n" \
  100. ".section __ex_table,\"a\"\n\t" \
  101. ".long 1b, 3b\n\t" \
  102. ".previous" \
  103. : "=&r" (err) \
  104. : "r" (x), "m" (__m(addr)), "i" (-EFAULT), \
  105. "0" (err) \
  106. : "memory" \
  107. ); \
  108. } while (0)
  109. #else
  110. #define __put_user_asm(x, addr, err, insn) \
  111. do { \
  112. __asm__ __volatile__ ( \
  113. "mov." insn " %0, %1\n\t" \
  114. : /* no outputs */ \
  115. : "r" (x), "m" (__m(addr)) \
  116. : "memory" \
  117. ); \
  118. } while (0)
  119. #endif /* CONFIG_MMU */
  120. #if defined(CONFIG_CPU_LITTLE_ENDIAN)
  121. #define __put_user_u64(val,addr,retval) \
  122. ({ \
  123. __asm__ __volatile__( \
  124. "1:\n\t" \
  125. "mov.l %R1,%2\n\t" \
  126. "mov.l %S1,%T2\n\t" \
  127. "2:\n" \
  128. ".section .fixup,\"ax\"\n" \
  129. "3:\n\t" \
  130. "mov.l 4f,%0\n\t" \
  131. "jmp @%0\n\t" \
  132. " mov %3,%0\n\t" \
  133. ".balign 4\n" \
  134. "4: .long 2b\n\t" \
  135. ".previous\n" \
  136. ".section __ex_table,\"a\"\n\t" \
  137. ".long 1b, 3b\n\t" \
  138. ".previous" \
  139. : "=r" (retval) \
  140. : "r" (val), "m" (__m(addr)), "i" (-EFAULT), "0" (retval) \
  141. : "memory"); })
  142. #else
  143. #define __put_user_u64(val,addr,retval) \
  144. ({ \
  145. __asm__ __volatile__( \
  146. "1:\n\t" \
  147. "mov.l %S1,%2\n\t" \
  148. "mov.l %R1,%T2\n\t" \
  149. "2:\n" \
  150. ".section .fixup,\"ax\"\n" \
  151. "3:\n\t" \
  152. "mov.l 4f,%0\n\t" \
  153. "jmp @%0\n\t" \
  154. " mov %3,%0\n\t" \
  155. ".balign 4\n" \
  156. "4: .long 2b\n\t" \
  157. ".previous\n" \
  158. ".section __ex_table,\"a\"\n\t" \
  159. ".long 1b, 3b\n\t" \
  160. ".previous" \
  161. : "=r" (retval) \
  162. : "r" (val), "m" (__m(addr)), "i" (-EFAULT), "0" (retval) \
  163. : "memory"); })
  164. #endif
  165. extern void __put_user_unknown(void);
  166. #endif /* __ASM_SH_UACCESS_32_H */