fca17829caa86a45b62fe3df822f90b18f72f2d2
[pandora-kernel.git] / arch / x86 / lib / rwlock.S
1 /* Slow paths of read/write spinlocks. */
2
3 #include <linux/linkage.h>
4 #include <asm/alternative-asm.h>
5 #include <asm/frame.h>
6 #include <asm/rwlock.h>
7
8 #ifdef CONFIG_X86_32
9 # define __lock_ptr eax
10 #else
11 # define __lock_ptr rdi
12 #endif
13
14 ENTRY(__write_lock_failed)
15         CFI_STARTPROC
16         FRAME
17 0:      LOCK_PREFIX
18         addl    $RW_LOCK_BIAS, (%__lock_ptr)
19 1:      rep; nop
20         cmpl    $RW_LOCK_BIAS, (%__lock_ptr)
21         jne     1b
22         LOCK_PREFIX
23         subl    $RW_LOCK_BIAS, (%__lock_ptr)
24         jnz     0b
25         ENDFRAME
26         ret
27         CFI_ENDPROC
28 END(__write_lock_failed)
29
30 ENTRY(__read_lock_failed)
31         CFI_STARTPROC
32         FRAME
33 0:      LOCK_PREFIX
34         incl    (%__lock_ptr)
35 1:      rep; nop
36         cmpl    $1, (%__lock_ptr)
37         js      1b
38         LOCK_PREFIX
39         decl    (%__lock_ptr)
40         js      0b
41         ENDFRAME
42         ret
43         CFI_ENDPROC
44 END(__read_lock_failed)