Home | History | Annotate | Download | only in strace
      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