This commit was manufactured by cvs2svn to create branch 'vserver'.
[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_flags
10 _raw_spin_lock_flags:   /* %o0 = lock_ptr, %o1 = irq_flags */
11 1:      ldstub          [%o0], %g7
12         brnz,pn         %g7, 2f
13          membar         #StoreLoad | #StoreStore
14         retl
15          nop
16
17 2:      rdpr            %pil, %g2               ! Save PIL
18         wrpr            %o1, %pil               ! Set previous PIL
19 3:      ldub            [%o0], %g7              ! Spin on lock set
20         brnz,pt         %g7, 3b
21          membar         #LoadLoad
22         ba,pt           %xcc, 1b                ! Retry lock acquire
23          wrpr           %g2, %pil               ! Restore PIL