18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __ASM_SH_FUTEX_LLSC_H
38c2ecf20Sopenharmony_ci#define __ASM_SH_FUTEX_LLSC_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_cistatic inline int atomic_futex_op_cmpxchg_inatomic(u32 *uval,
68c2ecf20Sopenharmony_ci						   u32 __user *uaddr,
78c2ecf20Sopenharmony_ci						   u32 oldval, u32 newval)
88c2ecf20Sopenharmony_ci{
98c2ecf20Sopenharmony_ci	int err = 0;
108c2ecf20Sopenharmony_ci	__asm__ __volatile__(
118c2ecf20Sopenharmony_ci		"synco\n"
128c2ecf20Sopenharmony_ci		"1:\n\t"
138c2ecf20Sopenharmony_ci		"movli.l	@%2, r0\n\t"
148c2ecf20Sopenharmony_ci		"mov	r0, %1\n\t"
158c2ecf20Sopenharmony_ci		"cmp/eq	%1, %4\n\t"
168c2ecf20Sopenharmony_ci		"bf	2f\n\t"
178c2ecf20Sopenharmony_ci		"mov	%5, r0\n\t"
188c2ecf20Sopenharmony_ci		"movco.l	r0, @%2\n\t"
198c2ecf20Sopenharmony_ci		"bf	1b\n"
208c2ecf20Sopenharmony_ci		"2:\n\t"
218c2ecf20Sopenharmony_ci		"synco\n\t"
228c2ecf20Sopenharmony_ci#ifdef CONFIG_MMU
238c2ecf20Sopenharmony_ci		".section	.fixup,\"ax\"\n"
248c2ecf20Sopenharmony_ci		"3:\n\t"
258c2ecf20Sopenharmony_ci		"mov.l	4f, %0\n\t"
268c2ecf20Sopenharmony_ci		"jmp	@%0\n\t"
278c2ecf20Sopenharmony_ci		" mov	%3, %0\n\t"
288c2ecf20Sopenharmony_ci		".balign	4\n"
298c2ecf20Sopenharmony_ci		"4:	.long	2b\n\t"
308c2ecf20Sopenharmony_ci		".previous\n"
318c2ecf20Sopenharmony_ci		".section	__ex_table,\"a\"\n\t"
328c2ecf20Sopenharmony_ci		".long	1b, 3b\n\t"
338c2ecf20Sopenharmony_ci		".previous"
348c2ecf20Sopenharmony_ci#endif
358c2ecf20Sopenharmony_ci		:"+r" (err), "=&r" (*uval)
368c2ecf20Sopenharmony_ci		:"r" (uaddr), "i" (-EFAULT), "r" (oldval), "r" (newval)
378c2ecf20Sopenharmony_ci		:"t", "memory", "r0");
388c2ecf20Sopenharmony_ci	if (err) return err;
398c2ecf20Sopenharmony_ci	return 0;
408c2ecf20Sopenharmony_ci}
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci#endif /* __ASM_SH_FUTEX_LLSC_H */
43