]>
Commit | Line | Data |
---|---|---|
a0ae6280 GR |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. | |
3 | ||
4 | #include <linux/linkage.h> | |
5 | #include <abi/entry.h> | |
6 | ||
7 | .text | |
8 | ||
9 | /* | |
10 | * int csky_cmpxchg(int oldval, int newval, int *ptr) | |
11 | * | |
12 | * If *ptr != oldval && return 1, | |
13 | * else *ptr = newval return 0. | |
14 | */ | |
15 | #ifdef CONFIG_CPU_HAS_LDSTEX | |
16 | ENTRY(csky_cmpxchg) | |
17 | USPTOKSP | |
18 | mfcr a3, epc | |
19 | INCTRAP a3 | |
20 | ||
21 | subi sp, 8 | |
22 | stw a3, (sp, 0) | |
23 | mfcr a3, epsr | |
24 | stw a3, (sp, 4) | |
25 | ||
26 | psrset ee | |
27 | 1: | |
28 | ldex a3, (a2) | |
29 | cmpne a0, a3 | |
30 | bt16 2f | |
31 | mov a3, a1 | |
32 | stex a3, (a2) | |
33 | bez a3, 1b | |
34 | 2: | |
35 | sync.is | |
36 | mvc a0 | |
37 | ldw a3, (sp, 0) | |
38 | mtcr a3, epc | |
39 | ldw a3, (sp, 4) | |
40 | mtcr a3, epsr | |
41 | addi sp, 8 | |
42 | KSPTOUSP | |
43 | rte | |
44 | END(csky_cmpxchg) | |
45 | #else | |
46 | ENTRY(csky_cmpxchg) | |
47 | USPTOKSP | |
48 | mfcr a3, epc | |
49 | INCTRAP a3 | |
50 | ||
51 | subi sp, 8 | |
52 | stw a3, (sp, 0) | |
53 | mfcr a3, epsr | |
54 | stw a3, (sp, 4) | |
55 | ||
56 | psrset ee | |
57 | 1: | |
58 | ldw a3, (a2) | |
59 | cmpne a0, a3 | |
60 | bt16 3f | |
61 | 2: | |
62 | stw a1, (a2) | |
63 | 3: | |
64 | mvc a0 | |
65 | ldw a3, (sp, 0) | |
66 | mtcr a3, epc | |
67 | ldw a3, (sp, 4) | |
68 | mtcr a3, epsr | |
69 | addi sp, 8 | |
70 | KSPTOUSP | |
71 | rte | |
72 | END(csky_cmpxchg) | |
73 | ||
74 | /* | |
75 | * Called from tlbmodified exception | |
76 | */ | |
77 | ENTRY(csky_cmpxchg_fixup) | |
78 | mfcr a0, epc | |
79 | lrw a1, 2b | |
80 | cmpne a1, a0 | |
81 | bt 1f | |
82 | subi a1, (2b - 1b) | |
83 | stw a1, (sp, LSAVE_PC) | |
84 | 1: | |
85 | rts | |
86 | END(csky_cmpxchg_fixup) | |
87 | #endif |