/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __ASM_SH_FUTEX_CAS_H #define __ASM_SH_FUTEX_CAS_H static inline int atomic_futex_op_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval, u32 newval) { int err = 0; __asm__ __volatile__( "1:\n\t" "cas.l %2, %1, @r0\n" "2:\n\t" #ifdef CONFIG_MMU ".section .fixup,\"ax\"\n" "3:\n\t" "mov.l 4f, %0\n\t" "jmp @%0\n\t" " mov %3, %0\n\t" ".balign 4\n" "4: .long 2b\n\t" ".previous\n" ".section __ex_table,\"a\"\n\t" ".long 1b, 3b\n\t" ".previous" #endif :"+r" (err), "+r" (newval) :"r" (oldval), "i" (-EFAULT), "z" (uaddr) :"t", "memory"); if (err) return err; *uval = newval; return 0; } #endif /* __ASM_SH_FUTEX_CAS_H */