| /* $Id: rwsem.S,v 1.5 2000/05/09 17:40:13 davem Exp $ | 
 |  * Assembly part of rw semaphores. | 
 |  * | 
 |  * Copyright (C) 1999 Jakub Jelinek (jakub@redhat.com) | 
 |  */ | 
 |  | 
 | #include <asm/ptrace.h> | 
 | #include <asm/psr.h> | 
 |  | 
 | 	.section .sched.text | 
 | 	.align	4 | 
 |  | 
 | 	.globl		___down_read | 
 | ___down_read: | 
 | 	rd		%psr, %g3 | 
 | 	nop | 
 | 	nop | 
 | 	nop | 
 | 	or		%g3, PSR_PIL, %g7 | 
 | 	wr		%g7, 0, %psr | 
 | 	nop | 
 | 	nop | 
 | 	nop | 
 | #ifdef CONFIG_SMP | 
 | 1:	ldstub		[%g1 + 4], %g7 | 
 | 	tst		%g7 | 
 | 	bne		1b | 
 | 	 ld		[%g1], %g7 | 
 | 	sub		%g7, 1, %g7 | 
 | 	st		%g7, [%g1] | 
 | 	stb		%g0, [%g1 + 4] | 
 | #else | 
 | 	ld		[%g1], %g7 | 
 | 	sub		%g7, 1, %g7 | 
 | 	st		%g7, [%g1] | 
 | #endif | 
 | 	wr		%g3, 0, %psr | 
 | 	add		%g7, 1, %g7 | 
 | 	nop | 
 | 	nop | 
 | 	subcc		%g7, 1, %g7 | 
 | 	bneg		3f | 
 | 	 nop | 
 | 2:	jmpl		%o7, %g0 | 
 | 	 mov		%g4, %o7 | 
 | 3:	save		%sp, -64, %sp | 
 | 	mov		%g1, %l1 | 
 | 	mov		%g4, %l4 | 
 | 	bcs		4f | 
 | 	 mov		%g5, %l5 | 
 | 	call		down_read_failed | 
 | 	 mov		%l1, %o0 | 
 | 	mov		%l1, %g1 | 
 | 	mov		%l4, %g4 | 
 | 	ba		___down_read | 
 | 	 restore	%l5, %g0, %g5 | 
 | 4:	call		down_read_failed_biased | 
 | 	 mov		%l1, %o0 | 
 | 	mov		%l1, %g1 | 
 | 	mov		%l4, %g4 | 
 | 	ba		2b | 
 | 	 restore	%l5, %g0, %g5 | 
 |  | 
 | 	.globl		___down_write | 
 | ___down_write: | 
 | 	rd		%psr, %g3 | 
 | 	nop | 
 | 	nop | 
 | 	nop | 
 | 	or		%g3, PSR_PIL, %g7 | 
 | 	wr		%g7, 0, %psr | 
 | 	sethi		%hi(0x01000000), %g2 | 
 | 	nop | 
 | 	nop | 
 | #ifdef CONFIG_SMP | 
 | 1:	ldstub		[%g1 + 4], %g7 | 
 | 	tst		%g7 | 
 | 	bne		1b | 
 | 	 ld		[%g1], %g7 | 
 | 	sub		%g7, %g2, %g7 | 
 | 	st		%g7, [%g1] | 
 | 	stb		%g0, [%g1 + 4] | 
 | #else | 
 | 	ld		[%g1], %g7 | 
 | 	sub		%g7, %g2, %g7 | 
 | 	st		%g7, [%g1] | 
 | #endif | 
 | 	wr		%g3, 0, %psr | 
 | 	add		%g7, %g2, %g7 | 
 | 	nop | 
 | 	nop | 
 | 	subcc		%g7, %g2, %g7 | 
 | 	bne		3f | 
 | 	 nop | 
 | 2:	jmpl		%o7, %g0 | 
 | 	 mov		%g4, %o7 | 
 | 3:	save		%sp, -64, %sp | 
 | 	mov		%g1, %l1 | 
 | 	mov		%g4, %l4 | 
 | 	bcs		4f | 
 | 	 mov		%g5, %l5 | 
 | 	call		down_write_failed | 
 | 	 mov		%l1, %o0 | 
 | 	mov		%l1, %g1 | 
 | 	mov		%l4, %g4 | 
 | 	ba		___down_write | 
 | 	 restore	%l5, %g0, %g5 | 
 | 4:	call		down_write_failed_biased | 
 | 	 mov		%l1, %o0 | 
 | 	mov		%l1, %g1 | 
 | 	mov		%l4, %g4 | 
 | 	ba		2b | 
 | 	 restore	%l5, %g0, %g5 | 
 |  | 
 | 	.text | 
 | 	.globl		___up_read | 
 | ___up_read: | 
 | 	rd		%psr, %g3 | 
 | 	nop | 
 | 	nop | 
 | 	nop | 
 | 	or		%g3, PSR_PIL, %g7 | 
 | 	wr		%g7, 0, %psr | 
 | 	nop | 
 | 	nop | 
 | 	nop | 
 | #ifdef CONFIG_SMP | 
 | 1:	ldstub		[%g1 + 4], %g7 | 
 | 	tst		%g7 | 
 | 	bne		1b | 
 | 	 ld		[%g1], %g7 | 
 | 	add		%g7, 1, %g7 | 
 | 	st		%g7, [%g1] | 
 | 	stb		%g0, [%g1 + 4] | 
 | #else | 
 | 	ld		[%g1], %g7 | 
 | 	add		%g7, 1, %g7 | 
 | 	st		%g7, [%g1] | 
 | #endif | 
 | 	wr		%g3, 0, %psr | 
 | 	nop | 
 | 	nop | 
 | 	nop | 
 | 	cmp		%g7, 0 | 
 | 	be		3f | 
 | 	 nop | 
 | 2:	jmpl		%o7, %g0 | 
 | 	 mov		%g4, %o7 | 
 | 3:	save		%sp, -64, %sp | 
 | 	mov		%g1, %l1 | 
 | 	mov		%g4, %l4 | 
 | 	mov		%g5, %l5 | 
 | 	clr		%o1 | 
 | 	call		__rwsem_wake | 
 | 	 mov		%l1, %o0 | 
 | 	mov		%l1, %g1 | 
 | 	mov		%l4, %g4 | 
 | 	ba		2b | 
 | 	 restore	%l5, %g0, %g5 | 
 |  | 
 | 	.globl		___up_write | 
 | ___up_write: | 
 | 	rd		%psr, %g3 | 
 | 	nop | 
 | 	nop | 
 | 	nop | 
 | 	or		%g3, PSR_PIL, %g7 | 
 | 	wr		%g7, 0, %psr | 
 | 	sethi		%hi(0x01000000), %g2 | 
 | 	nop | 
 | 	nop | 
 | #ifdef CONFIG_SMP | 
 | 1:	ldstub		[%g1 + 4], %g7 | 
 | 	tst		%g7 | 
 | 	bne		1b | 
 | 	 ld		[%g1], %g7 | 
 | 	add		%g7, %g2, %g7 | 
 | 	st		%g7, [%g1] | 
 | 	stb		%g0, [%g1 + 4] | 
 | #else | 
 | 	ld		[%g1], %g7 | 
 | 	add		%g7, %g2, %g7 | 
 | 	st		%g7, [%g1] | 
 | #endif | 
 | 	wr		%g3, 0, %psr | 
 | 	sub		%g7, %g2, %g7 | 
 | 	nop | 
 | 	nop | 
 | 	addcc		%g7, %g2, %g7 | 
 | 	bcs		3f | 
 | 	 nop | 
 | 2:	jmpl		%o7, %g0 | 
 | 	 mov		%g4, %o7 | 
 | 3:	save		%sp, -64, %sp | 
 | 	mov		%g1, %l1 | 
 | 	mov		%g4, %l4 | 
 | 	mov		%g5, %l5 | 
 | 	mov		%g7, %o1 | 
 | 	call		__rwsem_wake | 
 | 	 mov		%l1, %o0 | 
 | 	mov		%l1, %g1 | 
 | 	mov		%l4, %g4 | 
 | 	ba		2b | 
 | 	 restore	%l5, %g0, %g5 |