rwsem.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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. .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. .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