^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef __ASM_SH_FUTEX_CAS_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define __ASM_SH_FUTEX_CAS_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) static inline int atomic_futex_op_cmpxchg_inatomic(u32 *uval,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) u32 __user *uaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) u32 oldval, u32 newval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) __asm__ __volatile__(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) "1:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) "cas.l %2, %1, @r0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) "2:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #ifdef CONFIG_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) ".section .fixup,\"ax\"\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) "3:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) "mov.l 4f, %0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) "jmp @%0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) " mov %3, %0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) ".balign 4\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) "4: .long 2b\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) ".previous\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ".section __ex_table,\"a\"\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) ".long 1b, 3b\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) ".previous"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) :"+r" (err), "+r" (newval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) :"r" (oldval), "i" (-EFAULT), "z" (uaddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) :"t", "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) if (err) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) *uval = newval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #endif /* __ASM_SH_FUTEX_CAS_H */