rwsem_32.S 2.9 KB

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