18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef __ASM_SH_FUTEX_CAS_H
38c2ecf20Sopenharmony_ci#define __ASM_SH_FUTEX_CAS_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		"1:\n\t"
128c2ecf20Sopenharmony_ci		"cas.l	%2, %1, @r0\n"
138c2ecf20Sopenharmony_ci		"2:\n\t"
148c2ecf20Sopenharmony_ci#ifdef CONFIG_MMU
158c2ecf20Sopenharmony_ci		".section	.fixup,\"ax\"\n"
168c2ecf20Sopenharmony_ci		"3:\n\t"
178c2ecf20Sopenharmony_ci		"mov.l	4f, %0\n\t"
188c2ecf20Sopenharmony_ci		"jmp	@%0\n\t"
198c2ecf20Sopenharmony_ci		" mov	%3, %0\n\t"
208c2ecf20Sopenharmony_ci		".balign	4\n"
218c2ecf20Sopenharmony_ci		"4:	.long	2b\n\t"
228c2ecf20Sopenharmony_ci		".previous\n"
238c2ecf20Sopenharmony_ci		".section	__ex_table,\"a\"\n\t"
248c2ecf20Sopenharmony_ci		".long	1b, 3b\n\t"
258c2ecf20Sopenharmony_ci		".previous"
268c2ecf20Sopenharmony_ci#endif
278c2ecf20Sopenharmony_ci		:"+r" (err), "+r" (newval)
288c2ecf20Sopenharmony_ci		:"r" (oldval), "i" (-EFAULT), "z" (uaddr)
298c2ecf20Sopenharmony_ci		:"t", "memory");
308c2ecf20Sopenharmony_ci	if (err) return err;
318c2ecf20Sopenharmony_ci	*uval = newval;
328c2ecf20Sopenharmony_ci	return 0;
338c2ecf20Sopenharmony_ci}
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci#endif /* __ASM_SH_FUTEX_CAS_H */
36