Loading...
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 */
15ENTRY(csky_cmpxchg)
16 USPTOKSP
17
18 RD_MEH a3
19 WR_MEH a3
20
21 mfcr a3, epc
22 addi a3, TRAP0_SIZE
23
24 subi sp, 16
25 stw a3, (sp, 0)
26 mfcr a3, epsr
27 stw a3, (sp, 4)
28 mfcr a3, usp
29 stw a3, (sp, 8)
30
31 psrset ee
32#ifdef CONFIG_CPU_HAS_LDSTEX
331:
34 ldex a3, (a2)
35 cmpne a0, a3
36 bt16 2f
37 mov a3, a1
38 stex a3, (a2)
39 bez a3, 1b
402:
41 sync.is
42#else
43GLOBAL(csky_cmpxchg_ldw)
44 ldw a3, (a2)
45 cmpne a0, a3
46 bt16 3f
47GLOBAL(csky_cmpxchg_stw)
48 stw a1, (a2)
493:
50#endif
51 mvc a0
52 ldw a3, (sp, 0)
53 mtcr a3, epc
54 ldw a3, (sp, 4)
55 mtcr a3, epsr
56 ldw a3, (sp, 8)
57 mtcr a3, usp
58 addi sp, 16
59 KSPTOUSP
60 rte
61END(csky_cmpxchg)
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 */
15ENTRY(csky_cmpxchg)
16 USPTOKSP
17 mfcr a3, epc
18 addi a3, TRAP0_SIZE
19
20 subi sp, 16
21 stw a3, (sp, 0)
22 mfcr a3, epsr
23 stw a3, (sp, 4)
24 mfcr a3, usp
25 stw a3, (sp, 8)
26
27 psrset ee
28#ifdef CONFIG_CPU_HAS_LDSTEX
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
38#else
391:
40 ldw a3, (a2)
41 cmpne a0, a3
42 bt16 3f
432:
44 stw a1, (a2)
453:
46#endif
47 mvc a0
48 ldw a3, (sp, 0)
49 mtcr a3, epc
50 ldw a3, (sp, 4)
51 mtcr a3, epsr
52 ldw a3, (sp, 8)
53 mtcr a3, usp
54 addi sp, 16
55 KSPTOUSP
56 rte
57END(csky_cmpxchg)
58
59#ifndef CONFIG_CPU_HAS_LDSTEX
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