locks.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/locks.h
  3.  *
  4.  *  Copyright (C) 2000 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  *
  10.  *  Interrupt safe locking assembler. 
  11.  */
  12. #ifndef __ASM_PROC_LOCKS_H
  13. #define __ASM_PROC_LOCKS_H
  14. #if __LINUX_ARM_ARCH__ >= 6
  15. #define __down_op(ptr,fail)
  16. ({
  17. __asm__ __volatile__(
  18. "@ down_opn"
  19. "1: ldrex lr, [%0]n"
  20. " sub lr, lr, %1n"
  21. " strex ip, lr, [%0]n"
  22. " teq ip, #0n"
  23. " bne 1bn"
  24. " teq lr, #0n"
  25. " movmi ip, %0n"
  26. " blmi " #fail
  27. :
  28. : "r" (ptr), "I" (1)
  29. : "ip", "lr", "cc");
  30. smp_mb();
  31. })
  32. #define __down_op_ret(ptr,fail)
  33. ({
  34. unsigned int ret;
  35. __asm__ __volatile__(
  36. "@ down_op_retn"
  37. "1: ldrex lr, [%1]n"
  38. " sub lr, lr, %2n"
  39. " strex ip, lr, [%1]n"
  40. " teq ip, #0n"
  41. " bne 1bn"
  42. " teq lr, #0n"
  43. " movmi ip, %1n"
  44. " movpl ip, #0n"
  45. " blmi " #fail "n"
  46. " mov %0, ip"
  47. : "=&r" (ret)
  48. : "r" (ptr), "I" (1)
  49. : "ip", "lr", "cc");
  50. smp_mb();
  51. ret;
  52. })
  53. #define __up_op(ptr,wake)
  54. ({
  55. smp_mb();
  56. __asm__ __volatile__(
  57. "@ up_opn"
  58. "1: ldrex lr, [%0]n"
  59. " add lr, lr, %1n"
  60. " strex ip, lr, [%0]n"
  61. " teq ip, #0n"
  62. " bne 1bn"
  63. " cmp lr, #0n"
  64. " movle ip, %0n"
  65. " blle " #wake
  66. :
  67. : "r" (ptr), "I" (1)
  68. : "ip", "lr", "cc");
  69. })
  70. /*
  71.  * The value 0x01000000 supports up to 128 processors and
  72.  * lots of processes.  BIAS must be chosen such that sub'ing
  73.  * BIAS once per CPU will result in the long remaining
  74.  * negative.
  75.  */
  76. #define RW_LOCK_BIAS      0x01000000
  77. #define RW_LOCK_BIAS_STR "0x01000000"
  78. #define __down_op_write(ptr,fail)
  79. ({
  80. __asm__ __volatile__(
  81. "@ down_op_writen"
  82. "1: ldrex lr, [%0]n"
  83. " sub lr, lr, %1n"
  84. " strex ip, lr, [%0]n"
  85. " teq ip, #0n"
  86. " bne 1bn"
  87. " teq lr, #0n"
  88. " movne ip, %0n"
  89. " blne " #fail
  90. :
  91. : "r" (ptr), "I" (RW_LOCK_BIAS)
  92. : "ip", "lr", "cc");
  93. smp_mb();
  94. })
  95. #define __up_op_write(ptr,wake)
  96. ({
  97. smp_mb();
  98. __asm__ __volatile__(
  99. "@ up_op_writen"
  100. "1: ldrex lr, [%0]n"
  101. " adds lr, lr, %1n"
  102. " strex ip, lr, [%0]n"
  103. " teq ip, #0n"
  104. " bne 1bn"
  105. " movcs ip, %0n"
  106. " blcs " #wake
  107. :
  108. : "r" (ptr), "I" (RW_LOCK_BIAS)
  109. : "ip", "lr", "cc");
  110. })
  111. #define __down_op_read(ptr,fail)
  112. __down_op(ptr, fail)
  113. #define __up_op_read(ptr,wake)
  114. ({
  115. smp_mb();
  116. __asm__ __volatile__(
  117. "@ up_op_readn"
  118. "1: ldrex lr, [%0]n"
  119. " add lr, lr, %1n"
  120. " strex ip, lr, [%0]n"
  121. " teq ip, #0n"
  122. " bne 1bn"
  123. " teq lr, #0n"
  124. " moveq ip, %0n"
  125. " bleq " #wake
  126. :
  127. : "r" (ptr), "I" (1)
  128. : "ip", "lr", "cc");
  129. })
  130. #else
  131. #define __down_op(ptr,fail)
  132. ({
  133. __asm__ __volatile__(
  134. "@ down_opn"
  135. " mrs ip, cpsrn"
  136. " orr lr, ip, #128n"
  137. " msr cpsr_c, lrn"
  138. " ldr lr, [%0]n"
  139. " subs lr, lr, %1n"
  140. " str lr, [%0]n"
  141. " msr cpsr_c, ipn"
  142. " movmi ip, %0n"
  143. " blmi " #fail
  144. :
  145. : "r" (ptr), "I" (1)
  146. : "ip", "lr", "cc");
  147. smp_mb();
  148. })
  149. #define __down_op_ret(ptr,fail)
  150. ({
  151. unsigned int ret;
  152. __asm__ __volatile__(
  153. "@ down_op_retn"
  154. " mrs ip, cpsrn"
  155. " orr lr, ip, #128n"
  156. " msr cpsr_c, lrn"
  157. " ldr lr, [%1]n"
  158. " subs lr, lr, %2n"
  159. " str lr, [%1]n"
  160. " msr cpsr_c, ipn"
  161. " movmi ip, %1n"
  162. " movpl ip, #0n"
  163. " blmi " #fail "n"
  164. " mov %0, ip"
  165. : "=&r" (ret)
  166. : "r" (ptr), "I" (1)
  167. : "ip", "lr", "cc");
  168. smp_mb();
  169. ret;
  170. })
  171. #define __up_op(ptr,wake)
  172. ({
  173. smp_mb();
  174. __asm__ __volatile__(
  175. "@ up_opn"
  176. " mrs ip, cpsrn"
  177. " orr lr, ip, #128n"
  178. " msr cpsr_c, lrn"
  179. " ldr lr, [%0]n"
  180. " adds lr, lr, %1n"
  181. " str lr, [%0]n"
  182. " msr cpsr_c, ipn"
  183. " movle ip, %0n"
  184. " blle " #wake
  185. :
  186. : "r" (ptr), "I" (1)
  187. : "ip", "lr", "cc");
  188. })
  189. /*
  190.  * The value 0x01000000 supports up to 128 processors and
  191.  * lots of processes.  BIAS must be chosen such that sub'ing
  192.  * BIAS once per CPU will result in the long remaining
  193.  * negative.
  194.  */
  195. #define RW_LOCK_BIAS      0x01000000
  196. #define RW_LOCK_BIAS_STR "0x01000000"
  197. #define __down_op_write(ptr,fail)
  198. ({
  199. __asm__ __volatile__(
  200. "@ down_op_writen"
  201. " mrs ip, cpsrn"
  202. " orr lr, ip, #128n"
  203. " msr cpsr_c, lrn"
  204. " ldr lr, [%0]n"
  205. " subs lr, lr, %1n"
  206. " str lr, [%0]n"
  207. " msr cpsr_c, ipn"
  208. " movne ip, %0n"
  209. " blne " #fail
  210. :
  211. : "r" (ptr), "I" (RW_LOCK_BIAS)
  212. : "ip", "lr", "cc");
  213. smp_mb();
  214. })
  215. #define __up_op_write(ptr,wake)
  216. ({
  217. __asm__ __volatile__(
  218. "@ up_op_writen"
  219. " mrs ip, cpsrn"
  220. " orr lr, ip, #128n"
  221. " msr cpsr_c, lrn"
  222. " ldr lr, [%0]n"
  223. " adds lr, lr, %1n"
  224. " str lr, [%0]n"
  225. " msr cpsr_c, ipn"
  226. " movcs ip, %0n"
  227. " blcs " #wake
  228. :
  229. : "r" (ptr), "I" (RW_LOCK_BIAS)
  230. : "ip", "lr", "cc");
  231. smp_mb();
  232. })
  233. #define __down_op_read(ptr,fail)
  234. __down_op(ptr, fail)
  235. #define __up_op_read(ptr,wake)
  236. ({
  237. smp_mb();
  238. __asm__ __volatile__(
  239. "@ up_op_readn"
  240. " mrs ip, cpsrn"
  241. " orr lr, ip, #128n"
  242. " msr cpsr_c, lrn"
  243. " ldr lr, [%0]n"
  244. " adds lr, lr, %1n"
  245. " str lr, [%0]n"
  246. " msr cpsr_c, ipn"
  247. " moveq ip, %0n"
  248. " bleq " #wake
  249. :
  250. : "r" (ptr), "I" (1)
  251. : "ip", "lr", "cc");
  252. })
  253. #endif
  254. #endif