Dmitry V. Levin
b5821091ee
* futex.c (sys_futex): Use switch statement. Use printaddr. Print uint32_t syscall arguments using %u format. Update for RVAL_DECODED.
87 lines
1.9 KiB
C
87 lines
1.9 KiB
C
#include "defs.h"
|
|
|
|
#ifdef HAVE_LINUX_FUTEX_H
|
|
# include <linux/futex.h>
|
|
#endif
|
|
|
|
#ifndef FUTEX_PRIVATE_FLAG
|
|
# define FUTEX_PRIVATE_FLAG 128
|
|
#endif
|
|
#ifndef FUTEX_CLOCK_REALTIME
|
|
# define FUTEX_CLOCK_REALTIME 256
|
|
#endif
|
|
|
|
#include "xlat/futexops.h"
|
|
#include "xlat/futexwakeops.h"
|
|
#include "xlat/futexwakecmps.h"
|
|
|
|
SYS_FUNC(futex)
|
|
{
|
|
const long uaddr = tcp->u_arg[0];
|
|
const int op = tcp->u_arg[1];
|
|
const int cmd = op & 127;
|
|
const long timeout = tcp->u_arg[3];
|
|
const long uaddr2 = tcp->u_arg[4];
|
|
const unsigned int val = tcp->u_arg[2];
|
|
const unsigned int val2 = tcp->u_arg[3];
|
|
const unsigned int val3 = tcp->u_arg[5];
|
|
|
|
printaddr(uaddr);
|
|
tprints(", ");
|
|
printxval(futexops, op, "FUTEX_???");
|
|
tprintf(", %u", val);
|
|
switch (cmd) {
|
|
case FUTEX_WAIT:
|
|
case FUTEX_LOCK_PI:
|
|
tprints(", ");
|
|
printtv(tcp, timeout);
|
|
break;
|
|
case FUTEX_WAIT_BITSET:
|
|
tprints(", ");
|
|
printtv(tcp, timeout);
|
|
tprintf(", %x", val3);
|
|
break;
|
|
case FUTEX_WAKE_BITSET:
|
|
tprintf(", %x", val3);
|
|
break;
|
|
case FUTEX_REQUEUE:
|
|
tprintf(", %u, ", val2);
|
|
printaddr(uaddr2);
|
|
break;
|
|
case FUTEX_CMP_REQUEUE:
|
|
case FUTEX_CMP_REQUEUE_PI:
|
|
tprintf(", %u, ", val2);
|
|
printaddr(uaddr2);
|
|
tprintf(", %u", val3);
|
|
break;
|
|
case FUTEX_WAKE_OP:
|
|
tprintf(", %u, ", val2);
|
|
printaddr(uaddr2);
|
|
tprints(", {");
|
|
if ((val3 >> 28) & 8)
|
|
tprints("FUTEX_OP_OPARG_SHIFT|");
|
|
printxval(futexwakeops, (val3 >> 28) & 0x7, "FUTEX_OP_???");
|
|
tprintf(", %u, ", (val3 >> 12) & 0xfff);
|
|
if ((val3 >> 24) & 8)
|
|
tprints("FUTEX_OP_OPARG_SHIFT|");
|
|
printxval(futexwakecmps, (val3 >> 24) & 0x7, "FUTEX_OP_CMP_???");
|
|
tprintf(", %u}", val3 & 0xfff);
|
|
break;
|
|
case FUTEX_WAIT_REQUEUE_PI:
|
|
tprints(", ");
|
|
printtv(tcp, timeout);
|
|
tprints(", ");
|
|
printaddr(uaddr2);
|
|
break;
|
|
case FUTEX_WAKE:
|
|
case FUTEX_UNLOCK_PI:
|
|
case FUTEX_TRYLOCK_PI:
|
|
break;
|
|
default:
|
|
tprintf(", %lx, %lx, %x", timeout, uaddr2, val3);
|
|
break;
|
|
}
|
|
|
|
return RVAL_DECODED;
|
|
}
|