Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.30 52 lines 1.3 kB view raw
1#ifndef _ASM_S390_FUTEX_H 2#define _ASM_S390_FUTEX_H 3 4#ifdef __KERNEL__ 5 6#include <linux/futex.h> 7#include <linux/uaccess.h> 8#include <asm/errno.h> 9 10static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr) 11{ 12 int op = (encoded_op >> 28) & 7; 13 int cmp = (encoded_op >> 24) & 15; 14 int oparg = (encoded_op << 8) >> 20; 15 int cmparg = (encoded_op << 20) >> 20; 16 int oldval, ret; 17 18 if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) 19 oparg = 1 << oparg; 20 21 if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) 22 return -EFAULT; 23 24 pagefault_disable(); 25 ret = uaccess.futex_atomic_op(op, uaddr, oparg, &oldval); 26 pagefault_enable(); 27 28 if (!ret) { 29 switch (cmp) { 30 case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break; 31 case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break; 32 case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break; 33 case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break; 34 case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break; 35 case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break; 36 default: ret = -ENOSYS; 37 } 38 } 39 return ret; 40} 41 42static inline int futex_atomic_cmpxchg_inatomic(int __user *uaddr, 43 int oldval, int newval) 44{ 45 if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) 46 return -EFAULT; 47 48 return uaccess.futex_atomic_cmpxchg(uaddr, oldval, newval); 49} 50 51#endif /* __KERNEL__ */ 52#endif /* _ASM_S390_FUTEX_H */