1c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov/*
2d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Copyright (c) 2016 Eugene Syromyatnikov <evgsyr@gmail.com>
339bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2016-2017 The strace developers.
4c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * All rights reserved.
5c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov *
6c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * Redistribution and use in source and binary forms, with or without
7c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * modification, are permitted provided that the following conditions
8c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * are met:
9c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * 1. Redistributions of source code must retain the above copyright
10c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov *    notice, this list of conditions and the following disclaimer.
11c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * 2. Redistributions in binary form must reproduce the above copyright
12c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov *    notice, this list of conditions and the following disclaimer in the
13c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov *    documentation and/or other materials provided with the distribution.
14c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * 3. The name of the author may not be used to endorse or promote products
15c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov *    derived from this software without specific prior written permission.
16c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov *
17c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov */
28c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
29c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov#include "tests.h"
30c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
31c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov#include <asm/unistd.h>
32c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
33c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov#ifdef __NR_futex
34c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
35c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# include <errno.h>
36c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# include <stdarg.h>
37c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# include <stdbool.h>
38c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# include <stdio.h>
39c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# include <stdint.h>
40c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# include <unistd.h>
41c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
42c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# include <sys/time.h>
43c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
44c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# ifndef FUTEX_PRIVATE_FLAG
45c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov#  define FUTEX_PRIVATE_FLAG 128
46c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# endif
47c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# ifndef FUTEX_CLOCK_REALTIME
48c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov#  define FUTEX_CLOCK_REALTIME 256
49c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# endif
50c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# ifndef FUTEX_CMD_MASK
51c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov#  define FUTEX_CMD_MASK ~(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME)
52c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# endif
53c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
54c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# include "xlat.h"
55c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# include "xlat/futexops.h"
56c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# include "xlat/futexwakeops.h"
57c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# include "xlat/futexwakecmps.h"
58c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
59c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikovvoid futex_error(int *uaddr, int op, unsigned long val, unsigned long timeout,
60c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	int *uaddr2, unsigned long val3, int rc)
61c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov{
62c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	perror_msg_and_fail("futex(%p, %#x, %#x, %#lx, %p, %#x) = %d",
6343e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov		uaddr, op, (unsigned) val, timeout, uaddr, (unsigned) val3, rc);
64c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov}
65c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
66c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# define CHECK_FUTEX_GENERIC(uaddr, op, val, timeout, uaddr2, val3, check, \
67c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	enosys) \
68c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	do { \
69c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		rc = syscall(__NR_futex, (uaddr), (op), (val), (timeout), \
70c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			(uaddr2), (val3)); \
71c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		/* It is here due to EPERM on WAKE_OP on AArch64 */ \
72c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		if ((rc == -1) && (errno == EPERM)) \
73c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			break; \
74c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		if (enosys && (rc == -1) && (errno == ENOSYS)) \
75c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			break; \
76c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		if (!(check)) \
77c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			futex_error((uaddr), (op), (val), \
7843e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov				(unsigned long) (timeout), (int *) (uaddr2), \
79c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov				(val3), rc); \
80c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	} while (0)
81c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
82c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# define CHECK_FUTEX_ENOSYS(uaddr, op, val, timeout, uaddr2, val3, check) \
83c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_GENERIC(uaddr, op, val, timeout, uaddr2, val3, check, 1)
84c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
85c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# define CHECK_FUTEX(uaddr, op, val, timeout, uaddr2, val3, check) \
86c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_GENERIC(uaddr, op, val, timeout, uaddr2, val3, check, 0)
87c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
88c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikovenum argmask {
89c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	ARG3 = 1 << 0,
90c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	ARG4 = 1 << 1,
91c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	ARG5 = 1 << 2,
92c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	ARG6 = 1 << 3,
93c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov};
94c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
95c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikovvoid invalid_op(int *val, int op, uint32_t argmask, ...)
96c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov{
97c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	static const unsigned long args[] = {
9843e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov		(unsigned long) 0xface1e55deadbee1ULL,
9943e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov		(unsigned long) 0xface1e56deadbee2ULL,
10043e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov		(unsigned long) 0xface1e57deadbee3ULL,
10143e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov		(unsigned long) 0xface1e58deadbee4ULL,
102c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	};
103c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Since timeout value is copied before full op check, we should provide
104c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * some valid timeout address or NULL */
105c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	int cmd = op & FUTEX_CMD_MASK;
106c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	bool valid_timeout = (cmd == FUTEX_WAIT) || (cmd == FUTEX_LOCK_PI) ||
107c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(cmd == FUTEX_WAIT_BITSET) || (cmd == FUTEX_WAIT_REQUEUE_PI);
108c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	bool timeout_is_val2 = (cmd == FUTEX_REQUEUE) ||
109c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(cmd == FUTEX_CMP_REQUEUE) || (cmd == FUTEX_WAKE_OP) ||
110c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(cmd == FUTEX_CMP_REQUEUE_PI);
111c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	const char *fmt;
112c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	int saved_errno;
113c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	int rc;
114c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	int i;
115c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	va_list ap;
116c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
117c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
118c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX(val, op, args[0], valid_timeout ? 0 : args[1], args[2],
119c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		args[3], (rc == -1) && (errno == ENOSYS));
120c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	saved_errno = errno;
121c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, %#x /* FUTEX_??? */", val, op);
122c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
123c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	va_start(ap, argmask);
124c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
125c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	for (i = 0; i < 4; i++) {
126c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		if (argmask & (1 << i)) {
127c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			fmt = va_arg(ap, const char *);
128c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
129c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			printf(", ");
130c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
131c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			if (((1 << i) == ARG3) || ((1 << i) == ARG6) ||
132c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			    (((1 << i) == ARG4) && timeout_is_val2))
13343e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov				printf(fmt, (unsigned) args[i]);
134c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			else
135c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov				printf(fmt, args[i]);
136c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		}
137c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	}
138c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
139c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	va_end(ap);
140c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
141c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	errno = saved_errno;
142c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf(") = -1 ENOSYS (%m)\n");
143c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov}
144c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
145c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov# define CHECK_INVALID_CLOCKRT(op, ...) \
146c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	do { \
147c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		invalid_op(uaddr, FUTEX_CLOCK_REALTIME | (op), __VA_ARGS__); \
148c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		invalid_op(uaddr, FUTEX_CLOCK_REALTIME | FUTEX_PRIVATE_FLAG | \
149c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			(op), __VA_ARGS__); \
150c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	} while (0)
151c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
152c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov/* Value which differs from one stored in int *val */
15343e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov# define VAL     ((unsigned long) 0xbadda7a0facefeedLLU)
15443e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov# define VAL_PR  ((unsigned) VAL)
155c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
15643e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov# define VAL2    ((unsigned long) 0xbadda7a0ca7b100dLLU)
15743e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov# define VAL2_PR ((unsigned) VAL2)
158c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
15943e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov# define VAL3    ((unsigned long) 0xbadda7a09caffee1LLU)
16043e85a66481532369b8028e23a52bae105687cf7Eugene Syromyatnikov# define VAL3_PR ((unsigned) VAL3)
161c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
162c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikovint
163c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikovmain(int argc, char *argv[])
164c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov{
16539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	TAIL_ALLOC_OBJECT_CONST_PTR(int, uaddr);
16639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	TAIL_ALLOC_OBJECT_CONST_PTR(int, uaddr2);
167c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	int rc;
168c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	unsigned i;
169c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	unsigned j;
170c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
171c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	uaddr[0] = 0x1deadead;
172c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	uaddr2[0] = 0xbadf00d;
173c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
17439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	TAIL_ALLOC_OBJECT_CONST_PTR(struct timespec, tmout);
175c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	tmout->tv_sec = 123;
176c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	tmout->tv_nsec = 0xbadc0de;
177c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
178c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_WAIT - check whether uaddr == val and sleep
179c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Possible flags: PRIVATE, CLOCK_RT (since 4.5)
180c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
181c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_WAIT
182c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - expected value
183c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. timeout - address to timespec with timeout
184c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - not used
185c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - not used
186c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
187c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
188c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* uaddr is NULL */
189c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX(NULL, FUTEX_WAIT, VAL, tmout, uaddr2, VAL3,
190c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == EFAULT));
19139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(NULL, FUTEX_WAIT, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
19239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       VAL_PR, (long long) tmout->tv_sec,
19339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
194c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
195c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* uaddr is faulty */
196c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX(uaddr + 1, FUTEX_WAIT, VAL, tmout, uaddr2, VAL3,
197c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == EFAULT));
19839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
19939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr + 1, VAL_PR, (long long) tmout->tv_sec,
20039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
201c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
202c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* timeout is faulty */
203c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX(uaddr, FUTEX_WAIT, VAL, tmout + 1, uaddr2, VAL3,
204c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == EFAULT));
205c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_WAIT, %u, %p) = %s\n",
20639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, 0xfacefeed, tmout + 1, sprintrc(rc));
20739bac055674d23770b9a724221b728e443196ea7Elliott Hughes
20839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	/* timeout is invalid */
20939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tmout->tv_sec = 0xdeadbeefU;
21039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tmout->tv_nsec = 0xfacefeedU;
21139bac055674d23770b9a724221b728e443196ea7Elliott Hughes
21239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	CHECK_FUTEX(uaddr, FUTEX_WAIT, VAL, tmout, uaddr2, VAL3,
21339bac055674d23770b9a724221b728e443196ea7Elliott Hughes		(rc == -1) && (errno == EINVAL));
21439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
21539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
21639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
21739bac055674d23770b9a724221b728e443196ea7Elliott Hughes
21839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tmout->tv_sec = (time_t) 0xcafef00ddeadbeefLL;
21939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tmout->tv_nsec = (long) 0xbadc0dedfacefeedLL;
22039bac055674d23770b9a724221b728e443196ea7Elliott Hughes
22139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	CHECK_FUTEX(uaddr, FUTEX_WAIT, VAL, tmout, uaddr2, VAL3,
22239bac055674d23770b9a724221b728e443196ea7Elliott Hughes		(rc == -1) && (errno == EINVAL));
22339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
22439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
22539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
22639bac055674d23770b9a724221b728e443196ea7Elliott Hughes
22739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tmout->tv_sec = 123;
22839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	tmout->tv_nsec = 0xbadc0de;
229c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
230c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* uaddr is not as provided; uaddr2 is faulty but ignored */
231c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX(uaddr, FUTEX_WAIT, VAL, tmout, uaddr2 + 1, VAL3,
232c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == EAGAIN));
23339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
23439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
23539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
236c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
237c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* uaddr is not as provided; uaddr2 is faulty but ignored */
238c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_WAIT, VAL, tmout,
239c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		uaddr2 + 1, VAL3, (rc == -1) && (errno == EAGAIN));
24039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT_PRIVATE, %u, {tv_sec=%lld, tv_nsec=%llu})"
24139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       " = %s\n",
24239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
24339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
244c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
245c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Next 2 tests are with CLOCKRT bit set */
246c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
247c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Valid after v4.4-rc2-27-g337f130 */
248c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr,
249c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		FUTEX_CLOCK_REALTIME | FUTEX_WAIT,
250c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL, tmout, uaddr2, VAL3, (rc == -1) && (errno == EAGAIN));
25139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT|FUTEX_CLOCK_REALTIME, %u"
25239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
25339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
25439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
255c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
256c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr,
257dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes		FUTEX_CLOCK_REALTIME | FUTEX_PRIVATE_FLAG | FUTEX_WAIT,
258c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL, tmout, uaddr2, 0, (rc == -1) && (errno == EAGAIN));
25939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT_PRIVATE|FUTEX_CLOCK_REALTIME, %u"
26039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
26139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
26239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
263c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
264c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_WAIT_BITSET - FUTEX_WAIT which provides additional bitmask
265c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                     which should be matched at least in one bit with
266c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                     wake mask in order to wake.
267c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Possible flags: PRIVATE, CLOCKRT
268c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
269c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_TRYLOCK_PI
270c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - expected value stored in uaddr
271c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. timeout - timeout
272c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - not used
273c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - bitmask
274c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
275c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
276c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_WAIT_BITSET, VAL, tmout, uaddr2 + 1,
277c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL3, (rc == -1) && (errno == EAGAIN));
27839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT_BITSET, %u, {tv_sec=%lld, tv_nsec=%llu}"
27939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", %#x) = %s\n",
28039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
28139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), VAL3_PR,
28239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       sprintrc(rc));
283c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
284c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* val3 of 0 is invalid  */
285c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_WAIT_BITSET, VAL, tmout, uaddr2 + 1, 0,
286c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == EINVAL));
28739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT_BITSET, %u, {tv_sec=%lld, tv_nsec=%llu}"
28839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", %#x) = %s\n",
28939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
29039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), 0, sprintrc(rc));
291c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
292c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_WAIT_BITSET, VAL,
293c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		tmout, uaddr2 + 1, VAL3, (rc == -1) && (errno == EAGAIN));
29439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT_BITSET_PRIVATE, %u"
29539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", {tv_sec=%lld, tv_nsec=%llu}, %#x) = %s\n",
29639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
29739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), VAL3_PR,
29839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       sprintrc(rc));
299c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
300c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Next 3 tests are with CLOCKRT bit set */
301c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
302c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_CLOCK_REALTIME | FUTEX_WAIT_BITSET, VAL,
303c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		tmout, uaddr2 + 1, VAL3, (rc == -1) && (errno == EAGAIN));
30439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %u"
30539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", {tv_sec=%lld, tv_nsec=%llu}, %#x) = %s\n",
30639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
30739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), VAL3_PR,
30839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       sprintrc(rc));
309c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
310c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* val3 of 0 is invalid  */
311c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_CLOCK_REALTIME | FUTEX_WAIT_BITSET, VAL,
312c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		tmout, uaddr2 + 1, 0, (rc == -1) && (errno == EINVAL));
31339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME, %u"
31439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", {tv_sec=%lld, tv_nsec=%llu}, %#x) = %s\n",
31539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
31639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), 0, sprintrc(rc));
317c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
318c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_CLOCK_REALTIME | FUTEX_PRIVATE_FLAG |
319c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		FUTEX_WAIT_BITSET, VAL, tmout, uaddr2 + 1, VAL3,
320c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == EAGAIN));
32139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, %u"
32239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", {tv_sec=%lld, tv_nsec=%llu}, %#x) = %s\n",
32339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
32439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), VAL3_PR,
32539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       sprintrc(rc));
326c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
327c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_WAKE - wake val processes waiting for uaddr
328c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Possible flags: PRIVATE
329c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
330c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_WAKE
331c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - how many processes to wake
332c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. timeout - not used
333c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - not used
334c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - not used
335c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
336c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
337c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Zero processes to wake is not a good idea, but it should return 0 */
338c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX(uaddr, FUTEX_WAKE, 0, NULL, NULL, 0, (rc == 0));
339100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov	printf("futex(%p, FUTEX_WAKE, %u) = %s\n", uaddr, 0, sprintrc(rc));
340c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
341c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Trying to wake some processes, but there's nothing to wake */
342c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX(uaddr, FUTEX_WAKE, 10, NULL, NULL, 0, (rc == 0));
343100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov	printf("futex(%p, FUTEX_WAKE, %u) = %s\n", uaddr, 10, sprintrc(rc));
344c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
345c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Trying to wake some processes, but there's nothing to wake */
346c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_WAKE, 10, NULL,
347c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		NULL, 0, (rc == 0));
348c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_WAKE_PRIVATE, %u) = %s\n", uaddr, 10,
349100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		sprintrc(rc));
350c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
351c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_INVALID_CLOCKRT(FUTEX_WAKE, ARG3, "%u");
352c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
353c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_WAKE_BITSET - wake val processes waiting for uaddr which has at
354c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                     least one common bit with bitset provided in
355c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                     val3.
356c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Possible flags: PRIVATE
357c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
358c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_WAKE
359c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - how many processes to wake
360c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. timeout - not used
361c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - not used
362c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - bitmask
363c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
364c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
365c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Trying to wake some processes, but there's nothing to wake */
366c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_WAKE_BITSET, 10, NULL, NULL,
367c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL3, (rc == 0));
368c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_WAKE_BITSET, %u, %#x) = %s\n", uaddr, 10,
369100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		VAL3_PR, sprintrc(rc));
370c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
371c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* bitset 0 is invalid */
372c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_WAKE_BITSET, 10, NULL, NULL, 0,
373c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == EINVAL));
374c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_WAKE_BITSET, %u, %#x) = %s\n", uaddr, 10, 0,
375100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		sprintrc(rc));
376c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
377c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Trying to wake some processes, but there's nothing to wake */
378c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_WAKE_BITSET, 10,
379c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		NULL, NULL, VAL3, (rc == 0));
380c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_WAKE_BITSET_PRIVATE, %u, %#x) = %s\n", uaddr,
381100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		10, VAL3_PR, sprintrc(rc));
382c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
383c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_INVALID_CLOCKRT(FUTEX_WAKE_BITSET, ARG3 | ARG6, "%u", "%#x");
384c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
385c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_FD - deprecated
386c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Possible flags: PRIVATE
387c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
388c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_FD
389c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - signal number
390c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. timeout - not used
391c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - not used
392c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - not used
393c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
394c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
395c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_FD is not implemented since 2.6.26 */
396c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_FD, VAL, NULL, NULL, VAL3,
397c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == EINVAL));
398100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov	printf("futex(%p, FUTEX_FD, %u) = %s\n", uaddr, VAL_PR, sprintrc(rc));
399c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
400c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_FD is not implemented since 2.6.26 */
401c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_FD, VAL, NULL,
402c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		NULL, VAL3, (rc == -1) && (errno == EINVAL));
403c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_FD|FUTEX_PRIVATE_FLAG, %u) = %s\n", uaddr,
404100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		VAL_PR, sprintrc(rc));
405c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
406c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_INVALID_CLOCKRT(FUTEX_FD, ARG3, "%u");
407c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
408c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_REQUEUE - wake val processes and re-queue rest on uaddr2
409c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Possible flags: PRIVATE
410c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
411c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_REQUEUE
412c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - how many processes to wake
413c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. val2    - amount of processes to re-queue on uadr2
414c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - another futex address, to re-queue waiting processes on
415c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - not used
416c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
417c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
418c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Trying to re-queue some processes but there's nothing to re-queue */
419c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX(uaddr, FUTEX_REQUEUE, VAL, VAL2, uaddr2, VAL3,
420c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == 0));
421c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_REQUEUE, %u, %u, %p) = %s\n",
422100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		uaddr, VAL_PR, VAL2_PR, uaddr2, sprintrc(rc));
423c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
424c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Trying to re-queue some processes but there's nothing to re-queue */
425c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_REQUEUE, VAL, VAL2,
426c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		uaddr2, VAL3, (rc == 0));
427c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_REQUEUE_PRIVATE, %u, %u, %p) = %s\n",
428100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		uaddr, VAL_PR, VAL2_PR, uaddr2, sprintrc(rc));
429c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
430c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_INVALID_CLOCKRT(FUTEX_REQUEUE, ARG3 | ARG4 | ARG5, "%u", "%u",
431c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		"%#lx");
432c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
433c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_CMP_REQUEUE - wake val processes and re-queue rest on uaddr2
434c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                     if uaddr has value val3
435c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Possible flags: PRIVATE
436c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
437c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_CMP_REQUEUE
438c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - how many processes to wake
439c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. val2    - amount of processes to re-queue on uadr2
440c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - another futex address, to re-queue waiting processes on
441c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - expected value stored in uaddr
442c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
443c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
444c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Comparison re-queue with wrong val value */
445c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VAL, VAL2, uaddr2, VAL3,
446c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == EAGAIN));
447c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
448100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		uaddr, VAL_PR, VAL2_PR, uaddr2, VAL3_PR, sprintrc(rc));
449c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
450c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Successful comparison re-queue */
451c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX(uaddr, FUTEX_CMP_REQUEUE, VAL, VAL2, uaddr2, *uaddr,
452c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == 0));
453c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_CMP_REQUEUE, %u, %u, %p, %u) = %s\n",
454100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		uaddr, VAL_PR, VAL2_PR, uaddr2, *uaddr, sprintrc(rc));
455c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
456c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* Successful comparison re-queue */
457c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_CMP_REQUEUE, VAL,
458c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL2, uaddr2, *uaddr, (rc == 0));
459c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_CMP_REQUEUE_PRIVATE, %u, %u, %p, %u) = %s\n",
460100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		uaddr, VAL_PR, VAL2_PR, uaddr2, *uaddr, sprintrc(rc));
461c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
462c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_INVALID_CLOCKRT(FUTEX_CMP_REQUEUE, ARG3 | ARG4 | ARG5 | ARG6,
463c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		"%u", "%u", "%#lx", "%u");
464c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
465c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_WAKE_OP - wake val processes waiting for uaddr, additionally
466c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                 wake val2 processes waiting for uaddr2 in case
467c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                 operation encoded in val3 (change of value at uaddr2
468c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                 and comparison of previous value against provided
469c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                 constant) succeedes with value at uaddr2. Operation
470c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                 result is written to value of uaddr2 (in any case).
471c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
472c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_WAKE_OP
473c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - how many processes to wake
474c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. val2    - amount of processes to wake in case operation encoded in
475c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *              val3 returns true
476c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - another futex address, for conditional wake of
477c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *              additional processes
478c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - encoded operation:
479c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                1. bit 31 - if 1 then value stored in field field 4
480c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                            should be interpreted as power of 2.
481c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                2. 28..30 - arithmetic operation which should be
482c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                            applied to previous value stored in
483c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                            uaddr2. Values available (from 2005 up to
484c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                            2016): SET. ADD, OR, ANDN, XOR.
485c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                3. 24..29 - comparison operation which should be
486c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                            applied to the old value stored in uaddr2
487c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                            (before arithmetic operation is applied).
488c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                            Possible values: EQ, NE, LT, LE, GT, GE.
489c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                4. 12..23 - Second operand for arithmetic operation.
490c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                            If bit 31 is set, it is interpreted as
491c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                            power of 2.
492c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                5. 00..11 - Value against which old value stored in
493c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                            uaddr2 is compared.
494c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
495c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
496c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	static const struct {
497c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		uint32_t val;
498c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		const char *str;
499c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		int err;
500c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		const char *errstr;
501c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	} wake_ops[] = {
502d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x00000000, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_EQ<<24|0" },
503d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x00fff000, "FUTEX_OP_SET<<28|0xfff<<12|FUTEX_OP_CMP_EQ<<24|"
504d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"0" },
505d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x00000fff, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_EQ<<24|"
506d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"0xfff" },
507d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x00ffffff, "FUTEX_OP_SET<<28|0xfff<<12|FUTEX_OP_CMP_EQ<<24|"
508d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"0xfff" },
509d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x10000000, "FUTEX_OP_ADD<<28|0<<12|FUTEX_OP_CMP_EQ<<24|0" },
510d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x20000000, "FUTEX_OP_OR<<28|0<<12|FUTEX_OP_CMP_EQ<<24|0" },
511d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x30000000, "FUTEX_OP_ANDN<<28|0<<12|FUTEX_OP_CMP_EQ<<24|0" },
512d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x40000000, "FUTEX_OP_XOR<<28|0<<12|FUTEX_OP_CMP_EQ<<24|0" },
513d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x50000000, "0x5<<28 /* FUTEX_OP_??? */|0<<12|"
514d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"FUTEX_OP_CMP_EQ<<24|0", ENOSYS, "ENOSYS" },
515d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x70000000, "0x7<<28 /* FUTEX_OP_??? */|0<<12|"
516d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"FUTEX_OP_CMP_EQ<<24|0", ENOSYS, "ENOSYS" },
517d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x80000000, "FUTEX_OP_OPARG_SHIFT<<28|FUTEX_OP_SET<<28|0<<12|"
518d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"FUTEX_OP_CMP_EQ<<24|0" },
519d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0xa0caffee, "FUTEX_OP_OPARG_SHIFT<<28|FUTEX_OP_OR<<28|"
520d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"0xcaf<<12|FUTEX_OP_CMP_EQ<<24|0xfee" },
521d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x01000000, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_NE<<24|0" },
522d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x01234567, "FUTEX_OP_SET<<28|0x234<<12|FUTEX_OP_CMP_NE<<24|"
523d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"0x567" },
524d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x02000000, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_LT<<24|0" },
525d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x03000000, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_LE<<24|0" },
526d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x04000000, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_GT<<24|0" },
527d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x05000000, "FUTEX_OP_SET<<28|0<<12|FUTEX_OP_CMP_GE<<24|0" },
528d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x06000000, "FUTEX_OP_SET<<28|0<<12|"
529d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"0x6<<24 /* FUTEX_OP_CMP_??? */|0", ENOSYS, "ENOSYS" },
530d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x07000000, "FUTEX_OP_SET<<28|0<<12|"
531d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"0x7<<24 /* FUTEX_OP_CMP_??? */|0", ENOSYS, "ENOSYS" },
532d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x08000000, "FUTEX_OP_SET<<28|0<<12|"
533d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"0x8<<24 /* FUTEX_OP_CMP_??? */|0", ENOSYS, "ENOSYS" },
534d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0x0f000000, "FUTEX_OP_SET<<28|0<<12|"
535d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"0xf<<24 /* FUTEX_OP_CMP_??? */|0", ENOSYS, "ENOSYS" },
536d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0xbadfaced, "FUTEX_OP_OPARG_SHIFT<<28|FUTEX_OP_ANDN<<28|"
537d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"0xdfa<<12|0xa<<24 /* FUTEX_OP_CMP_??? */|0xced",
538c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			ENOSYS, "ENOSYS" },
539d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ 0xffffffff, "FUTEX_OP_OPARG_SHIFT<<28|"
540d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"0x7<<28 /* FUTEX_OP_??? */|0xfff<<12|"
541d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"0xf<<24 /* FUTEX_OP_CMP_??? */|0xfff",
542c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			ENOSYS, "ENOSYS" },
543c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	};
544c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
545c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	for (i = 0; i < ARRAY_SIZE(wake_ops); i++) {
546c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		for (j = 0; j < 2; j++) {
547c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov			CHECK_FUTEX_ENOSYS(uaddr,
548c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov				j ? FUTEX_WAKE_OP_PRIVATE : FUTEX_WAKE_OP,
549c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov				VAL, i, uaddr2, wake_ops[i].val, (rc == 0));
55039bac055674d23770b9a724221b728e443196ea7Elliott Hughes			printf("futex(%p, FUTEX_WAKE_OP%s, %u, %u, %p, %s)"
55139bac055674d23770b9a724221b728e443196ea7Elliott Hughes			       " = %s\n", uaddr, j ? "_PRIVATE" : "", VAL_PR,
55239bac055674d23770b9a724221b728e443196ea7Elliott Hughes			       i, uaddr2, wake_ops[i].str, sprintrc(rc));
553c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		}
554c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	}
555c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
556c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_INVALID_CLOCKRT(FUTEX_WAKE_OP, ARG3 | ARG4 | ARG5 | ARG6,
557c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		"%u", "%u", "%#lx",
558c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		/* Decoding of the 0xdeadbee4 value */
559d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		"FUTEX_OP_OPARG_SHIFT<<28|0x5<<28 /* FUTEX_OP_??? */|0xadb<<12|"
560d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		"0xe<<24 /* FUTEX_OP_CMP_??? */|0xee4");
561c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
562c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_LOCK_PI - slow path for mutex lock with process inheritance
563c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                 support. Expect that futex has 0 in unlocked case and
564c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                 TID of owning process in locked case. Value can also
565c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                 contain FUTEX_WAITERS bit signalling the presence of
566c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                 waiters queue.
567c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Possible flags: PRIVATE
568c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
569c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_LOCK_PI
570c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - not used
571c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. timeout - timeout
572c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - not used
573c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - not used
574c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
575c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
576c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	*uaddr = getpid();
577c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
578c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr + 1, FUTEX_LOCK_PI, VAL, tmout, uaddr2 + 1,
579c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL3, (rc == -1) && (errno == EFAULT));
58039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_LOCK_PI, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
58139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr + 1, (long long) tmout->tv_sec,
58239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
583c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
584c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr + 1, FUTEX_PRIVATE_FLAG | FUTEX_LOCK_PI, VAL,
585c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		tmout, uaddr2 + 1, VAL3, (rc == -1) && (errno == EFAULT));
58639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_LOCK_PI_PRIVATE, {tv_sec=%lld, tv_nsec=%llu})"
58739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       " = %s\n",
58839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr + 1, (long long) tmout->tv_sec,
58939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
590c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
591c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* NULL is passed by invalid_op() in cases valid timeout address is
592c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * needed */
593c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_INVALID_CLOCKRT(FUTEX_LOCK_PI, ARG4, "NULL");
594c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
595c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_UNLOCK_PI - slow path for mutex unlock with process inheritance
596c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                   support. Expected to be called by process in case
597c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                   it failed to execute fast path (it usually means
598c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                   that FUTEX_WAITERS flag had been set while the lock
599c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                   has been held).
600c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Possible flags: PRIVATE
601c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
602c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_UNLOCK_PI
603c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - not used
604c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. timeout - not used
605c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - not used
606c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - not used
607c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
608c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
609c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr + 1, FUTEX_UNLOCK_PI, VAL, tmout, uaddr2 + 1,
610c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL3, (rc == -1) && (errno == EFAULT));
611100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov	printf("futex(%p, FUTEX_UNLOCK_PI) = %s\n", uaddr + 1, sprintrc(rc));
612c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
613c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr + 1, FUTEX_PRIVATE_FLAG | FUTEX_UNLOCK_PI, VAL,
614c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		tmout, uaddr2 + 1, VAL3, (rc == -1) && (errno == EFAULT));
615dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes	printf("futex(%p, FUTEX_UNLOCK_PI_PRIVATE) = %s\n", uaddr + 1,
616100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		sprintrc(rc));
617c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
618c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_INVALID_CLOCKRT(FUTEX_UNLOCK_PI, 0);
619c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
620c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_TRYLOCK_PI - slow path for mutex trylock with process
621c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                 inheritance support.
622c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Possible flags: PRIVATE
623c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
624c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_TRYLOCK_PI
625c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - not used
626c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. timeout - not used
627c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - not used
628c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - not used
629c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
630c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
631c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr + 1, FUTEX_TRYLOCK_PI, VAL, tmout, uaddr2 + 1,
632c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL3, (rc == -1) && (errno == EFAULT));
633100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov	printf("futex(%p, FUTEX_TRYLOCK_PI) = %s\n", uaddr + 1, sprintrc(rc));
634c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
635c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr + 1, FUTEX_PRIVATE_FLAG | FUTEX_TRYLOCK_PI,
636c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL, tmout, uaddr2 + 1, VAL3, (rc == -1) && (errno == EFAULT));
637c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_TRYLOCK_PI_PRIVATE) = %s\n", uaddr + 1,
638100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		sprintrc(rc));
639c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
640c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_INVALID_CLOCKRT(FUTEX_TRYLOCK_PI, 0);
641c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
642c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_WAIT_REQUEUE_PI - kernel-side handling of special case when
643c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                         processes should be re-queued on PI-aware
644c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                         futexes. This is so special since PI futexes
645c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                         utilize rt_mutex and it should be at no time
646c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                         left free with a wait queue, so this should
647c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                         be performed atomically in-kernel.
648c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Possible flags: PRIVATE, CLOCKRT
649c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
650c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_WAIT_REQUEUE_PI
651c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - expected value stored in uaddr
652c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. timeout - timeout
653c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - (PI-aware) futex address to requeue process on
654c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - not used (in kernel, it always initialized to
655c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *              FUTEX_BITSET_MATCH_ANY and passed to
656c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *              futex_wait_requeue_pi())
657c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
658c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
659c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_WAIT_REQUEUE_PI, VAL, tmout, uaddr2,
660c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL3, (rc == -1) && (errno == EAGAIN));
66139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT_REQUEUE_PI, %u"
66239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", {tv_sec=%lld, tv_nsec=%llu}, %p) = %s\n",
66339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
66439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), uaddr2, sprintrc(rc));
665c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
666c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_WAIT_REQUEUE_PI,
667c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL, tmout, uaddr2, VAL3, (rc == -1) && (errno == EAGAIN));
66839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT_REQUEUE_PI_PRIVATE, %u"
66939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", {tv_sec=%lld, tv_nsec=%llu}, %p) = %s\n",
67039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
67139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), uaddr2, sprintrc(rc));
672c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
673c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_CLOCK_REALTIME | FUTEX_WAIT_REQUEUE_PI,
674c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL, tmout, uaddr2, VAL3, (rc == -1) && (errno == EAGAIN));
67539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT_REQUEUE_PI|FUTEX_CLOCK_REALTIME, %u"
67639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", {tv_sec=%lld, tv_nsec=%llu}, %p) = %s\n",
67739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
67839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), uaddr2, sprintrc(rc));
679c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
680c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_CLOCK_REALTIME | FUTEX_PRIVATE_FLAG |
681c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		FUTEX_WAIT_REQUEUE_PI, VAL, tmout, uaddr2, VAL3,
682c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == EAGAIN));
68339bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("futex(%p, FUTEX_WAIT_REQUEUE_PI_PRIVATE|FUTEX_CLOCK_REALTIME"
68439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", %u, {tv_sec=%lld, tv_nsec=%llu}, %p) = %s\n",
68539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       uaddr, VAL_PR, (long long) tmout->tv_sec,
68639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       zero_extend_signed_to_ull(tmout->tv_nsec), uaddr2, sprintrc(rc));
687c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
688c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* FUTEX_CMP_REQUEUE_PI - version of FUTEX_CMP_REQUEUE which re-queues
689c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *                        on PI-aware futex.
690c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Possible flags: PRIVATE
691c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 1. uaddr   - futex address
692c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 2. op      - FUTEX_CMP_REQUEUE
693c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 3. val     - how many processes to wake
694c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 4. val2    - amount of processes to re-queue on uadr2
695c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 5. uaddr2  - (PI-aware) futex address, to re-queue waiting processes
696c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 *              on
697c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * 6. val3    - expected value stored in uaddr
698c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
699c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
700c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/* All these should fail with EINVAL since we try to re-queue to  non-PI
701c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * futex.
702c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
703c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
704c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_CMP_REQUEUE_PI, VAL, VAL2, uaddr2, VAL3,
705c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == EINVAL));
706c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_CMP_REQUEUE_PI, %u, %u, %p, %u) = %s\n",
707100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		uaddr, VAL_PR, VAL2_PR, uaddr2, VAL3_PR, sprintrc(rc));
708c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
709c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_CMP_REQUEUE_PI, VAL, VAL2, uaddr2,
710c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		*uaddr, (rc == -1) && (errno == EINVAL));
711c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_CMP_REQUEUE_PI, %u, %u, %p, %u) = %s\n",
712100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		uaddr, VAL_PR, VAL2_PR, uaddr2, *uaddr, sprintrc(rc));
713c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
714c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX_ENOSYS(uaddr, FUTEX_PRIVATE_FLAG | FUTEX_CMP_REQUEUE_PI,
715c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		VAL, VAL2, uaddr2, *uaddr, (rc == -1) && (errno == EINVAL));
716c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, FUTEX_CMP_REQUEUE_PI_PRIVATE, %u, %u, %p, %u) = %s\n",
717100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		uaddr, VAL_PR, VAL2_PR, uaddr2, *uaddr, sprintrc(rc));
718c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
719c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_INVALID_CLOCKRT(FUTEX_CMP_REQUEUE_PI, ARG3 | ARG4 | ARG5 | ARG6,
720c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		"%u", "%u", "%#lx", "%u");
721c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
722c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	/*
723c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 * Unknown commands
724c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	 */
725c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
726c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX(uaddr, 0xd, VAL, tmout + 1, uaddr2 + 1, VAL3,
727c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == ENOSYS));
728c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, 0xd /* FUTEX_??? */, %u, %p, %p, %#x) = %s\n",
729100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		uaddr, VAL_PR, tmout + 1, uaddr2 + 1, VAL3_PR, sprintrc(rc));
730c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
731c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	CHECK_FUTEX(uaddr, 0xbefeeded, VAL, tmout + 1, uaddr2, VAL3,
732c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov		(rc == -1) && (errno == ENOSYS));
733c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	printf("futex(%p, 0xbefeeded /* FUTEX_??? */, %u, %p, %p, %#x) = %s\n",
734100a7f2f8dfcc9bf81dbfdcd1a782bf033198b70Eugene Syromyatnikov		uaddr, VAL_PR, tmout + 1, uaddr2, VAL3_PR, sprintrc(rc));
735c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
736c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	puts("+++ exited with 0 +++");
737c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
738c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov	return 0;
739c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov}
740c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
741c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov#else
742c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
743c965bec3a11671c51885996101e286bc27151b07Eugene SyromiatnikovSKIP_MAIN_UNDEFINED("__NR_futex")
744c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov
745c965bec3a11671c51885996101e286bc27151b07Eugene Syromiatnikov#endif
746