/* Slow paths of read/write spinlocks. */ | |
#include <linux/linkage.h> | |
#include <asm/rwlock.h> | |
#include <asm/alternative-asm.i> | |
#include <asm/dwarf2.h> | |
/* rdi: pointer to rwlock_t */ | |
ENTRY(__write_lock_failed) | |
CFI_STARTPROC | |
LOCK_PREFIX | |
addl $RW_LOCK_BIAS,(%rdi) | |
1: rep | |
nop | |
cmpl $RW_LOCK_BIAS,(%rdi) | |
jne 1b | |
LOCK_PREFIX | |
subl $RW_LOCK_BIAS,(%rdi) | |
jnz __write_lock_failed | |
ret | |
CFI_ENDPROC | |
END(__write_lock_failed) | |
/* rdi: pointer to rwlock_t */ | |
ENTRY(__read_lock_failed) | |
CFI_STARTPROC | |
LOCK_PREFIX | |
incl (%rdi) | |
1: rep | |
nop | |
cmpl $1,(%rdi) | |
js 1b | |
LOCK_PREFIX | |
decl (%rdi) | |
js __read_lock_failed | |
ret | |
CFI_ENDPROC | |
END(__read_lock_failed) |