Beispiel #1
0
asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
		struct compat_timespec __user *utime, u32 __user *uaddr2,
		u32 val3)
{
	struct timespec ts;
	ktime_t t, *tp = NULL;
	int val2 = 0;
	int cmd = op & FUTEX_CMD_MASK;

	if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI ||
		      cmd == FUTEX_WAIT_BITSET ||
		      cmd == FUTEX_WAIT_REQUEUE_PI)) {
		if (get_compat_timespec(&ts, utime))
			return -EFAULT;
		if (!timespec_valid(&ts))
			return -EINVAL;

		t = timespec_to_ktime(ts);
		if (cmd == FUTEX_WAIT)
			t = ktime_add_safe(ktime_get(), t);
		tp = &t;
	}
	if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE ||
	    cmd == FUTEX_CMP_REQUEUE_PI || cmd == FUTEX_WAKE_OP)
		val2 = (int) (unsigned long) utime;

	return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);
}
asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
		struct compat_timespec __user *utime, u32 __user *uaddr2,
		u32 val3)
{
	struct timespec t;
	unsigned long timeout = MAX_SCHEDULE_TIMEOUT;
	int val2 = 0;

	if (utime && (op == FUTEX_WAIT || op == FUTEX_LOCK_PI)) {
		if (get_compat_timespec(&t, utime))
			return -EFAULT;
		if (!timespec_valid(&t))
			return -EINVAL;
		if (op == FUTEX_WAIT)
			timeout = timespec_to_jiffies(&t) + 1;
		else {
			timeout = t.tv_sec;
			val2 = t.tv_nsec;
		}
	}
	if (op == FUTEX_REQUEUE || op == FUTEX_CMP_REQUEUE)
		val2 = (int) (unsigned long) utime;

	return do_futex(uaddr, op, val, timeout, uaddr2, val2, val3);
}
Beispiel #3
0
static uint32_t
__sys_linux_futex(uint32_t arg[])
{
	uintptr_t uaddr = (uintptr_t)arg[0];
	int op = arg[1] & 127;
	int val = arg[2];
	return do_futex(uaddr, op, val);
}
Beispiel #4
0
asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, int val,
                                 struct compat_timespec __user *utime, u32 __user *uaddr2,
                                 int val3)
{
    struct timespec t;
    unsigned long timeout = MAX_SCHEDULE_TIMEOUT;
    int val2 = 0;

    if ((op == FUTEX_WAIT) && utime) {
        if (get_compat_timespec(&t, utime))
            return -EFAULT;
        timeout = timespec_to_jiffies(&t) + 1;
    }
    if (op >= FUTEX_REQUEUE)
        val2 = (int) (unsigned long) utime;

    return do_futex((unsigned long)uaddr, op, val, timeout,
                    (unsigned long)uaddr2, val2, val3);
}