^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_IRQ_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define __ASM_SH_FUTEX_IRQ_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) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) u32 prev = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) local_irq_save(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) ret = get_user(prev, uaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) if (!ret && oldval == prev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) ret = put_user(newval, uaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) local_irq_restore(flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) *uval = prev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #endif /* __ASM_SH_FUTEX_IRQ_H */