rwsem.S 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /* rwsem.S: RW semaphore assembler.
  2. *
  3. * Written by David S. Miller (davem@redhat.com), 2001.
  4. * Derived from asm-i386/rwsem.h
  5. */
  6. #include <asm/rwsem-const.h>
  7. .section .sched.text
  8. .globl __down_read
  9. __down_read:
  10. 1: lduw [%o0], %g1
  11. add %g1, 1, %g7
  12. cas [%o0], %g1, %g7
  13. cmp %g1, %g7
  14. bne,pn %icc, 1b
  15. add %g7, 1, %g7
  16. cmp %g7, 0
  17. membar #StoreLoad | #StoreStore
  18. bl,pn %icc, 3f
  19. nop
  20. 2:
  21. retl
  22. nop
  23. 3:
  24. save %sp, -192, %sp
  25. call rwsem_down_read_failed
  26. mov %i0, %o0
  27. ret
  28. restore
  29. .size __down_read, .-__down_read
  30. .globl __down_read_trylock
  31. __down_read_trylock:
  32. 1: lduw [%o0], %g1
  33. add %g1, 1, %g7
  34. cmp %g7, 0
  35. bl,pn %icc, 2f
  36. mov 0, %o1
  37. cas [%o0], %g1, %g7
  38. cmp %g1, %g7
  39. bne,pn %icc, 1b
  40. mov 1, %o1
  41. membar #StoreLoad | #StoreStore
  42. 2: retl
  43. mov %o1, %o0
  44. .size __down_read_trylock, .-__down_read_trylock
  45. .globl __down_write
  46. __down_write:
  47. sethi %hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
  48. or %g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
  49. 1:
  50. lduw [%o0], %g3
  51. add %g3, %g1, %g7
  52. cas [%o0], %g3, %g7
  53. cmp %g3, %g7
  54. bne,pn %icc, 1b
  55. cmp %g7, 0
  56. membar #StoreLoad | #StoreStore
  57. bne,pn %icc, 3f
  58. nop
  59. 2: retl
  60. nop
  61. 3:
  62. save %sp, -192, %sp
  63. call rwsem_down_write_failed
  64. mov %i0, %o0
  65. ret
  66. restore
  67. .size __down_write, .-__down_write
  68. .globl __down_write_trylock
  69. __down_write_trylock:
  70. sethi %hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
  71. or %g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
  72. 1:
  73. lduw [%o0], %g3
  74. cmp %g3, 0
  75. bne,pn %icc, 2f
  76. mov 0, %o1
  77. add %g3, %g1, %g7
  78. cas [%o0], %g3, %g7
  79. cmp %g3, %g7
  80. bne,pn %icc, 1b
  81. mov 1, %o1
  82. membar #StoreLoad | #StoreStore
  83. 2: retl
  84. mov %o1, %o0
  85. .size __down_write_trylock, .-__down_write_trylock
  86. .globl __up_read
  87. __up_read:
  88. 1:
  89. lduw [%o0], %g1
  90. sub %g1, 1, %g7
  91. cas [%o0], %g1, %g7
  92. cmp %g1, %g7
  93. bne,pn %icc, 1b
  94. cmp %g7, 0
  95. membar #StoreLoad | #StoreStore
  96. bl,pn %icc, 3f
  97. nop
  98. 2: retl
  99. nop
  100. 3: sethi %hi(RWSEM_ACTIVE_MASK), %g1
  101. sub %g7, 1, %g7
  102. or %g1, %lo(RWSEM_ACTIVE_MASK), %g1
  103. andcc %g7, %g1, %g0
  104. bne,pn %icc, 2b
  105. nop
  106. save %sp, -192, %sp
  107. call rwsem_wake
  108. mov %i0, %o0
  109. ret
  110. restore
  111. .size __up_read, .-__up_read
  112. .globl __up_write
  113. __up_write:
  114. sethi %hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
  115. or %g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
  116. 1:
  117. lduw [%o0], %g3
  118. sub %g3, %g1, %g7
  119. cas [%o0], %g3, %g7
  120. cmp %g3, %g7
  121. bne,pn %icc, 1b
  122. sub %g7, %g1, %g7
  123. cmp %g7, 0
  124. membar #StoreLoad | #StoreStore
  125. bl,pn %icc, 3f
  126. nop
  127. 2:
  128. retl
  129. nop
  130. 3:
  131. save %sp, -192, %sp
  132. call rwsem_wake
  133. mov %i0, %o0
  134. ret
  135. restore
  136. .size __up_write, .-__up_write
  137. .globl __downgrade_write
  138. __downgrade_write:
  139. sethi %hi(RWSEM_WAITING_BIAS), %g1
  140. or %g1, %lo(RWSEM_WAITING_BIAS), %g1
  141. 1:
  142. lduw [%o0], %g3
  143. sub %g3, %g1, %g7
  144. cas [%o0], %g3, %g7
  145. cmp %g3, %g7
  146. bne,pn %icc, 1b
  147. sub %g7, %g1, %g7
  148. cmp %g7, 0
  149. membar #StoreLoad | #StoreStore
  150. bl,pn %icc, 3f
  151. nop
  152. 2:
  153. retl
  154. nop
  155. 3:
  156. save %sp, -192, %sp
  157. call rwsem_downgrade_wake
  158. mov %i0, %o0
  159. ret
  160. restore
  161. .size __downgrade_write, .-__downgrade_write