93 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * locks.S: SMP low-level lock primitives on Sparc.
 | |
|  *
 | |
|  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
 | |
|  * Copyright (C) 1998 Anton Blanchard (anton@progsoc.uts.edu.au)
 | |
|  * Copyright (C) 1998 Jakub Jelinek   (jj@ultra.linux.cz)
 | |
|  */
 | |
| 
 | |
| #include <asm/ptrace.h>
 | |
| #include <asm/psr.h>
 | |
| #include <asm/smp.h>
 | |
| #include <asm/spinlock.h>
 | |
| 
 | |
| 	.text
 | |
| 	.align	4
 | |
| 
 | |
| 	/* Read/writer locks, as usual this is overly clever to make it
 | |
| 	 * as fast as possible.
 | |
| 	 */
 | |
| 
 | |
| 	/* caches... */
 | |
| ___rw_read_enter_spin_on_wlock:
 | |
| 	orcc	%g2, 0x0, %g0
 | |
| 	be,a	___rw_read_enter
 | |
| 	 ldstub	[%g1 + 3], %g2
 | |
| 	b	___rw_read_enter_spin_on_wlock
 | |
| 	 ldub	[%g1 + 3], %g2
 | |
| ___rw_read_try_spin_on_wlock:
 | |
| 	andcc	%g2, 0xff, %g0
 | |
| 	be,a	___rw_read_try
 | |
| 	 ldstub	[%g1 + 3], %g2
 | |
| 	xnorcc	%g2, 0x0, %o0	/* if g2 is ~0, set o0 to 0 and bugger off */
 | |
| 	bne,a	___rw_read_enter_spin_on_wlock
 | |
| 	 ld	[%g1], %g2
 | |
| 	retl
 | |
| 	 mov	%g4, %o7
 | |
| ___rw_read_exit_spin_on_wlock:
 | |
| 	orcc	%g2, 0x0, %g0
 | |
| 	be,a	___rw_read_exit
 | |
| 	 ldstub	[%g1 + 3], %g2
 | |
| 	b	___rw_read_exit_spin_on_wlock
 | |
| 	 ldub	[%g1 + 3], %g2
 | |
| ___rw_write_enter_spin_on_wlock:
 | |
| 	orcc	%g2, 0x0, %g0
 | |
| 	be,a	___rw_write_enter
 | |
| 	 ldstub	[%g1 + 3], %g2
 | |
| 	b	___rw_write_enter_spin_on_wlock
 | |
| 	 ld	[%g1], %g2
 | |
| 
 | |
| 	.globl	___rw_read_enter
 | |
| ___rw_read_enter:
 | |
| 	orcc	%g2, 0x0, %g0
 | |
| 	bne,a	___rw_read_enter_spin_on_wlock
 | |
| 	 ldub	[%g1 + 3], %g2
 | |
| 	ld	[%g1], %g2
 | |
| 	add	%g2, 1, %g2
 | |
| 	st	%g2, [%g1]
 | |
| 	retl
 | |
| 	 mov	%g4, %o7
 | |
| 
 | |
| 	.globl	___rw_read_exit
 | |
| ___rw_read_exit:
 | |
| 	orcc	%g2, 0x0, %g0
 | |
| 	bne,a	___rw_read_exit_spin_on_wlock
 | |
| 	 ldub	[%g1 + 3], %g2
 | |
| 	ld	[%g1], %g2
 | |
| 	sub	%g2, 0x1ff, %g2
 | |
| 	st	%g2, [%g1]
 | |
| 	retl
 | |
| 	 mov	%g4, %o7
 | |
| 
 | |
| 	.globl	___rw_read_try
 | |
| ___rw_read_try:
 | |
| 	orcc	%g2, 0x0, %g0
 | |
| 	bne	___rw_read_try_spin_on_wlock
 | |
| 	 ld	[%g1], %g2
 | |
| 	add	%g2, 1, %g2
 | |
| 	st	%g2, [%g1]
 | |
| 	set	1, %o1
 | |
| 	retl
 | |
| 	 mov	%g4, %o7
 | |
| 
 | |
| 	.globl	___rw_write_enter
 | |
| ___rw_write_enter:
 | |
| 	orcc	%g2, 0x0, %g0
 | |
| 	bne	___rw_write_enter_spin_on_wlock
 | |
| 	 ld	[%g1], %g2
 | |
| 	andncc	%g2, 0xff, %g0
 | |
| 	bne,a	___rw_write_enter_spin_on_wlock
 | |
| 	 stb	%g0, [%g1 + 3]
 | |
| 	retl
 | |
| 	 mov	%g4, %o7
 |