bitops.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* bitops.S: Low level assembler bit operations.
  2.  *
  3.  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
  4.  */
  5. #include <linux/config.h>
  6. #include <asm/cprefix.h>
  7. #include <asm/ptrace.h>
  8. #include <asm/psr.h>
  9. .text
  10. .align 4
  11. .globl  __bitops_begin
  12. __bitops_begin:
  13. /* Take bits in %g2 and set them in word at %g1,
  14.  * return whether bits were set in original value
  15.  * in %g2.  %g4 holds value to restore into %o7
  16.  * in delay slot of jmpl return, %g3 + %g5 + %g7 can be
  17.  * used as temporaries and thus is considered clobbered
  18.  * by all callers.
  19.  */
  20. .globl ___set_bit
  21. ___set_bit:
  22. rd %psr, %g3
  23. nop; nop; nop;
  24. or %g3, PSR_PIL, %g5
  25. wr %g5, 0x0, %psr
  26. nop; nop; nop
  27. #ifdef CONFIG_SMP
  28. set C_LABEL(bitops_spinlock), %g5
  29. 2: ldstub [%g5], %g7 ! Spin on the byte lock for SMP.
  30. orcc %g7, 0x0, %g0 ! Did we get it?
  31. bne 2b ! Nope...
  32. #endif
  33.  ld [%g1], %g7
  34. or %g7, %g2, %g5
  35. and %g7, %g2, %g2
  36. #ifdef CONFIG_SMP
  37. st %g5, [%g1]
  38. set C_LABEL(bitops_spinlock), %g5
  39. stb %g0, [%g5]
  40. #else
  41. st %g5, [%g1]
  42. #endif
  43. wr %g3, 0x0, %psr
  44. nop; nop; nop
  45. jmpl %o7, %g0
  46.  mov %g4, %o7
  47. /* Same as above, but clears the bits from %g2 instead. */
  48. .globl ___clear_bit
  49. ___clear_bit:
  50. rd %psr, %g3
  51. nop; nop; nop
  52. or %g3, PSR_PIL, %g5
  53. wr %g5, 0x0, %psr
  54. nop; nop; nop
  55. #ifdef CONFIG_SMP
  56. set C_LABEL(bitops_spinlock), %g5
  57. 2: ldstub [%g5], %g7 ! Spin on the byte lock for SMP.
  58. orcc %g7, 0x0, %g0 ! Did we get it?
  59. bne 2b ! Nope...
  60. #endif
  61.  ld [%g1], %g7
  62. andn %g7, %g2, %g5
  63. and %g7, %g2, %g2
  64. #ifdef CONFIG_SMP
  65. st %g5, [%g1]
  66. set C_LABEL(bitops_spinlock), %g5
  67. stb %g0, [%g5]
  68. #else
  69. st %g5, [%g1]
  70. #endif
  71. wr %g3, 0x0, %psr
  72. nop; nop; nop
  73. jmpl %o7, %g0
  74.  mov %g4, %o7
  75. /* Same thing again, but this time toggles the bits from %g2. */
  76. .globl ___change_bit
  77. ___change_bit:
  78. rd %psr, %g3
  79. nop; nop; nop
  80. or %g3, PSR_PIL, %g5
  81. wr %g5, 0x0, %psr
  82. nop; nop; nop
  83. #ifdef CONFIG_SMP
  84. set C_LABEL(bitops_spinlock), %g5
  85. 2: ldstub [%g5], %g7 ! Spin on the byte lock for SMP.
  86. orcc %g7, 0x0, %g0 ! Did we get it?
  87. bne 2b ! Nope...
  88. #endif
  89.  ld [%g1], %g7
  90. xor %g7, %g2, %g5
  91. and %g7, %g2, %g2
  92. #ifdef CONFIG_SMP
  93. st %g5, [%g1]
  94. set C_LABEL(bitops_spinlock), %g5
  95. stb %g0, [%g5]
  96. #else
  97. st %g5, [%g1]
  98. #endif
  99. wr %g3, 0x0, %psr
  100. nop; nop; nop
  101. jmpl %o7, %g0
  102.  mov %g4, %o7
  103. .globl  __bitops_end
  104. __bitops_end: