fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / sparc / lib / locks.S
index 95fa484..b1df55c 100644 (file)
@@ -25,6 +25,15 @@ ___rw_read_enter_spin_on_wlock:
         ldstub [%g1 + 3], %g2
        b       ___rw_read_enter_spin_on_wlock
         ldub   [%g1 + 3], %g2
+___rw_read_try_spin_on_wlock:
+       andcc   %g2, 0xff, %g0
+       be,a    ___rw_read_try
+        ldstub [%g1 + 3], %g2
+       xnorcc  %g2, 0x0, %o0   /* if g2 is ~0, set o0 to 0 and bugger off */
+       bne,a   ___rw_read_enter_spin_on_wlock
+        ld     [%g1], %g2
+       retl
+        mov    %g4, %o7
 ___rw_read_exit_spin_on_wlock:
        orcc    %g2, 0x0, %g0
        be,a    ___rw_read_exit
@@ -60,6 +69,17 @@ ___rw_read_exit:
        retl
         mov    %g4, %o7
 
+       .globl  ___rw_read_try
+___rw_read_try:
+       orcc    %g2, 0x0, %g0
+       bne     ___rw_read_try_spin_on_wlock
+        ld     [%g1], %g2
+       add     %g2, 1, %g2
+       st      %g2, [%g1]
+       set     1, %o1
+       retl
+        mov    %g4, %o7
+
        .globl  ___rw_write_enter
 ___rw_write_enter:
        orcc    %g2, 0x0, %g0