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 <linux/export.h> 11#include <asm/ptrace.h> 12#include <asm/psr.h> 13#include <asm/smp.h> 14#include <asm/spinlock.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