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