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)
 |