X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=include%2Fasm-sh%2Ffutex.h;h=74ed3681d33c3298a0b35f5d514fff8251320994;hb=6585b4a71f523485ecf33e7f4569be4095d63699;hp=2cac5ecd9d00b07132c0d4706141e0c342c0e4ac;hpb=f5c7f03113fc9c547012cf403aec4b534d575ef0;p=linux-2.6 diff --git a/include/asm-sh/futex.h b/include/asm-sh/futex.h index 2cac5ecd9d..74ed3681d3 100644 --- a/include/asm-sh/futex.h +++ b/include/asm-sh/futex.h @@ -1,5 +1,5 @@ -#ifndef _ASM_FUTEX_H -#define _ASM_FUTEX_H +#ifndef __ASM_SH_FUTEX_H +#define __ASM_SH_FUTEX_H #ifdef __KERNEL__ @@ -7,33 +7,47 @@ #include #include -static inline int -futex_atomic_op_inuser (int encoded_op, int __user *uaddr) +/* XXX: UP variants, fix for SH-4A and SMP.. */ +#include + +static inline int futex_atomic_op_inuser(int encoded_op, int __user *uaddr) { int op = (encoded_op >> 28) & 7; int cmp = (encoded_op >> 24) & 15; int oparg = (encoded_op << 8) >> 20; int cmparg = (encoded_op << 20) >> 20; - int oldval = 0, ret, tem; + int oldval = 0, ret; + if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) oparg = 1 << oparg; - if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) + if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) return -EFAULT; - inc_preempt_count(); + pagefault_disable(); switch (op) { case FUTEX_OP_SET: + ret = atomic_futex_op_xchg_set(oparg, uaddr, &oldval); + break; case FUTEX_OP_ADD: + ret = atomic_futex_op_xchg_add(oparg, uaddr, &oldval); + break; case FUTEX_OP_OR: + ret = atomic_futex_op_xchg_or(oparg, uaddr, &oldval); + break; case FUTEX_OP_ANDN: + ret = atomic_futex_op_xchg_and(~oparg, uaddr, &oldval); + break; case FUTEX_OP_XOR: + ret = atomic_futex_op_xchg_xor(oparg, uaddr, &oldval); + break; default: ret = -ENOSYS; + break; } - dec_preempt_count(); + pagefault_enable(); if (!ret) { switch (cmp) { @@ -46,8 +60,18 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr) default: ret = -ENOSYS; } } + return ret; } -#endif -#endif +static inline int +futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) +{ + if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) + return -EFAULT; + + return atomic_futex_op_cmpxchg_inatomic(uaddr, oldval, newval); +} + +#endif /* __KERNEL__ */ +#endif /* __ASM_SH_FUTEX_H */