VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / arch / sparc64 / lib / splock.S
1 /* splock.S: Spinlock primitives too large to inline.
2  *
3  * Copyright (C) 2004 David S. Miller (davem@redhat.com)
4  */
5
6         .text
7         .align  64
8
9         .globl          _raw_spin_lock
10 _raw_spin_lock:         /* %o0 = lock_ptr */
11 1:      ldstub          [%o0], %g7
12         brnz,pn         %g7, 2f
13          membar         #StoreLoad | #StoreStore
14         retl
15          nop
16 2:      ldub            [%o0], %g7
17         brnz,pt         %g7, 2b
18          membar         #LoadLoad
19         ba,a,pt         %xcc, 1b
20
21         .globl  _raw_spin_lock_flags
22 _raw_spin_lock_flags:   /* %o0 = lock_ptr, %o1 = irq_flags */
23 1:      ldstub          [%o0], %g7
24         brnz,pn         %g7, 2f
25          membar         #StoreLoad | #StoreStore
26         retl
27          nop
28
29 2:      rdpr            %pil, %g2               ! Save PIL
30         wrpr            %o1, %pil               ! Set previous PIL
31 3:      ldub            [%o0], %g7              ! Spin on lock set
32         brnz,pt         %g7, 3b
33          membar         #LoadLoad
34         ba,pt           %xcc, 1b                ! Retry lock acquire
35          wrpr           %g2, %pil               ! Restore PIL