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 | */ | |
a0ae6280 GR |
15 | ENTRY(csky_cmpxchg) |
16 | USPTOKSP | |
17 | mfcr a3, epc | |
bf241682 | 18 | addi a3, TRAP0_SIZE |
a0ae6280 GR |
19 | |
20 | subi sp, 8 | |
21 | stw a3, (sp, 0) | |
22 | mfcr a3, epsr | |
23 | stw a3, (sp, 4) | |
24 | ||
25 | psrset ee | |
bf241682 | 26 | #ifdef CONFIG_CPU_HAS_LDSTEX |
a0ae6280 GR |
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 | |
a0ae6280 | 36 | #else |
a0ae6280 GR |
37 | 1: |
38 | ldw a3, (a2) | |
39 | cmpne a0, a3 | |
40 | bt16 3f | |
41 | 2: | |
42 | stw a1, (a2) | |
43 | 3: | |
bf241682 | 44 | #endif |
a0ae6280 GR |
45 | mvc a0 |
46 | ldw a3, (sp, 0) | |
47 | mtcr a3, epc | |
48 | ldw a3, (sp, 4) | |
49 | mtcr a3, epsr | |
50 | addi sp, 8 | |
51 | KSPTOUSP | |
52 | rte | |
53 | END(csky_cmpxchg) | |
54 | ||
bf241682 | 55 | #ifndef CONFIG_CPU_HAS_LDSTEX |
a0ae6280 GR |
56 | /* |
57 | * Called from tlbmodified exception | |
58 | */ | |
59 | ENTRY(csky_cmpxchg_fixup) | |
60 | mfcr a0, epc | |
61 | lrw a1, 2b | |
62 | cmpne a1, a0 | |
63 | bt 1f | |
64 | subi a1, (2b - 1b) | |
65 | stw a1, (sp, LSAVE_PC) | |
66 | 1: | |
67 | rts | |
68 | END(csky_cmpxchg_fixup) | |
69 | #endif |