^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_LLSC_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define __ASM_SH_FUTEX_LLSC_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) "synco\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) "1:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) "movli.l @%2, r0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) "mov r0, %1\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) "cmp/eq %1, %4\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) "bf 2f\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) "mov %5, r0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) "movco.l r0, @%2\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) "bf 1b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) "2:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) "synco\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #ifdef CONFIG_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ".section .fixup,\"ax\"\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) "3:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) "mov.l 4f, %0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) "jmp @%0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) " mov %3, %0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) ".balign 4\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) "4: .long 2b\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ".previous\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) ".section __ex_table,\"a\"\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) ".long 1b, 3b\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) ".previous"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) :"+r" (err), "=&r" (*uval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) :"r" (uaddr), "i" (-EFAULT), "r" (oldval), "r" (newval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) :"t", "memory", "r0");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) if (err) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #endif /* __ASM_SH_FUTEX_LLSC_H */