Linux Audio

Check our new training course

Loading...
v6.8
 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)
v5.4
 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, 8
21	stw     a3, (sp, 0)
22	mfcr    a3, epsr
23	stw     a3, (sp, 4)
 
 
24
25	psrset	ee
26#ifdef CONFIG_CPU_HAS_LDSTEX
271:
28	ldex	a3, (a2)
29	cmpne	a0, a3
30	bt16	2f
31	mov	a3, a1
32	stex	a3, (a2)
33	bez	a3, 1b
342:
35	sync.is
36#else
371:
38	ldw	a3, (a2)
39	cmpne	a0, a3
40	bt16	3f
412:
42	stw	a1, (a2)
433:
44#endif
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
53END(csky_cmpxchg)
54
55#ifndef CONFIG_CPU_HAS_LDSTEX
56/*
57 * Called from tlbmodified exception
58 */
59ENTRY(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)
661:
67	rts
68END(csky_cmpxchg_fixup)
69#endif