Jan Beulich | 4625cd6 | 2011-07-19 12:59:51 +0100 | [diff] [blame^] | 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) |