Merge branch 'core-objtool-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-block.git] / arch / csky / kernel / atomic.S
CommitLineData
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
15ENTRY(csky_cmpxchg)
16 USPTOKSP
17 mfcr a3, epc
bf241682 18 addi a3, TRAP0_SIZE
a0ae6280 19
f8e17c17 20 subi sp, 16
a0ae6280
GR
21 stw a3, (sp, 0)
22 mfcr a3, epsr
23 stw a3, (sp, 4)
f8e17c17
GR
24 mfcr a3, usp
25 stw a3, (sp, 8)
a0ae6280
GR
26
27 psrset ee
bf241682 28#ifdef CONFIG_CPU_HAS_LDSTEX
a0ae6280
GR
291:
30 ldex a3, (a2)
31 cmpne a0, a3
32 bt16 2f
33 mov a3, a1
34 stex a3, (a2)
35 bez a3, 1b
362:
37 sync.is
a0ae6280 38#else
a0ae6280
GR
391:
40 ldw a3, (a2)
41 cmpne a0, a3
42 bt16 3f
432:
44 stw a1, (a2)
453:
bf241682 46#endif
a0ae6280
GR
47 mvc a0
48 ldw a3, (sp, 0)
49 mtcr a3, epc
50 ldw a3, (sp, 4)
51 mtcr a3, epsr
f8e17c17
GR
52 ldw a3, (sp, 8)
53 mtcr a3, usp
54 addi sp, 16
a0ae6280
GR
55 KSPTOUSP
56 rte
57END(csky_cmpxchg)
58
bf241682 59#ifndef CONFIG_CPU_HAS_LDSTEX
a0ae6280
GR
60/*
61 * Called from tlbmodified exception
62 */
63ENTRY(csky_cmpxchg_fixup)
64 mfcr a0, epc
65 lrw a1, 2b
66 cmpne a1, a0
67 bt 1f
68 subi a1, (2b - 1b)
69 stw a1, (sp, LSAVE_PC)
701:
71 rts
72END(csky_cmpxchg_fixup)
73#endif