| /* Slow paths of read/write spinlocks. */ | |
| #include <linux/linkage.h> | |
| #include <asm/alternative-asm.h> | |
| #include <asm/frame.h> | |
| #include <asm/rwlock.h> | |
| #ifdef CONFIG_X86_32 | |
| # define __lock_ptr eax | |
| #else | |
| # define __lock_ptr rdi | |
| #endif | |
| ENTRY(__write_lock_failed) | |
| CFI_STARTPROC | |
| FRAME | |
| 0: LOCK_PREFIX | |
| WRITE_LOCK_ADD($RW_LOCK_BIAS) (%__lock_ptr) | |
| 1: rep; nop | |
| cmpl $WRITE_LOCK_CMP, (%__lock_ptr) | |
| jne 1b | |
| LOCK_PREFIX | |
| WRITE_LOCK_SUB($RW_LOCK_BIAS) (%__lock_ptr) | |
| jnz 0b | |
| ENDFRAME | |
| ret | |
| CFI_ENDPROC | |
| END(__write_lock_failed) | |
| ENTRY(__read_lock_failed) | |
| CFI_STARTPROC | |
| FRAME | |
| 0: LOCK_PREFIX | |
| READ_LOCK_SIZE(inc) (%__lock_ptr) | |
| 1: rep; nop | |
| READ_LOCK_SIZE(cmp) $1, (%__lock_ptr) | |
| js 1b | |
| LOCK_PREFIX | |
| READ_LOCK_SIZE(dec) (%__lock_ptr) | |
| js 0b | |
| ENDFRAME | |
| ret | |
| CFI_ENDPROC | |
| END(__read_lock_failed) |