1#ifndef __ASM_SH_FUTEX_IRQ_H 2#define __ASM_SH_FUTEX_IRQ_H 3 4 5static inline int atomic_futex_op_xchg_set(int oparg, u32 __user *uaddr, 6 int *oldval) 7{ 8 unsigned long flags; 9 int ret; 10 11 local_irq_save(flags); 12 13 ret = get_user(*oldval, uaddr); 14 if (!ret) 15 ret = put_user(oparg, uaddr); 16 17 local_irq_restore(flags); 18 19 return ret; 20} 21 22static inline int atomic_futex_op_xchg_add(int oparg, u32 __user *uaddr, 23 int *oldval) 24{ 25 unsigned long flags; 26 int ret; 27 28 local_irq_save(flags); 29 30 ret = get_user(*oldval, uaddr); 31 if (!ret) 32 ret = put_user(*oldval + oparg, uaddr); 33 34 local_irq_restore(flags); 35 36 return ret; 37} 38 39static inline int atomic_futex_op_xchg_or(int oparg, u32 __user *uaddr, 40 int *oldval) 41{ 42 unsigned long flags; 43 int ret; 44 45 local_irq_save(flags); 46 47 ret = get_user(*oldval, uaddr); 48 if (!ret) 49 ret = put_user(*oldval | oparg, uaddr); 50 51 local_irq_restore(flags); 52 53 return ret; 54} 55 56static inline int atomic_futex_op_xchg_and(int oparg, u32 __user *uaddr, 57 int *oldval) 58{ 59 unsigned long flags; 60 int ret; 61 62 local_irq_save(flags); 63 64 ret = get_user(*oldval, uaddr); 65 if (!ret) 66 ret = put_user(*oldval & oparg, uaddr); 67 68 local_irq_restore(flags); 69 70 return ret; 71} 72 73static inline int atomic_futex_op_xchg_xor(int oparg, u32 __user *uaddr, 74 int *oldval) 75{ 76 unsigned long flags; 77 int ret; 78 79 local_irq_save(flags); 80 81 ret = get_user(*oldval, uaddr); 82 if (!ret) 83 ret = put_user(*oldval ^ oparg, uaddr); 84 85 local_irq_restore(flags); 86 87 return ret; 88} 89 90static inline int atomic_futex_op_cmpxchg_inatomic(u32 *uval, 91 u32 __user *uaddr, 92 u32 oldval, u32 newval) 93{ 94 unsigned long flags; 95 int ret; 96 u32 prev = 0; 97 98 local_irq_save(flags); 99 100 ret = get_user(prev, uaddr); 101 if (!ret && oldval == prev) 102 ret = put_user(newval, uaddr); 103 104 local_irq_restore(flags); 105 106 *uval = prev; 107 return ret; 108} 109 110#endif /* __ASM_SH_FUTEX_IRQ_H */ 111