1a0ae6280SGuo Ren/* SPDX-License-Identifier: GPL-2.0 */ 2a0ae6280SGuo Ren// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. 3a0ae6280SGuo Ren 4a0ae6280SGuo Ren#include <linux/linkage.h> 5a0ae6280SGuo Ren#include <abi/entry.h> 6a0ae6280SGuo Ren 7a0ae6280SGuo Ren.text 8a0ae6280SGuo Ren 9a0ae6280SGuo Ren/* 10a0ae6280SGuo Ren * int csky_cmpxchg(int oldval, int newval, int *ptr) 11a0ae6280SGuo Ren * 12a0ae6280SGuo Ren * If *ptr != oldval && return 1, 13a0ae6280SGuo Ren * else *ptr = newval return 0. 14a0ae6280SGuo Ren */ 15a0ae6280SGuo RenENTRY(csky_cmpxchg) 16a0ae6280SGuo Ren USPTOKSP 170c8a32eeSGuo Ren 180c8a32eeSGuo Ren RD_MEH a3 190c8a32eeSGuo Ren WR_MEH a3 200c8a32eeSGuo Ren 21a0ae6280SGuo Ren mfcr a3, epc 22bf241682SGuo Ren addi a3, TRAP0_SIZE 23a0ae6280SGuo Ren 24f8e17c17SGuo Ren subi sp, 16 25a0ae6280SGuo Ren stw a3, (sp, 0) 26a0ae6280SGuo Ren mfcr a3, epsr 27a0ae6280SGuo Ren stw a3, (sp, 4) 28f8e17c17SGuo Ren mfcr a3, usp 29f8e17c17SGuo Ren stw a3, (sp, 8) 30a0ae6280SGuo Ren 31a0ae6280SGuo Ren psrset ee 32bf241682SGuo Ren#ifdef CONFIG_CPU_HAS_LDSTEX 33a0ae6280SGuo Ren1: 34a0ae6280SGuo Ren ldex a3, (a2) 35a0ae6280SGuo Ren cmpne a0, a3 36a0ae6280SGuo Ren bt16 2f 37a0ae6280SGuo Ren mov a3, a1 38a0ae6280SGuo Ren stex a3, (a2) 39a0ae6280SGuo Ren bez a3, 1b 40a0ae6280SGuo Ren2: 41a0ae6280SGuo Ren sync.is 42a0ae6280SGuo Ren#else 43*b0ae5e26SGuo RenGLOBAL(csky_cmpxchg_ldw) 44a0ae6280SGuo Ren ldw a3, (a2) 45a0ae6280SGuo Ren cmpne a0, a3 46a0ae6280SGuo Ren bt16 3f 47*b0ae5e26SGuo RenGLOBAL(csky_cmpxchg_stw) 48a0ae6280SGuo Ren stw a1, (a2) 49a0ae6280SGuo Ren3: 50bf241682SGuo Ren#endif 51a0ae6280SGuo Ren mvc a0 52a0ae6280SGuo Ren ldw a3, (sp, 0) 53a0ae6280SGuo Ren mtcr a3, epc 54a0ae6280SGuo Ren ldw a3, (sp, 4) 55a0ae6280SGuo Ren mtcr a3, epsr 56f8e17c17SGuo Ren ldw a3, (sp, 8) 57f8e17c17SGuo Ren mtcr a3, usp 58f8e17c17SGuo Ren addi sp, 16 59a0ae6280SGuo Ren KSPTOUSP 60a0ae6280SGuo Ren rte 61a0ae6280SGuo RenEND(csky_cmpxchg) 62