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