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

Linux/Unix编程

开发平台:

Unix_Linux

  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/cprefix.h>
  9. #include <asm/ptrace.h>
  10. #include <asm/psr.h>
  11. #include <asm/smp.h>
  12. #include <asm/spinlock.h>
  13. .text
  14. .align 4
  15. /* Read/writer locks, as usual this is overly clever to make it
  16.  * as fast as possible.
  17.  */
  18. /* caches... */
  19. ___rw_read_enter_spin_on_wlock:
  20. orcc %g2, 0x0, %g0
  21. be,a ___rw_read_enter
  22.  ldstub [%g1 + 3], %g2
  23. b ___rw_read_enter_spin_on_wlock
  24.  ldub [%g1 + 3], %g2
  25. ___rw_read_exit_spin_on_wlock:
  26. orcc %g2, 0x0, %g0
  27. be,a ___rw_read_exit
  28.  ldstub [%g1 + 3], %g2
  29. b ___rw_read_exit_spin_on_wlock
  30.  ldub [%g1 + 3], %g2
  31. ___rw_write_enter_spin_on_wlock:
  32. orcc %g2, 0x0, %g0
  33. be,a ___rw_write_enter
  34.  ldstub [%g1 + 3], %g2
  35. b ___rw_write_enter_spin_on_wlock
  36.  ld [%g1], %g2
  37. .globl ___rw_read_enter
  38. ___rw_read_enter:
  39. orcc %g2, 0x0, %g0
  40. bne,a ___rw_read_enter_spin_on_wlock
  41.  ldub [%g1 + 3], %g2
  42. ld [%g1], %g2
  43. add %g2, 1, %g2
  44. st %g2, [%g1]
  45. retl
  46.  mov %g4, %o7
  47. .globl ___rw_read_exit
  48. ___rw_read_exit:
  49. orcc %g2, 0x0, %g0
  50. bne,a ___rw_read_exit_spin_on_wlock
  51.  ldub [%g1 + 3], %g2
  52. ld [%g1], %g2
  53. sub %g2, 0x1ff, %g2
  54. st %g2, [%g1]
  55. retl
  56.  mov %g4, %o7
  57. .globl ___rw_write_enter
  58. ___rw_write_enter:
  59. orcc %g2, 0x0, %g0
  60. bne ___rw_write_enter_spin_on_wlock
  61.  ld [%g1], %g2
  62. andncc %g2, 0xff, %g0
  63. bne,a ___rw_write_enter_spin_on_wlock
  64.  stb %g0, [%g1 + 3]
  65. retl
  66.  mov %g4, %o7