]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/blob - arch/csky/kernel/atomic.S
Merge tag 'omap-for-v5.0/fixes-rc7-signed' of git://git.kernel.org/pub/scm/linux...
[mirror_ubuntu-eoan-kernel.git] / arch / csky / kernel / atomic.S
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