1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * locks.S: SMP low-level lock primitives on Sparc.
4 *
5 * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
6 * Copyright (C) 1998 Anton Blanchard (anton@progsoc.uts.edu.au)
7 * Copyright (C) 1998 Jakub Jelinek   (jj@ultra.linux.cz)
8 */
9
10#include <asm/ptrace.h>
11#include <asm/psr.h>
12#include <asm/smp.h>
13#include <asm/spinlock.h>
14#include <asm/export.h>
15
16	.text
17	.align	4
18
19	/* Read/writer locks, as usual this is overly clever to make it
20	 * as fast as possible.
21	 */
22
23	/* caches... */
24___rw_read_enter_spin_on_wlock:
25	orcc	%g2, 0x0, %g0
26	be,a	___rw_read_enter
27	 ldstub	[%g1 + 3], %g2
28	b	___rw_read_enter_spin_on_wlock
29	 ldub	[%g1 + 3], %g2
30___rw_read_try_spin_on_wlock:
31	andcc	%g2, 0xff, %g0
32	be,a	___rw_read_try
33	 ldstub	[%g1 + 3], %g2
34	xnorcc	%g2, 0x0, %o0	/* if g2 is ~0, set o0 to 0 and bugger off */
35	bne,a	___rw_read_enter_spin_on_wlock
36	 ld	[%g1], %g2
37	retl
38	 mov	%g4, %o7
39___rw_read_exit_spin_on_wlock:
40	orcc	%g2, 0x0, %g0
41	be,a	___rw_read_exit
42	 ldstub	[%g1 + 3], %g2
43	b	___rw_read_exit_spin_on_wlock
44	 ldub	[%g1 + 3], %g2
45___rw_write_enter_spin_on_wlock:
46	orcc	%g2, 0x0, %g0
47	be,a	___rw_write_enter
48	 ldstub	[%g1 + 3], %g2
49	b	___rw_write_enter_spin_on_wlock
50	 ld	[%g1], %g2
51
52	.globl	___rw_read_enter
53EXPORT_SYMBOL(___rw_read_enter)
54___rw_read_enter:
55	orcc	%g2, 0x0, %g0
56	bne,a	___rw_read_enter_spin_on_wlock
57	 ldub	[%g1 + 3], %g2
58	ld	[%g1], %g2
59	add	%g2, 1, %g2
60	st	%g2, [%g1]
61	retl
62	 mov	%g4, %o7
63
64	.globl	___rw_read_exit
65EXPORT_SYMBOL(___rw_read_exit)
66___rw_read_exit:
67	orcc	%g2, 0x0, %g0
68	bne,a	___rw_read_exit_spin_on_wlock
69	 ldub	[%g1 + 3], %g2
70	ld	[%g1], %g2
71	sub	%g2, 0x1ff, %g2
72	st	%g2, [%g1]
73	retl
74	 mov	%g4, %o7
75
76	.globl	___rw_read_try
77EXPORT_SYMBOL(___rw_read_try)
78___rw_read_try:
79	orcc	%g2, 0x0, %g0
80	bne	___rw_read_try_spin_on_wlock
81	 ld	[%g1], %g2
82	add	%g2, 1, %g2
83	st	%g2, [%g1]
84	set	1, %o1
85	retl
86	 mov	%g4, %o7
87
88	.globl	___rw_write_enter
89EXPORT_SYMBOL(___rw_write_enter)
90___rw_write_enter:
91	orcc	%g2, 0x0, %g0
92	bne	___rw_write_enter_spin_on_wlock
93	 ld	[%g1], %g2
94	andncc	%g2, 0xff, %g0
95	bne,a	___rw_write_enter_spin_on_wlock
96	 stb	%g0, [%g1 + 3]
97	retl
98	 mov	%g4, %o7
99