^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <abi/entry.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * int csky_cmpxchg(int oldval, int newval, int *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * If *ptr != oldval && return 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * else *ptr = newval return 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) ENTRY(csky_cmpxchg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) USPTOKSP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) mfcr a3, epc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) addi a3, TRAP0_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) subi sp, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) stw a3, (sp, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) mfcr a3, epsr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) stw a3, (sp, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) mfcr a3, usp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) stw a3, (sp, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) psrset ee
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #ifdef CONFIG_CPU_HAS_LDSTEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ldex a3, (a2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) cmpne a0, a3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) bt16 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) mov a3, a1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) stex a3, (a2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) bez a3, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) sync.is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) ldw a3, (a2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) cmpne a0, a3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) bt16 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) stw a1, (a2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) mvc a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) ldw a3, (sp, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) mtcr a3, epc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) ldw a3, (sp, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) mtcr a3, epsr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) ldw a3, (sp, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) mtcr a3, usp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) addi sp, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) KSPTOUSP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) rte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) END(csky_cmpxchg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #ifndef CONFIG_CPU_HAS_LDSTEX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * Called from tlbmodified exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) ENTRY(csky_cmpxchg_fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) mfcr a0, epc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) lrw a1, 2b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) cmpne a1, a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) bt 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) subi a1, (2b - 1b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) stw a1, (sp, LSAVE_PC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) rts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) END(csky_cmpxchg_fixup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #endif