locks.S 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * locks.S: SMP low-level lock primitives on Sparc.
  3. *
  4. * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
  5. * Copyright (C) 1998 Anton Blanchard (anton@progsoc.uts.edu.au)
  6. * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz)
  7. */
  8. #include <asm/ptrace.h>
  9. #include <asm/psr.h>
  10. #include <asm/smp.h>
  11. #include <asm/spinlock.h>
  12. .text
  13. .align 4
  14. /* Read/writer locks, as usual this is overly clever to make it
  15. * as fast as possible.
  16. */
  17. /* caches... */
  18. ___rw_read_enter_spin_on_wlock:
  19. orcc %g2, 0x0, %g0
  20. be,a ___rw_read_enter
  21. ldstub [%g1 + 3], %g2
  22. b ___rw_read_enter_spin_on_wlock
  23. ldub [%g1 + 3], %g2
  24. ___rw_read_try_spin_on_wlock:
  25. andcc %g2, 0xff, %g0
  26. be,a ___rw_read_try
  27. ldstub [%g1 + 3], %g2
  28. xnorcc %g2, 0x0, %o0 /* if g2 is ~0, set o0 to 0 and bugger off */
  29. bne,a ___rw_read_enter_spin_on_wlock
  30. ld [%g1], %g2
  31. retl
  32. mov %g4, %o7
  33. ___rw_read_exit_spin_on_wlock:
  34. orcc %g2, 0x0, %g0
  35. be,a ___rw_read_exit
  36. ldstub [%g1 + 3], %g2
  37. b ___rw_read_exit_spin_on_wlock
  38. ldub [%g1 + 3], %g2
  39. ___rw_write_enter_spin_on_wlock:
  40. orcc %g2, 0x0, %g0
  41. be,a ___rw_write_enter
  42. ldstub [%g1 + 3], %g2
  43. b ___rw_write_enter_spin_on_wlock
  44. ld [%g1], %g2
  45. .globl ___rw_read_enter
  46. ___rw_read_enter:
  47. orcc %g2, 0x0, %g0
  48. bne,a ___rw_read_enter_spin_on_wlock
  49. ldub [%g1 + 3], %g2
  50. ld [%g1], %g2
  51. add %g2, 1, %g2
  52. st %g2, [%g1]
  53. retl
  54. mov %g4, %o7
  55. .globl ___rw_read_exit
  56. ___rw_read_exit:
  57. orcc %g2, 0x0, %g0
  58. bne,a ___rw_read_exit_spin_on_wlock
  59. ldub [%g1 + 3], %g2
  60. ld [%g1], %g2
  61. sub %g2, 0x1ff, %g2
  62. st %g2, [%g1]
  63. retl
  64. mov %g4, %o7
  65. .globl ___rw_read_try
  66. ___rw_read_try:
  67. orcc %g2, 0x0, %g0
  68. bne ___rw_read_try_spin_on_wlock
  69. ld [%g1], %g2
  70. add %g2, 1, %g2
  71. st %g2, [%g1]
  72. set 1, %o1
  73. retl
  74. mov %g4, %o7
  75. .globl ___rw_write_enter
  76. ___rw_write_enter:
  77. orcc %g2, 0x0, %g0
  78. bne ___rw_write_enter_spin_on_wlock
  79. ld [%g1], %g2
  80. andncc %g2, 0xff, %g0
  81. bne,a ___rw_write_enter_spin_on_wlock
  82. stb %g0, [%g1 + 3]
  83. retl
  84. mov %g4, %o7