Merge tag 'v3.16-rc6' into next
[deliverable/linux.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 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)
29
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)
This page took 0.033054 seconds and 5 git commands to generate.