xref: /linux/arch/sparc/lib/locks.S (revision f3d9478b2ce468c3115b02ecae7e975990697f15)
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
73