1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * locks.S: SMP low-level lock primitives on S 4 * 5 * Copyright (C) 1996 David S. Miller (davem@c 6 * Copyright (C) 1998 Anton Blanchard (anton@p 7 * Copyright (C) 1998 Jakub Jelinek (jj@ultr 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 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 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_wloc 50 ld [%g1], %g2 51 52 .globl ___rw_read_enter 53 EXPORT_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 65 EXPORT_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 77 EXPORT_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 89 EXPORT_SYMBOL(___rw_write_enter) 90 ___rw_write_enter: 91 orcc %g2, 0x0, %g0 92 bne ___rw_write_enter_spin_on_wloc 93 ld [%g1], %g2 94 andncc %g2, 0xff, %g0 95 bne,a ___rw_write_enter_spin_on_wloc 96 stb %g0, [%g1 + 3] 97 retl 98 mov %g4, %o7
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.