1 #include "defs.h" 2 3 #ifdef HAVE_LINUX_FUTEX_H 4 # include <linux/futex.h> 5 #endif 6 7 #ifndef FUTEX_WAIT 8 # define FUTEX_WAIT 0 9 #endif 10 #ifndef FUTEX_WAKE 11 # define FUTEX_WAKE 1 12 #endif 13 #ifndef FUTEX_FD 14 # define FUTEX_FD 2 15 #endif 16 #ifndef FUTEX_REQUEUE 17 # define FUTEX_REQUEUE 3 18 #endif 19 #ifndef FUTEX_CMP_REQUEUE 20 # define FUTEX_CMP_REQUEUE 4 21 #endif 22 #ifndef FUTEX_WAKE_OP 23 # define FUTEX_WAKE_OP 5 24 #endif 25 #ifndef FUTEX_LOCK_PI 26 # define FUTEX_LOCK_PI 6 27 # define FUTEX_UNLOCK_PI 7 28 # define FUTEX_TRYLOCK_PI 8 29 #endif 30 #ifndef FUTEX_WAIT_BITSET 31 # define FUTEX_WAIT_BITSET 9 32 #endif 33 #ifndef FUTEX_WAKE_BITSET 34 # define FUTEX_WAKE_BITSET 10 35 #endif 36 #ifndef FUTEX_WAIT_REQUEUE_PI 37 # define FUTEX_WAIT_REQUEUE_PI 11 38 #endif 39 #ifndef FUTEX_CMP_REQUEUE_PI 40 # define FUTEX_CMP_REQUEUE_PI 12 41 #endif 42 #ifndef FUTEX_PRIVATE_FLAG 43 # define FUTEX_PRIVATE_FLAG 128 44 #endif 45 #ifndef FUTEX_CLOCK_REALTIME 46 # define FUTEX_CLOCK_REALTIME 256 47 #endif 48 #ifndef FUTEX_WAIT_PRIVATE 49 # define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG) 50 #endif 51 #ifndef FUTEX_WAKE_PRIVATE 52 # define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG) 53 #endif 54 #ifndef FUTEX_REQUEUE_PRIVATE 55 # define FUTEX_REQUEUE_PRIVATE (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG) 56 #endif 57 #ifndef FUTEX_CMP_REQUEUE_PRIVATE 58 # define FUTEX_CMP_REQUEUE_PRIVATE (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG) 59 #endif 60 #ifndef FUTEX_WAKE_OP_PRIVATE 61 # define FUTEX_WAKE_OP_PRIVATE (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG) 62 #endif 63 #ifndef FUTEX_LOCK_PI_PRIVATE 64 # define FUTEX_LOCK_PI_PRIVATE (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG) 65 #endif 66 #ifndef FUTEX_UNLOCK_PI_PRIVATE 67 # define FUTEX_UNLOCK_PI_PRIVATE (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG) 68 #endif 69 #ifndef FUTEX_TRYLOCK_PI_PRIVATE 70 # define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG) 71 #endif 72 #ifndef FUTEX_WAIT_BITSET_PRIVATE 73 # define FUTEX_WAIT_BITSET_PRIVATE (FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG) 74 #endif 75 #ifndef FUTEX_WAKE_BITSET_PRIVATE 76 # define FUTEX_WAKE_BITSET_PRIVATE (FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG) 77 #endif 78 #ifndef FUTEX_WAIT_REQUEUE_PI_PRIVATE 79 # define FUTEX_WAIT_REQUEUE_PI_PRIVATE (FUTEX_WAIT_REQUEUE_PI | FUTEX_PRIVATE_FLAG) 80 #endif 81 #ifndef FUTEX_CMP_REQUEUE_PI_PRIVATE 82 # define FUTEX_CMP_REQUEUE_PI_PRIVATE (FUTEX_CMP_REQUEUE_PI | FUTEX_PRIVATE_FLAG) 83 #endif 84 #include "xlat/futexops.h" 85 #ifndef FUTEX_OP_SET 86 # define FUTEX_OP_SET 0 87 # define FUTEX_OP_ADD 1 88 # define FUTEX_OP_OR 2 89 # define FUTEX_OP_ANDN 3 90 # define FUTEX_OP_XOR 4 91 # define FUTEX_OP_CMP_EQ 0 92 # define FUTEX_OP_CMP_NE 1 93 # define FUTEX_OP_CMP_LT 2 94 # define FUTEX_OP_CMP_LE 3 95 # define FUTEX_OP_CMP_GT 4 96 # define FUTEX_OP_CMP_GE 5 97 #endif 98 #include "xlat/futexwakeops.h" 99 #include "xlat/futexwakecmps.h" 100 101 SYS_FUNC(futex) 102 { 103 if (entering(tcp)) { 104 long int cmd = tcp->u_arg[1] & 127; 105 tprintf("%p, ", (void *) tcp->u_arg[0]); 106 printxval(futexops, tcp->u_arg[1], "FUTEX_???"); 107 tprintf(", %ld", tcp->u_arg[2]); 108 if (cmd == FUTEX_WAKE_BITSET) 109 tprintf(", %lx", tcp->u_arg[5]); 110 else if (cmd == FUTEX_WAIT) { 111 tprints(", "); 112 printtv(tcp, tcp->u_arg[3]); 113 } else if (cmd == FUTEX_WAIT_BITSET) { 114 tprints(", "); 115 printtv(tcp, tcp->u_arg[3]); 116 tprintf(", %lx", tcp->u_arg[5]); 117 } else if (cmd == FUTEX_REQUEUE) 118 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]); 119 else if (cmd == FUTEX_CMP_REQUEUE || cmd == FUTEX_CMP_REQUEUE_PI) 120 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]); 121 else if (cmd == FUTEX_WAKE_OP) { 122 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]); 123 if ((tcp->u_arg[5] >> 28) & 8) 124 tprints("FUTEX_OP_OPARG_SHIFT|"); 125 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???"); 126 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff); 127 if ((tcp->u_arg[5] >> 24) & 8) 128 tprints("FUTEX_OP_OPARG_SHIFT|"); 129 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???"); 130 tprintf(", %ld}", tcp->u_arg[5] & 0xfff); 131 } else if (cmd == FUTEX_WAIT_REQUEUE_PI) { 132 tprints(", "); 133 printtv(tcp, tcp->u_arg[3]); 134 tprintf(", %p", (void *) tcp->u_arg[4]); 135 } 136 } 137 return 0; 138 } 139