39 lines
		
	
	
		
			646 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			646 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
/* Slow paths of read/write spinlocks. */
 | 
						|
 | 
						|
#include <linux/linkage.h>
 | 
						|
#include <asm/rwlock.h>
 | 
						|
#include <asm/alternative-asm.h>
 | 
						|
#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)
 |