| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* $Id: locks.S,v 1.16 2000/02/26 11:02:47 anton Exp $ | 
|  | 2 | * locks.S: SMP low-level lock primitives on Sparc. | 
|  | 3 | * | 
|  | 4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) | 
|  | 5 | * Copyright (C) 1998 Anton Blanchard (anton@progsoc.uts.edu.au) | 
|  | 6 | * Copyright (C) 1998 Jakub Jelinek   (jj@ultra.linux.cz) | 
|  | 7 | */ | 
|  | 8 |  | 
|  | 9 | #include <asm/ptrace.h> | 
|  | 10 | #include <asm/psr.h> | 
|  | 11 | #include <asm/smp.h> | 
|  | 12 | #include <asm/spinlock.h> | 
|  | 13 |  | 
|  | 14 | .text | 
|  | 15 | .align	4 | 
|  | 16 |  | 
|  | 17 | /* Read/writer locks, as usual this is overly clever to make it | 
|  | 18 | * as fast as possible. | 
|  | 19 | */ | 
|  | 20 |  | 
|  | 21 | /* caches... */ | 
|  | 22 | ___rw_read_enter_spin_on_wlock: | 
|  | 23 | orcc	%g2, 0x0, %g0 | 
|  | 24 | be,a	___rw_read_enter | 
|  | 25 | ldstub	[%g1 + 3], %g2 | 
|  | 26 | b	___rw_read_enter_spin_on_wlock | 
|  | 27 | ldub	[%g1 + 3], %g2 | 
|  | 28 | ___rw_read_exit_spin_on_wlock: | 
|  | 29 | orcc	%g2, 0x0, %g0 | 
|  | 30 | be,a	___rw_read_exit | 
|  | 31 | ldstub	[%g1 + 3], %g2 | 
|  | 32 | b	___rw_read_exit_spin_on_wlock | 
|  | 33 | ldub	[%g1 + 3], %g2 | 
|  | 34 | ___rw_write_enter_spin_on_wlock: | 
|  | 35 | orcc	%g2, 0x0, %g0 | 
|  | 36 | be,a	___rw_write_enter | 
|  | 37 | ldstub	[%g1 + 3], %g2 | 
|  | 38 | b	___rw_write_enter_spin_on_wlock | 
|  | 39 | ld	[%g1], %g2 | 
|  | 40 |  | 
|  | 41 | .globl	___rw_read_enter | 
|  | 42 | ___rw_read_enter: | 
|  | 43 | orcc	%g2, 0x0, %g0 | 
|  | 44 | bne,a	___rw_read_enter_spin_on_wlock | 
|  | 45 | ldub	[%g1 + 3], %g2 | 
|  | 46 | ld	[%g1], %g2 | 
|  | 47 | add	%g2, 1, %g2 | 
|  | 48 | st	%g2, [%g1] | 
|  | 49 | retl | 
|  | 50 | mov	%g4, %o7 | 
|  | 51 |  | 
|  | 52 | .globl	___rw_read_exit | 
|  | 53 | ___rw_read_exit: | 
|  | 54 | orcc	%g2, 0x0, %g0 | 
|  | 55 | bne,a	___rw_read_exit_spin_on_wlock | 
|  | 56 | ldub	[%g1 + 3], %g2 | 
|  | 57 | ld	[%g1], %g2 | 
|  | 58 | sub	%g2, 0x1ff, %g2 | 
|  | 59 | st	%g2, [%g1] | 
|  | 60 | retl | 
|  | 61 | mov	%g4, %o7 | 
|  | 62 |  | 
|  | 63 | .globl	___rw_write_enter | 
|  | 64 | ___rw_write_enter: | 
|  | 65 | orcc	%g2, 0x0, %g0 | 
|  | 66 | bne	___rw_write_enter_spin_on_wlock | 
|  | 67 | ld	[%g1], %g2 | 
|  | 68 | andncc	%g2, 0xff, %g0 | 
|  | 69 | bne,a	___rw_write_enter_spin_on_wlock | 
|  | 70 | stb	%g0, [%g1 + 3] | 
|  | 71 | retl | 
|  | 72 | mov	%g4, %o7 |