rwsem_64.S 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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, "ax"
  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. bl,pn %icc, 3f
  18. nop
  19. 2:
  20. retl
  21. nop
  22. 3:
  23. save %sp, -192, %sp
  24. call rwsem_down_read_failed
  25. mov %i0, %o0
  26. ret
  27. restore
  28. .size __down_read, .-__down_read
  29. .globl __down_read_trylock
  30. __down_read_trylock:
  31. 1: lduw [%o0], %g1
  32. add %g1, 1, %g7
  33. cmp %g7, 0
  34. bl,pn %icc, 2f
  35. mov 0, %o1
  36. cas [%o0], %g1, %g7
  37. cmp %g1, %g7
  38. bne,pn %icc, 1b
  39. mov 1, %o1
  40. 2: retl
  41. mov %o1, %o0
  42. .size __down_read_trylock, .-__down_read_trylock
  43. .globl __down_write
  44. __down_write:
  45. sethi %hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
  46. or %g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
  47. 1:
  48. lduw [%o0], %g3
  49. add %g3, %g1, %g7
  50. cas [%o0], %g3, %g7
  51. cmp %g3, %g7
  52. bne,pn %icc, 1b
  53. cmp %g7, 0
  54. bne,pn %icc, 3f
  55. nop
  56. 2: retl
  57. nop
  58. 3:
  59. save %sp, -192, %sp
  60. call rwsem_down_write_failed
  61. mov %i0, %o0
  62. ret
  63. restore
  64. .size __down_write, .-__down_write
  65. .globl __down_write_trylock
  66. __down_write_trylock:
  67. sethi %hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
  68. or %g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
  69. 1:
  70. lduw [%o0], %g3
  71. cmp %g3, 0
  72. bne,pn %icc, 2f
  73. mov 0, %o1
  74. add %g3, %g1, %g7
  75. cas [%o0], %g3, %g7
  76. cmp %g3, %g7
  77. bne,pn %icc, 1b
  78. mov 1, %o1
  79. 2: retl
  80. mov %o1, %o0
  81. .size __down_write_trylock, .-__down_write_trylock
  82. .globl __up_read
  83. __up_read:
  84. 1:
  85. lduw [%o0], %g1
  86. sub %g1, 1, %g7
  87. cas [%o0], %g1, %g7
  88. cmp %g1, %g7
  89. bne,pn %icc, 1b
  90. cmp %g7, 0
  91. bl,pn %icc, 3f
  92. nop
  93. 2: retl
  94. nop
  95. 3: sethi %hi(RWSEM_ACTIVE_MASK), %g1
  96. sub %g7, 1, %g7
  97. or %g1, %lo(RWSEM_ACTIVE_MASK), %g1
  98. andcc %g7, %g1, %g0
  99. bne,pn %icc, 2b
  100. nop
  101. save %sp, -192, %sp
  102. call rwsem_wake
  103. mov %i0, %o0
  104. ret
  105. restore
  106. .size __up_read, .-__up_read
  107. .globl __up_write
  108. __up_write:
  109. sethi %hi(RWSEM_ACTIVE_WRITE_BIAS), %g1
  110. or %g1, %lo(RWSEM_ACTIVE_WRITE_BIAS), %g1
  111. 1:
  112. lduw [%o0], %g3
  113. sub %g3, %g1, %g7
  114. cas [%o0], %g3, %g7
  115. cmp %g3, %g7
  116. bne,pn %icc, 1b
  117. sub %g7, %g1, %g7
  118. cmp %g7, 0
  119. bl,pn %icc, 3f
  120. nop
  121. 2:
  122. retl
  123. nop
  124. 3:
  125. save %sp, -192, %sp
  126. call rwsem_wake
  127. mov %i0, %o0
  128. ret
  129. restore
  130. .size __up_write, .-__up_write
  131. .globl __downgrade_write
  132. __downgrade_write:
  133. sethi %hi(RWSEM_WAITING_BIAS), %g1
  134. or %g1, %lo(RWSEM_WAITING_BIAS), %g1
  135. 1:
  136. lduw [%o0], %g3
  137. sub %g3, %g1, %g7
  138. cas [%o0], %g3, %g7
  139. cmp %g3, %g7
  140. bne,pn %icc, 1b
  141. sub %g7, %g1, %g7
  142. cmp %g7, 0
  143. bl,pn %icc, 3f
  144. nop
  145. 2:
  146. retl
  147. nop
  148. 3:
  149. save %sp, -192, %sp
  150. call rwsem_downgrade_wake
  151. mov %i0, %o0
  152. ret
  153. restore
  154. .size __downgrade_write, .-__downgrade_write