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 |
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_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 | |