Merge tag 'v3.1-rc10' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux
[linux-2.6/linux-mips.git] / arch / x86 / lib / rwlock.S
blob1cad22139c880659aa1428cb053f9070b00ddce0
1 /* Slow paths of read/write spinlocks. */
3 #include <linux/linkage.h>
4 #include <asm/alternative-asm.h>
5 #include <asm/frame.h>
6 #include <asm/rwlock.h>
8 #ifdef CONFIG_X86_32
9 # define __lock_ptr eax
10 #else
11 # define __lock_ptr rdi
12 #endif
14 ENTRY(__write_lock_failed)
15         CFI_STARTPROC
16         FRAME
17 0:      LOCK_PREFIX
18         WRITE_LOCK_ADD($RW_LOCK_BIAS) (%__lock_ptr)
19 1:      rep; nop
20         cmpl    $WRITE_LOCK_CMP, (%__lock_ptr)
21         jne     1b
22         LOCK_PREFIX
23         WRITE_LOCK_SUB($RW_LOCK_BIAS) (%__lock_ptr)
24         jnz     0b
25         ENDFRAME
26         ret
27         CFI_ENDPROC
28 END(__write_lock_failed)
30 ENTRY(__read_lock_failed)
31         CFI_STARTPROC
32         FRAME
33 0:      LOCK_PREFIX
34         READ_LOCK_SIZE(inc) (%__lock_ptr)
35 1:      rep; nop
36         READ_LOCK_SIZE(cmp) $1, (%__lock_ptr)
37         js      1b
38         LOCK_PREFIX
39         READ_LOCK_SIZE(dec) (%__lock_ptr)
40         js      0b
41         ENDFRAME
42         ret
43         CFI_ENDPROC
44 END(__read_lock_failed)