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