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