rwsem.S 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /* $Id: rwsem.S,v 1.5 2000/05/09 17:40:13 davem Exp $
  2. * Assembly part of rw semaphores.
  3. *
  4. * Copyright (C) 1999 Jakub Jelinek (jakub@redhat.com)
  5. */
  6. #include <linux/config.h>
  7. #include <asm/ptrace.h>
  8. #include <asm/psr.h>
  9. .section .sched.text
  10. .align 4
  11. .globl ___down_read
  12. ___down_read:
  13. rd %psr, %g3
  14. nop
  15. nop
  16. nop
  17. or %g3, PSR_PIL, %g7
  18. wr %g7, 0, %psr
  19. nop
  20. nop
  21. nop
  22. #ifdef CONFIG_SMP
  23. 1: ldstub [%g1 + 4], %g7
  24. tst %g7
  25. bne 1b
  26. ld [%g1], %g7
  27. sub %g7, 1, %g7
  28. st %g7, [%g1]
  29. stb %g0, [%g1 + 4]
  30. #else
  31. ld [%g1], %g7
  32. sub %g7, 1, %g7
  33. st %g7, [%g1]
  34. #endif
  35. wr %g3, 0, %psr
  36. add %g7, 1, %g7
  37. nop
  38. nop
  39. subcc %g7, 1, %g7
  40. bneg 3f
  41. nop
  42. 2: jmpl %o7, %g0
  43. mov %g4, %o7
  44. 3: save %sp, -64, %sp
  45. mov %g1, %l1
  46. mov %g4, %l4
  47. bcs 4f
  48. mov %g5, %l5
  49. call down_read_failed
  50. mov %l1, %o0
  51. mov %l1, %g1
  52. mov %l4, %g4
  53. ba ___down_read
  54. restore %l5, %g0, %g5
  55. 4: call down_read_failed_biased
  56. mov %l1, %o0
  57. mov %l1, %g1
  58. mov %l4, %g4
  59. ba 2b
  60. restore %l5, %g0, %g5
  61. .globl ___down_write
  62. ___down_write:
  63. rd %psr, %g3
  64. nop
  65. nop
  66. nop
  67. or %g3, PSR_PIL, %g7
  68. wr %g7, 0, %psr
  69. sethi %hi(0x01000000), %g2
  70. nop
  71. nop
  72. #ifdef CONFIG_SMP
  73. 1: ldstub [%g1 + 4], %g7
  74. tst %g7
  75. bne 1b
  76. ld [%g1], %g7
  77. sub %g7, %g2, %g7
  78. st %g7, [%g1]
  79. stb %g0, [%g1 + 4]
  80. #else
  81. ld [%g1], %g7
  82. sub %g7, %g2, %g7
  83. st %g7, [%g1]
  84. #endif
  85. wr %g3, 0, %psr
  86. add %g7, %g2, %g7
  87. nop
  88. nop
  89. subcc %g7, %g2, %g7
  90. bne 3f
  91. nop
  92. 2: jmpl %o7, %g0
  93. mov %g4, %o7
  94. 3: save %sp, -64, %sp
  95. mov %g1, %l1
  96. mov %g4, %l4
  97. bcs 4f
  98. mov %g5, %l5
  99. call down_write_failed
  100. mov %l1, %o0
  101. mov %l1, %g1
  102. mov %l4, %g4
  103. ba ___down_write
  104. restore %l5, %g0, %g5
  105. 4: call down_write_failed_biased
  106. mov %l1, %o0
  107. mov %l1, %g1
  108. mov %l4, %g4
  109. ba 2b
  110. restore %l5, %g0, %g5
  111. .text
  112. .globl ___up_read
  113. ___up_read:
  114. rd %psr, %g3
  115. nop
  116. nop
  117. nop
  118. or %g3, PSR_PIL, %g7
  119. wr %g7, 0, %psr
  120. nop
  121. nop
  122. nop
  123. #ifdef CONFIG_SMP
  124. 1: ldstub [%g1 + 4], %g7
  125. tst %g7
  126. bne 1b
  127. ld [%g1], %g7
  128. add %g7, 1, %g7
  129. st %g7, [%g1]
  130. stb %g0, [%g1 + 4]
  131. #else
  132. ld [%g1], %g7
  133. add %g7, 1, %g7
  134. st %g7, [%g1]
  135. #endif
  136. wr %g3, 0, %psr
  137. nop
  138. nop
  139. nop
  140. cmp %g7, 0
  141. be 3f
  142. nop
  143. 2: jmpl %o7, %g0
  144. mov %g4, %o7
  145. 3: save %sp, -64, %sp
  146. mov %g1, %l1
  147. mov %g4, %l4
  148. mov %g5, %l5
  149. clr %o1
  150. call __rwsem_wake
  151. mov %l1, %o0
  152. mov %l1, %g1
  153. mov %l4, %g4
  154. ba 2b
  155. restore %l5, %g0, %g5
  156. .globl ___up_write
  157. ___up_write:
  158. rd %psr, %g3
  159. nop
  160. nop
  161. nop
  162. or %g3, PSR_PIL, %g7
  163. wr %g7, 0, %psr
  164. sethi %hi(0x01000000), %g2
  165. nop
  166. nop
  167. #ifdef CONFIG_SMP
  168. 1: ldstub [%g1 + 4], %g7
  169. tst %g7
  170. bne 1b
  171. ld [%g1], %g7
  172. add %g7, %g2, %g7
  173. st %g7, [%g1]
  174. stb %g0, [%g1 + 4]
  175. #else
  176. ld [%g1], %g7
  177. add %g7, %g2, %g7
  178. st %g7, [%g1]
  179. #endif
  180. wr %g3, 0, %psr
  181. sub %g7, %g2, %g7
  182. nop
  183. nop
  184. addcc %g7, %g2, %g7
  185. bcs 3f
  186. nop
  187. 2: jmpl %o7, %g0
  188. mov %g4, %o7
  189. 3: save %sp, -64, %sp
  190. mov %g1, %l1
  191. mov %g4, %l4
  192. mov %g5, %l5
  193. mov %g7, %o1
  194. call __rwsem_wake
  195. mov %l1, %o0
  196. mov %l1, %g1
  197. mov %l4, %g4
  198. ba 2b
  199. restore %l5, %g0, %g5