Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Apr 14-17, 2025
Register
Loading...
v3.1
 
 1/*
 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_try_spin_on_wlock:
29	andcc	%g2, 0xff, %g0
30	be,a	___rw_read_try
31	 ldstub	[%g1 + 3], %g2
32	xnorcc	%g2, 0x0, %o0	/* if g2 is ~0, set o0 to 0 and bugger off */
33	bne,a	___rw_read_enter_spin_on_wlock
34	 ld	[%g1], %g2
35	retl
36	 mov	%g4, %o7
37___rw_read_exit_spin_on_wlock:
38	orcc	%g2, 0x0, %g0
39	be,a	___rw_read_exit
40	 ldstub	[%g1 + 3], %g2
41	b	___rw_read_exit_spin_on_wlock
42	 ldub	[%g1 + 3], %g2
43___rw_write_enter_spin_on_wlock:
44	orcc	%g2, 0x0, %g0
45	be,a	___rw_write_enter
46	 ldstub	[%g1 + 3], %g2
47	b	___rw_write_enter_spin_on_wlock
48	 ld	[%g1], %g2
49
50	.globl	___rw_read_enter
 
51___rw_read_enter:
52	orcc	%g2, 0x0, %g0
53	bne,a	___rw_read_enter_spin_on_wlock
54	 ldub	[%g1 + 3], %g2
55	ld	[%g1], %g2
56	add	%g2, 1, %g2
57	st	%g2, [%g1]
58	retl
59	 mov	%g4, %o7
60
61	.globl	___rw_read_exit
 
62___rw_read_exit:
63	orcc	%g2, 0x0, %g0
64	bne,a	___rw_read_exit_spin_on_wlock
65	 ldub	[%g1 + 3], %g2
66	ld	[%g1], %g2
67	sub	%g2, 0x1ff, %g2
68	st	%g2, [%g1]
69	retl
70	 mov	%g4, %o7
71
72	.globl	___rw_read_try
 
73___rw_read_try:
74	orcc	%g2, 0x0, %g0
75	bne	___rw_read_try_spin_on_wlock
76	 ld	[%g1], %g2
77	add	%g2, 1, %g2
78	st	%g2, [%g1]
79	set	1, %o1
80	retl
81	 mov	%g4, %o7
82
83	.globl	___rw_write_enter
 
84___rw_write_enter:
85	orcc	%g2, 0x0, %g0
86	bne	___rw_write_enter_spin_on_wlock
87	 ld	[%g1], %g2
88	andncc	%g2, 0xff, %g0
89	bne,a	___rw_write_enter_spin_on_wlock
90	 stb	%g0, [%g1 + 3]
91	retl
92	 mov	%g4, %o7
v5.9
 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