locks.S 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /* $Id: locks.S,v 1.16 2000/02/26 11:02:47 anton Exp $
  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_exit_spin_on_wlock:
  25. orcc %g2, 0x0, %g0
  26. be,a ___rw_read_exit
  27. ldstub [%g1 + 3], %g2
  28. b ___rw_read_exit_spin_on_wlock
  29. ldub [%g1 + 3], %g2
  30. ___rw_write_enter_spin_on_wlock:
  31. orcc %g2, 0x0, %g0
  32. be,a ___rw_write_enter
  33. ldstub [%g1 + 3], %g2
  34. b ___rw_write_enter_spin_on_wlock
  35. ld [%g1], %g2
  36. .globl ___rw_read_enter
  37. ___rw_read_enter:
  38. orcc %g2, 0x0, %g0
  39. bne,a ___rw_read_enter_spin_on_wlock
  40. ldub [%g1 + 3], %g2
  41. ld [%g1], %g2
  42. add %g2, 1, %g2
  43. st %g2, [%g1]
  44. retl
  45. mov %g4, %o7
  46. .globl ___rw_read_exit
  47. ___rw_read_exit:
  48. orcc %g2, 0x0, %g0
  49. bne,a ___rw_read_exit_spin_on_wlock
  50. ldub [%g1 + 3], %g2
  51. ld [%g1], %g2
  52. sub %g2, 0x1ff, %g2
  53. st %g2, [%g1]
  54. retl
  55. mov %g4, %o7
  56. .globl ___rw_write_enter
  57. ___rw_write_enter:
  58. orcc %g2, 0x0, %g0
  59. bne ___rw_write_enter_spin_on_wlock
  60. ld [%g1], %g2
  61. andncc %g2, 0xff, %g0
  62. bne,a ___rw_write_enter_spin_on_wlock
  63. stb %g0, [%g1 + 3]
  64. retl
  65. mov %g4, %o7