xref: /openbmc/linux/arch/sparc/lib/locks.S (revision 4cdb71b6)
1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
288278ca2SAdrian Bunk/*
31da177e4SLinus Torvalds * locks.S: SMP low-level lock primitives on Sparc.
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
61da177e4SLinus Torvalds * Copyright (C) 1998 Anton Blanchard (anton@progsoc.uts.edu.au)
71da177e4SLinus Torvalds * Copyright (C) 1998 Jakub Jelinek   (jj@ultra.linux.cz)
81da177e4SLinus Torvalds */
91da177e4SLinus Torvalds
10*4cdb71b6SMasahiro Yamada#include <linux/export.h>
111da177e4SLinus Torvalds#include <asm/ptrace.h>
121da177e4SLinus Torvalds#include <asm/psr.h>
131da177e4SLinus Torvalds#include <asm/smp.h>
141da177e4SLinus Torvalds#include <asm/spinlock.h>
151da177e4SLinus Torvalds
161da177e4SLinus Torvalds	.text
171da177e4SLinus Torvalds	.align	4
181da177e4SLinus Torvalds
191da177e4SLinus Torvalds	/* Read/writer locks, as usual this is overly clever to make it
201da177e4SLinus Torvalds	 * as fast as possible.
211da177e4SLinus Torvalds	 */
221da177e4SLinus Torvalds
231da177e4SLinus Torvalds	/* caches... */
241da177e4SLinus Torvalds___rw_read_enter_spin_on_wlock:
251da177e4SLinus Torvalds	orcc	%g2, 0x0, %g0
261da177e4SLinus Torvalds	be,a	___rw_read_enter
271da177e4SLinus Torvalds	 ldstub	[%g1 + 3], %g2
281da177e4SLinus Torvalds	b	___rw_read_enter_spin_on_wlock
291da177e4SLinus Torvalds	 ldub	[%g1 + 3], %g2
307a39f522SAl Viro___rw_read_try_spin_on_wlock:
317a39f522SAl Viro	andcc	%g2, 0xff, %g0
327a39f522SAl Viro	be,a	___rw_read_try
337a39f522SAl Viro	 ldstub	[%g1 + 3], %g2
347a39f522SAl Viro	xnorcc	%g2, 0x0, %o0	/* if g2 is ~0, set o0 to 0 and bugger off */
357a39f522SAl Viro	bne,a	___rw_read_enter_spin_on_wlock
367a39f522SAl Viro	 ld	[%g1], %g2
377a39f522SAl Viro	retl
387a39f522SAl Viro	 mov	%g4, %o7
391da177e4SLinus Torvalds___rw_read_exit_spin_on_wlock:
401da177e4SLinus Torvalds	orcc	%g2, 0x0, %g0
411da177e4SLinus Torvalds	be,a	___rw_read_exit
421da177e4SLinus Torvalds	 ldstub	[%g1 + 3], %g2
431da177e4SLinus Torvalds	b	___rw_read_exit_spin_on_wlock
441da177e4SLinus Torvalds	 ldub	[%g1 + 3], %g2
451da177e4SLinus Torvalds___rw_write_enter_spin_on_wlock:
461da177e4SLinus Torvalds	orcc	%g2, 0x0, %g0
471da177e4SLinus Torvalds	be,a	___rw_write_enter
481da177e4SLinus Torvalds	 ldstub	[%g1 + 3], %g2
491da177e4SLinus Torvalds	b	___rw_write_enter_spin_on_wlock
501da177e4SLinus Torvalds	 ld	[%g1], %g2
511da177e4SLinus Torvalds
521da177e4SLinus Torvalds	.globl	___rw_read_enter
53d3867f04SAl ViroEXPORT_SYMBOL(___rw_read_enter)
541da177e4SLinus Torvalds___rw_read_enter:
551da177e4SLinus Torvalds	orcc	%g2, 0x0, %g0
561da177e4SLinus Torvalds	bne,a	___rw_read_enter_spin_on_wlock
571da177e4SLinus Torvalds	 ldub	[%g1 + 3], %g2
581da177e4SLinus Torvalds	ld	[%g1], %g2
591da177e4SLinus Torvalds	add	%g2, 1, %g2
601da177e4SLinus Torvalds	st	%g2, [%g1]
611da177e4SLinus Torvalds	retl
621da177e4SLinus Torvalds	 mov	%g4, %o7
631da177e4SLinus Torvalds
641da177e4SLinus Torvalds	.globl	___rw_read_exit
65d3867f04SAl ViroEXPORT_SYMBOL(___rw_read_exit)
661da177e4SLinus Torvalds___rw_read_exit:
671da177e4SLinus Torvalds	orcc	%g2, 0x0, %g0
681da177e4SLinus Torvalds	bne,a	___rw_read_exit_spin_on_wlock
691da177e4SLinus Torvalds	 ldub	[%g1 + 3], %g2
701da177e4SLinus Torvalds	ld	[%g1], %g2
711da177e4SLinus Torvalds	sub	%g2, 0x1ff, %g2
721da177e4SLinus Torvalds	st	%g2, [%g1]
731da177e4SLinus Torvalds	retl
741da177e4SLinus Torvalds	 mov	%g4, %o7
751da177e4SLinus Torvalds
767a39f522SAl Viro	.globl	___rw_read_try
77d3867f04SAl ViroEXPORT_SYMBOL(___rw_read_try)
787a39f522SAl Viro___rw_read_try:
797a39f522SAl Viro	orcc	%g2, 0x0, %g0
807a39f522SAl Viro	bne	___rw_read_try_spin_on_wlock
817a39f522SAl Viro	 ld	[%g1], %g2
827a39f522SAl Viro	add	%g2, 1, %g2
837a39f522SAl Viro	st	%g2, [%g1]
847a39f522SAl Viro	set	1, %o1
857a39f522SAl Viro	retl
867a39f522SAl Viro	 mov	%g4, %o7
877a39f522SAl Viro
881da177e4SLinus Torvalds	.globl	___rw_write_enter
89d3867f04SAl ViroEXPORT_SYMBOL(___rw_write_enter)
901da177e4SLinus Torvalds___rw_write_enter:
911da177e4SLinus Torvalds	orcc	%g2, 0x0, %g0
921da177e4SLinus Torvalds	bne	___rw_write_enter_spin_on_wlock
931da177e4SLinus Torvalds	 ld	[%g1], %g2
941da177e4SLinus Torvalds	andncc	%g2, 0xff, %g0
951da177e4SLinus Torvalds	bne,a	___rw_write_enter_spin_on_wlock
961da177e4SLinus Torvalds	 stb	%g0, [%g1 + 3]
971da177e4SLinus Torvalds	retl
981da177e4SLinus Torvalds	 mov	%g4, %o7
99