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