]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
88278ca2 | 2 | /* |
1da177e4 LT |
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 <asm/ptrace.h> | |
11 | #include <asm/psr.h> | |
12 | #include <asm/smp.h> | |
13 | #include <asm/spinlock.h> | |
d3867f04 | 14 | #include <asm/export.h> |
1da177e4 LT |
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 | |
7a39f522 AV |
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 | |
1da177e4 LT |
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 | |
d3867f04 | 53 | EXPORT_SYMBOL(___rw_read_enter) |
1da177e4 LT |
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 | |
d3867f04 | 65 | EXPORT_SYMBOL(___rw_read_exit) |
1da177e4 LT |
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 | ||
7a39f522 | 76 | .globl ___rw_read_try |
d3867f04 | 77 | EXPORT_SYMBOL(___rw_read_try) |
7a39f522 AV |
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 | ||
1da177e4 | 88 | .globl ___rw_write_enter |
d3867f04 | 89 | EXPORT_SYMBOL(___rw_write_enter) |
1da177e4 LT |
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 |