xref: /openbmc/linux/arch/sh/include/asm/futex-cas.h (revision b2441318)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
200b73d8dSRich Felker #ifndef __ASM_SH_FUTEX_CAS_H
300b73d8dSRich Felker #define __ASM_SH_FUTEX_CAS_H
400b73d8dSRich Felker 
atomic_futex_op_cmpxchg_inatomic(u32 * uval,u32 __user * uaddr,u32 oldval,u32 newval)500b73d8dSRich Felker static inline int atomic_futex_op_cmpxchg_inatomic(u32 *uval,
600b73d8dSRich Felker 						   u32 __user *uaddr,
700b73d8dSRich Felker 						   u32 oldval, u32 newval)
800b73d8dSRich Felker {
900b73d8dSRich Felker 	int err = 0;
1000b73d8dSRich Felker 	__asm__ __volatile__(
1100b73d8dSRich Felker 		"1:\n\t"
1200b73d8dSRich Felker 		"cas.l	%2, %1, @r0\n"
1300b73d8dSRich Felker 		"2:\n\t"
1400b73d8dSRich Felker #ifdef CONFIG_MMU
1500b73d8dSRich Felker 		".section	.fixup,\"ax\"\n"
1600b73d8dSRich Felker 		"3:\n\t"
1700b73d8dSRich Felker 		"mov.l	4f, %0\n\t"
1800b73d8dSRich Felker 		"jmp	@%0\n\t"
1900b73d8dSRich Felker 		" mov	%3, %0\n\t"
2000b73d8dSRich Felker 		".balign	4\n"
2100b73d8dSRich Felker 		"4:	.long	2b\n\t"
2200b73d8dSRich Felker 		".previous\n"
2300b73d8dSRich Felker 		".section	__ex_table,\"a\"\n\t"
2400b73d8dSRich Felker 		".long	1b, 3b\n\t"
2500b73d8dSRich Felker 		".previous"
2600b73d8dSRich Felker #endif
2700b73d8dSRich Felker 		:"+r" (err), "+r" (newval)
2800b73d8dSRich Felker 		:"r" (oldval), "i" (-EFAULT), "z" (uaddr)
2900b73d8dSRich Felker 		:"t", "memory");
3000b73d8dSRich Felker 	if (err) return err;
3100b73d8dSRich Felker 	*uval = newval;
3200b73d8dSRich Felker 	return 0;
3300b73d8dSRich Felker }
3400b73d8dSRich Felker 
3500b73d8dSRich Felker #endif /* __ASM_SH_FUTEX_CAS_H */
36