qemu/linux-user/strace.c
<<
>>
Prefs
   1#include "qemu/osdep.h"
   2#include <sys/ipc.h>
   3#include <sys/msg.h>
   4#include <sys/sem.h>
   5#include <sys/shm.h>
   6#include <sys/select.h>
   7#include <sys/mount.h>
   8#include <arpa/inet.h>
   9#include <netinet/tcp.h>
  10#include <linux/if_packet.h>
  11#include <sched.h>
  12#include "qemu.h"
  13
  14int do_strace=0;
  15
  16struct syscallname {
  17    int nr;
  18    const char *name;
  19    const char *format;
  20    void (*call)(const struct syscallname *,
  21                 abi_long, abi_long, abi_long,
  22                 abi_long, abi_long, abi_long);
  23    void (*result)(const struct syscallname *, abi_long);
  24};
  25
  26#ifdef __GNUC__
  27/*
  28 * It is possible that target doesn't have syscall that uses
  29 * following flags but we don't want the compiler to warn
  30 * us about them being unused.  Same applies to utility print
  31 * functions.  It is ok to keep them while not used.
  32 */
  33#define UNUSED __attribute__ ((unused))
  34#else
  35#define UNUSED
  36#endif
  37
  38/*
  39 * Structure used to translate flag values into strings.  This is
  40 * similar that is in the actual strace tool.
  41 */
  42struct flags {
  43    abi_long    f_value;  /* flag */
  44    const char  *f_string; /* stringified flag */
  45};
  46
  47/* common flags for all architectures */
  48#define FLAG_GENERIC(name) { name, #name }
  49/* target specific flags (syscall_defs.h has TARGET_<flag>) */
  50#define FLAG_TARGET(name)  { TARGET_ ## name, #name }
  51/* end of flags array */
  52#define FLAG_END           { 0, NULL }
  53
  54UNUSED static const char *get_comma(int);
  55UNUSED static void print_pointer(abi_long, int);
  56UNUSED static void print_flags(const struct flags *, abi_long, int);
  57UNUSED static void print_at_dirfd(abi_long, int);
  58UNUSED static void print_file_mode(abi_long, int);
  59UNUSED static void print_open_flags(abi_long, int);
  60UNUSED static void print_syscall_prologue(const struct syscallname *);
  61UNUSED static void print_syscall_epilogue(const struct syscallname *);
  62UNUSED static void print_string(abi_long, int);
  63UNUSED static void print_buf(abi_long addr, abi_long len, int last);
  64UNUSED static void print_raw_param(const char *, abi_long, int);
  65UNUSED static void print_timeval(abi_ulong, int);
  66UNUSED static void print_number(abi_long, int);
  67UNUSED static void print_signal(abi_ulong, int);
  68UNUSED static void print_sockaddr(abi_ulong addr, abi_long addrlen);
  69UNUSED static void print_socket_domain(int domain);
  70UNUSED static void print_socket_type(int type);
  71UNUSED static void print_socket_protocol(int domain, int type, int protocol);
  72
  73/*
  74 * Utility functions
  75 */
  76static void
  77print_ipc_cmd(int cmd)
  78{
  79#define output_cmd(val) \
  80if( cmd == val ) { \
  81    gemu_log(#val); \
  82    return; \
  83}
  84
  85    cmd &= 0xff;
  86
  87    /* General IPC commands */
  88    output_cmd( IPC_RMID );
  89    output_cmd( IPC_SET );
  90    output_cmd( IPC_STAT );
  91    output_cmd( IPC_INFO );
  92    /* msgctl() commands */
  93    #ifdef __USER_MISC
  94    output_cmd( MSG_STAT );
  95    output_cmd( MSG_INFO );
  96    #endif
  97    /* shmctl() commands */
  98    output_cmd( SHM_LOCK );
  99    output_cmd( SHM_UNLOCK );
 100    output_cmd( SHM_STAT );
 101    output_cmd( SHM_INFO );
 102    /* semctl() commands */
 103    output_cmd( GETPID );
 104    output_cmd( GETVAL );
 105    output_cmd( GETALL );
 106    output_cmd( GETNCNT );
 107    output_cmd( GETZCNT );
 108    output_cmd( SETVAL );
 109    output_cmd( SETALL );
 110    output_cmd( SEM_STAT );
 111    output_cmd( SEM_INFO );
 112    output_cmd( IPC_RMID );
 113    output_cmd( IPC_RMID );
 114    output_cmd( IPC_RMID );
 115    output_cmd( IPC_RMID );
 116    output_cmd( IPC_RMID );
 117    output_cmd( IPC_RMID );
 118    output_cmd( IPC_RMID );
 119    output_cmd( IPC_RMID );
 120    output_cmd( IPC_RMID );
 121
 122    /* Some value we don't recognize */
 123    gemu_log("%d",cmd);
 124}
 125
 126static void
 127print_signal(abi_ulong arg, int last)
 128{
 129    const char *signal_name = NULL;
 130    switch(arg) {
 131    case TARGET_SIGHUP: signal_name = "SIGHUP"; break;
 132    case TARGET_SIGINT: signal_name = "SIGINT"; break;
 133    case TARGET_SIGQUIT: signal_name = "SIGQUIT"; break;
 134    case TARGET_SIGILL: signal_name = "SIGILL"; break;
 135    case TARGET_SIGABRT: signal_name = "SIGABRT"; break;
 136    case TARGET_SIGFPE: signal_name = "SIGFPE"; break;
 137    case TARGET_SIGKILL: signal_name = "SIGKILL"; break;
 138    case TARGET_SIGSEGV: signal_name = "SIGSEGV"; break;
 139    case TARGET_SIGPIPE: signal_name = "SIGPIPE"; break;
 140    case TARGET_SIGALRM: signal_name = "SIGALRM"; break;
 141    case TARGET_SIGTERM: signal_name = "SIGTERM"; break;
 142    case TARGET_SIGUSR1: signal_name = "SIGUSR1"; break;
 143    case TARGET_SIGUSR2: signal_name = "SIGUSR2"; break;
 144    case TARGET_SIGCHLD: signal_name = "SIGCHLD"; break;
 145    case TARGET_SIGCONT: signal_name = "SIGCONT"; break;
 146    case TARGET_SIGSTOP: signal_name = "SIGSTOP"; break;
 147    case TARGET_SIGTTIN: signal_name = "SIGTTIN"; break;
 148    case TARGET_SIGTTOU: signal_name = "SIGTTOU"; break;
 149    }
 150    if (signal_name == NULL) {
 151        print_raw_param("%ld", arg, last);
 152        return;
 153    }
 154    gemu_log("%s%s", signal_name, get_comma(last));
 155}
 156
 157static void
 158print_sockaddr(abi_ulong addr, abi_long addrlen)
 159{
 160    struct target_sockaddr *sa;
 161    int i;
 162    int sa_family;
 163
 164    sa = lock_user(VERIFY_READ, addr, addrlen, 1);
 165    if (sa) {
 166        sa_family = tswap16(sa->sa_family);
 167        switch (sa_family) {
 168        case AF_UNIX: {
 169            struct target_sockaddr_un *un = (struct target_sockaddr_un *)sa;
 170            int i;
 171            gemu_log("{sun_family=AF_UNIX,sun_path=\"");
 172            for (i = 0; i < addrlen -
 173                            offsetof(struct target_sockaddr_un, sun_path) &&
 174                 un->sun_path[i]; i++) {
 175                gemu_log("%c", un->sun_path[i]);
 176            }
 177            gemu_log("\"}");
 178            break;
 179        }
 180        case AF_INET: {
 181            struct target_sockaddr_in *in = (struct target_sockaddr_in *)sa;
 182            uint8_t *c = (uint8_t *)&in->sin_addr.s_addr;
 183            gemu_log("{sin_family=AF_INET,sin_port=htons(%d),",
 184                     ntohs(in->sin_port));
 185            gemu_log("sin_addr=inet_addr(\"%d.%d.%d.%d\")",
 186                     c[0], c[1], c[2], c[3]);
 187            gemu_log("}");
 188            break;
 189        }
 190        case AF_PACKET: {
 191            struct target_sockaddr_ll *ll = (struct target_sockaddr_ll *)sa;
 192            uint8_t *c = (uint8_t *)&ll->sll_addr;
 193            gemu_log("{sll_family=AF_PACKET,"
 194                     "sll_protocol=htons(0x%04x),if%d,pkttype=",
 195                     ntohs(ll->sll_protocol), ll->sll_ifindex);
 196            switch (ll->sll_pkttype) {
 197            case PACKET_HOST:
 198                gemu_log("PACKET_HOST");
 199                break;
 200            case PACKET_BROADCAST:
 201                gemu_log("PACKET_BROADCAST");
 202                break;
 203            case PACKET_MULTICAST:
 204                gemu_log("PACKET_MULTICAST");
 205                break;
 206            case PACKET_OTHERHOST:
 207                gemu_log("PACKET_OTHERHOST");
 208                break;
 209            case PACKET_OUTGOING:
 210                gemu_log("PACKET_OUTGOING");
 211                break;
 212            default:
 213                gemu_log("%d", ll->sll_pkttype);
 214                break;
 215            }
 216            gemu_log(",sll_addr=%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
 217                     c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
 218            gemu_log("}");
 219            break;
 220        }
 221        default:
 222            gemu_log("{sa_family=%d, sa_data={", sa->sa_family);
 223            for (i = 0; i < 13; i++) {
 224                gemu_log("%02x, ", sa->sa_data[i]);
 225            }
 226            gemu_log("%02x}", sa->sa_data[i]);
 227            gemu_log("}");
 228            break;
 229        }
 230        unlock_user(sa, addr, 0);
 231    } else {
 232        print_raw_param("0x"TARGET_ABI_FMT_lx, addr, 0);
 233    }
 234    gemu_log(", "TARGET_ABI_FMT_ld, addrlen);
 235}
 236
 237static void
 238print_socket_domain(int domain)
 239{
 240    switch (domain) {
 241    case PF_UNIX:
 242        gemu_log("PF_UNIX");
 243        break;
 244    case PF_INET:
 245        gemu_log("PF_INET");
 246        break;
 247    case PF_PACKET:
 248        gemu_log("PF_PACKET");
 249        break;
 250    default:
 251        gemu_log("%d", domain);
 252        break;
 253    }
 254}
 255
 256static void
 257print_socket_type(int type)
 258{
 259    switch (type) {
 260    case TARGET_SOCK_DGRAM:
 261        gemu_log("SOCK_DGRAM");
 262        break;
 263    case TARGET_SOCK_STREAM:
 264        gemu_log("SOCK_STREAM");
 265        break;
 266    case TARGET_SOCK_RAW:
 267        gemu_log("SOCK_RAW");
 268        break;
 269    case TARGET_SOCK_RDM:
 270        gemu_log("SOCK_RDM");
 271        break;
 272    case TARGET_SOCK_SEQPACKET:
 273        gemu_log("SOCK_SEQPACKET");
 274        break;
 275    case TARGET_SOCK_PACKET:
 276        gemu_log("SOCK_PACKET");
 277        break;
 278    }
 279}
 280
 281static void
 282print_socket_protocol(int domain, int type, int protocol)
 283{
 284    if (domain == AF_PACKET ||
 285        (domain == AF_INET && type == TARGET_SOCK_PACKET)) {
 286        switch (protocol) {
 287        case 0x0003:
 288            gemu_log("ETH_P_ALL");
 289            break;
 290        default:
 291            gemu_log("%d", protocol);
 292        }
 293        return;
 294    }
 295
 296    switch (protocol) {
 297    case IPPROTO_IP:
 298        gemu_log("IPPROTO_IP");
 299        break;
 300    case IPPROTO_TCP:
 301        gemu_log("IPPROTO_TCP");
 302        break;
 303    case IPPROTO_UDP:
 304        gemu_log("IPPROTO_UDP");
 305        break;
 306    case IPPROTO_RAW:
 307        gemu_log("IPPROTO_RAW");
 308        break;
 309    default:
 310        gemu_log("%d", protocol);
 311        break;
 312    }
 313}
 314
 315
 316#ifdef TARGET_NR__newselect
 317static void
 318print_fdset(int n, abi_ulong target_fds_addr)
 319{
 320    int i;
 321
 322    gemu_log("[");
 323    if( target_fds_addr ) {
 324        abi_long *target_fds;
 325
 326        target_fds = lock_user(VERIFY_READ,
 327                               target_fds_addr,
 328                               sizeof(*target_fds)*(n / TARGET_ABI_BITS + 1),
 329                               1);
 330
 331        if (!target_fds)
 332            return;
 333
 334        for (i=n; i>=0; i--) {
 335            if ((tswapal(target_fds[i / TARGET_ABI_BITS]) >> (i & (TARGET_ABI_BITS - 1))) & 1)
 336                gemu_log("%d,", i );
 337            }
 338        unlock_user(target_fds, target_fds_addr, 0);
 339    }
 340    gemu_log("]");
 341}
 342#endif
 343
 344/*
 345 * Sysycall specific output functions
 346 */
 347
 348/* select */
 349#ifdef TARGET_NR__newselect
 350static long newselect_arg1 = 0;
 351static long newselect_arg2 = 0;
 352static long newselect_arg3 = 0;
 353static long newselect_arg4 = 0;
 354static long newselect_arg5 = 0;
 355
 356static void
 357print_newselect(const struct syscallname *name,
 358                abi_long arg1, abi_long arg2, abi_long arg3,
 359                abi_long arg4, abi_long arg5, abi_long arg6)
 360{
 361    gemu_log("%s(" TARGET_ABI_FMT_ld ",", name->name, arg1);
 362    print_fdset(arg1, arg2);
 363    gemu_log(",");
 364    print_fdset(arg1, arg3);
 365    gemu_log(",");
 366    print_fdset(arg1, arg4);
 367    gemu_log(",");
 368    print_timeval(arg5, 1);
 369    gemu_log(")");
 370
 371    /* save for use in the return output function below */
 372    newselect_arg1=arg1;
 373    newselect_arg2=arg2;
 374    newselect_arg3=arg3;
 375    newselect_arg4=arg4;
 376    newselect_arg5=arg5;
 377}
 378#endif
 379
 380#ifdef TARGET_NR_semctl
 381static void
 382print_semctl(const struct syscallname *name,
 383             abi_long arg1, abi_long arg2, abi_long arg3,
 384             abi_long arg4, abi_long arg5, abi_long arg6)
 385{
 386    gemu_log("%s(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ",", name->name, arg1, arg2);
 387    print_ipc_cmd(arg3);
 388    gemu_log(",0x" TARGET_ABI_FMT_lx ")", arg4);
 389}
 390#endif
 391
 392static void
 393print_execve(const struct syscallname *name,
 394             abi_long arg1, abi_long arg2, abi_long arg3,
 395             abi_long arg4, abi_long arg5, abi_long arg6)
 396{
 397    abi_ulong arg_ptr_addr;
 398    char *s;
 399
 400    if (!(s = lock_user_string(arg1)))
 401        return;
 402    gemu_log("%s(\"%s\",{", name->name, s);
 403    unlock_user(s, arg1, 0);
 404
 405    for (arg_ptr_addr = arg2; ; arg_ptr_addr += sizeof(abi_ulong)) {
 406        abi_ulong *arg_ptr, arg_addr;
 407
 408        arg_ptr = lock_user(VERIFY_READ, arg_ptr_addr, sizeof(abi_ulong), 1);
 409        if (!arg_ptr)
 410            return;
 411    arg_addr = tswapal(*arg_ptr);
 412        unlock_user(arg_ptr, arg_ptr_addr, 0);
 413        if (!arg_addr)
 414            break;
 415        if ((s = lock_user_string(arg_addr))) {
 416            gemu_log("\"%s\",", s);
 417            unlock_user(s, arg_addr, 0);
 418        }
 419    }
 420
 421    gemu_log("NULL})");
 422}
 423
 424#ifdef TARGET_NR_ipc
 425static void
 426print_ipc(const struct syscallname *name,
 427          abi_long arg1, abi_long arg2, abi_long arg3,
 428          abi_long arg4, abi_long arg5, abi_long arg6)
 429{
 430    switch(arg1) {
 431    case IPCOP_semctl:
 432        gemu_log("semctl(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ",", arg1, arg2);
 433        print_ipc_cmd(arg3);
 434        gemu_log(",0x" TARGET_ABI_FMT_lx ")", arg4);
 435        break;
 436    default:
 437        gemu_log("%s(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ")",
 438                 name->name, arg1, arg2, arg3, arg4);
 439    }
 440}
 441#endif
 442
 443/*
 444 * Variants for the return value output function
 445 */
 446
 447static void
 448print_syscall_ret_addr(const struct syscallname *name, abi_long ret)
 449{
 450    const char *errstr = NULL;
 451
 452    if (ret < 0) {
 453        errstr = target_strerror(-ret);
 454    }
 455    if (errstr) {
 456        gemu_log(" = -1 errno=%d (%s)\n", (int)-ret, errstr);
 457    } else {
 458        gemu_log(" = 0x" TARGET_ABI_FMT_lx "\n", ret);
 459    }
 460}
 461
 462#if 0 /* currently unused */
 463static void
 464print_syscall_ret_raw(struct syscallname *name, abi_long ret)
 465{
 466        gemu_log(" = 0x" TARGET_ABI_FMT_lx "\n", ret);
 467}
 468#endif
 469
 470#ifdef TARGET_NR__newselect
 471static void
 472print_syscall_ret_newselect(const struct syscallname *name, abi_long ret)
 473{
 474    gemu_log(" = 0x" TARGET_ABI_FMT_lx " (", ret);
 475    print_fdset(newselect_arg1,newselect_arg2);
 476    gemu_log(",");
 477    print_fdset(newselect_arg1,newselect_arg3);
 478    gemu_log(",");
 479    print_fdset(newselect_arg1,newselect_arg4);
 480    gemu_log(",");
 481    print_timeval(newselect_arg5, 1);
 482    gemu_log(")\n");
 483}
 484#endif
 485
 486UNUSED static struct flags access_flags[] = {
 487    FLAG_GENERIC(F_OK),
 488    FLAG_GENERIC(R_OK),
 489    FLAG_GENERIC(W_OK),
 490    FLAG_GENERIC(X_OK),
 491    FLAG_END,
 492};
 493
 494UNUSED static struct flags at_file_flags[] = {
 495#ifdef AT_EACCESS
 496    FLAG_GENERIC(AT_EACCESS),
 497#endif
 498#ifdef AT_SYMLINK_NOFOLLOW
 499    FLAG_GENERIC(AT_SYMLINK_NOFOLLOW),
 500#endif
 501    FLAG_END,
 502};
 503
 504UNUSED static struct flags unlinkat_flags[] = {
 505#ifdef AT_REMOVEDIR
 506    FLAG_GENERIC(AT_REMOVEDIR),
 507#endif
 508    FLAG_END,
 509};
 510
 511UNUSED static struct flags mode_flags[] = {
 512    FLAG_GENERIC(S_IFSOCK),
 513    FLAG_GENERIC(S_IFLNK),
 514    FLAG_GENERIC(S_IFREG),
 515    FLAG_GENERIC(S_IFBLK),
 516    FLAG_GENERIC(S_IFDIR),
 517    FLAG_GENERIC(S_IFCHR),
 518    FLAG_GENERIC(S_IFIFO),
 519    FLAG_END,
 520};
 521
 522UNUSED static struct flags open_access_flags[] = {
 523    FLAG_TARGET(O_RDONLY),
 524    FLAG_TARGET(O_WRONLY),
 525    FLAG_TARGET(O_RDWR),
 526    FLAG_END,
 527};
 528
 529UNUSED static struct flags open_flags[] = {
 530    FLAG_TARGET(O_APPEND),
 531    FLAG_TARGET(O_CREAT),
 532    FLAG_TARGET(O_DIRECTORY),
 533    FLAG_TARGET(O_EXCL),
 534    FLAG_TARGET(O_LARGEFILE),
 535    FLAG_TARGET(O_NOCTTY),
 536    FLAG_TARGET(O_NOFOLLOW),
 537    FLAG_TARGET(O_NONBLOCK),      /* also O_NDELAY */
 538    FLAG_TARGET(O_DSYNC),
 539    FLAG_TARGET(__O_SYNC),
 540    FLAG_TARGET(O_TRUNC),
 541#ifdef O_DIRECT
 542    FLAG_TARGET(O_DIRECT),
 543#endif
 544#ifdef O_NOATIME
 545    FLAG_TARGET(O_NOATIME),
 546#endif
 547#ifdef O_CLOEXEC
 548    FLAG_TARGET(O_CLOEXEC),
 549#endif
 550#ifdef O_PATH
 551    FLAG_TARGET(O_PATH),
 552#endif
 553    FLAG_END,
 554};
 555
 556UNUSED static struct flags mount_flags[] = {
 557#ifdef MS_BIND
 558    FLAG_GENERIC(MS_BIND),
 559#endif
 560#ifdef MS_DIRSYNC
 561    FLAG_GENERIC(MS_DIRSYNC),
 562#endif
 563    FLAG_GENERIC(MS_MANDLOCK),
 564#ifdef MS_MOVE
 565    FLAG_GENERIC(MS_MOVE),
 566#endif
 567    FLAG_GENERIC(MS_NOATIME),
 568    FLAG_GENERIC(MS_NODEV),
 569    FLAG_GENERIC(MS_NODIRATIME),
 570    FLAG_GENERIC(MS_NOEXEC),
 571    FLAG_GENERIC(MS_NOSUID),
 572    FLAG_GENERIC(MS_RDONLY),
 573#ifdef MS_RELATIME
 574    FLAG_GENERIC(MS_RELATIME),
 575#endif
 576    FLAG_GENERIC(MS_REMOUNT),
 577    FLAG_GENERIC(MS_SYNCHRONOUS),
 578    FLAG_END,
 579};
 580
 581UNUSED static struct flags umount2_flags[] = {
 582#ifdef MNT_FORCE
 583    FLAG_GENERIC(MNT_FORCE),
 584#endif
 585#ifdef MNT_DETACH
 586    FLAG_GENERIC(MNT_DETACH),
 587#endif
 588#ifdef MNT_EXPIRE
 589    FLAG_GENERIC(MNT_EXPIRE),
 590#endif
 591    FLAG_END,
 592};
 593
 594UNUSED static struct flags mmap_prot_flags[] = {
 595    FLAG_GENERIC(PROT_NONE),
 596    FLAG_GENERIC(PROT_EXEC),
 597    FLAG_GENERIC(PROT_READ),
 598    FLAG_GENERIC(PROT_WRITE),
 599    FLAG_TARGET(PROT_SEM),
 600    FLAG_GENERIC(PROT_GROWSDOWN),
 601    FLAG_GENERIC(PROT_GROWSUP),
 602    FLAG_END,
 603};
 604
 605UNUSED static struct flags mmap_flags[] = {
 606    FLAG_TARGET(MAP_SHARED),
 607    FLAG_TARGET(MAP_PRIVATE),
 608    FLAG_TARGET(MAP_ANONYMOUS),
 609    FLAG_TARGET(MAP_DENYWRITE),
 610    FLAG_TARGET(MAP_FIXED),
 611    FLAG_TARGET(MAP_GROWSDOWN),
 612    FLAG_TARGET(MAP_EXECUTABLE),
 613#ifdef MAP_LOCKED
 614    FLAG_TARGET(MAP_LOCKED),
 615#endif
 616#ifdef MAP_NONBLOCK
 617    FLAG_TARGET(MAP_NONBLOCK),
 618#endif
 619    FLAG_TARGET(MAP_NORESERVE),
 620#ifdef MAP_POPULATE
 621    FLAG_TARGET(MAP_POPULATE),
 622#endif
 623#ifdef TARGET_MAP_UNINITIALIZED
 624    FLAG_TARGET(MAP_UNINITIALIZED),
 625#endif
 626    FLAG_END,
 627};
 628
 629UNUSED static struct flags clone_flags[] = {
 630    FLAG_GENERIC(CLONE_VM),
 631    FLAG_GENERIC(CLONE_FS),
 632    FLAG_GENERIC(CLONE_FILES),
 633    FLAG_GENERIC(CLONE_SIGHAND),
 634    FLAG_GENERIC(CLONE_PTRACE),
 635    FLAG_GENERIC(CLONE_VFORK),
 636    FLAG_GENERIC(CLONE_PARENT),
 637    FLAG_GENERIC(CLONE_THREAD),
 638    FLAG_GENERIC(CLONE_NEWNS),
 639    FLAG_GENERIC(CLONE_SYSVSEM),
 640    FLAG_GENERIC(CLONE_SETTLS),
 641    FLAG_GENERIC(CLONE_PARENT_SETTID),
 642    FLAG_GENERIC(CLONE_CHILD_CLEARTID),
 643    FLAG_GENERIC(CLONE_DETACHED),
 644    FLAG_GENERIC(CLONE_UNTRACED),
 645    FLAG_GENERIC(CLONE_CHILD_SETTID),
 646#if defined(CLONE_NEWUTS)
 647    FLAG_GENERIC(CLONE_NEWUTS),
 648#endif
 649#if defined(CLONE_NEWIPC)
 650    FLAG_GENERIC(CLONE_NEWIPC),
 651#endif
 652#if defined(CLONE_NEWUSER)
 653    FLAG_GENERIC(CLONE_NEWUSER),
 654#endif
 655#if defined(CLONE_NEWPID)
 656    FLAG_GENERIC(CLONE_NEWPID),
 657#endif
 658#if defined(CLONE_NEWNET)
 659    FLAG_GENERIC(CLONE_NEWNET),
 660#endif
 661#if defined(CLONE_IO)
 662    FLAG_GENERIC(CLONE_IO),
 663#endif
 664    FLAG_END,
 665};
 666
 667UNUSED static struct flags msg_flags[] = {
 668    /* send */
 669    FLAG_GENERIC(MSG_CONFIRM),
 670    FLAG_GENERIC(MSG_DONTROUTE),
 671    FLAG_GENERIC(MSG_DONTWAIT),
 672    FLAG_GENERIC(MSG_EOR),
 673    FLAG_GENERIC(MSG_MORE),
 674    FLAG_GENERIC(MSG_NOSIGNAL),
 675    FLAG_GENERIC(MSG_OOB),
 676    /* recv */
 677    FLAG_GENERIC(MSG_CMSG_CLOEXEC),
 678    FLAG_GENERIC(MSG_ERRQUEUE),
 679    FLAG_GENERIC(MSG_PEEK),
 680    FLAG_GENERIC(MSG_TRUNC),
 681    FLAG_GENERIC(MSG_WAITALL),
 682    /* recvmsg */
 683    FLAG_GENERIC(MSG_CTRUNC),
 684    FLAG_END,
 685};
 686
 687/*
 688 * print_xxx utility functions.  These are used to print syscall
 689 * parameters in certain format.  All of these have parameter
 690 * named 'last'.  This parameter is used to add comma to output
 691 * when last == 0.
 692 */
 693
 694static const char *
 695get_comma(int last)
 696{
 697    return ((last) ? "" : ",");
 698}
 699
 700static void
 701print_flags(const struct flags *f, abi_long flags, int last)
 702{
 703    const char *sep = "";
 704    int n;
 705
 706    if ((flags == 0) && (f->f_value == 0)) {
 707        gemu_log("%s%s", f->f_string, get_comma(last));
 708        return;
 709    }
 710    for (n = 0; f->f_string != NULL; f++) {
 711        if ((f->f_value != 0) && ((flags & f->f_value) == f->f_value)) {
 712            gemu_log("%s%s", sep, f->f_string);
 713            flags &= ~f->f_value;
 714            sep = "|";
 715            n++;
 716        }
 717    }
 718
 719    if (n > 0) {
 720        /* print rest of the flags as numeric */
 721        if (flags != 0) {
 722            gemu_log("%s%#x%s", sep, (unsigned int)flags, get_comma(last));
 723        } else {
 724            gemu_log("%s", get_comma(last));
 725        }
 726    } else {
 727        /* no string version of flags found, print them in hex then */
 728        gemu_log("%#x%s", (unsigned int)flags, get_comma(last));
 729    }
 730}
 731
 732static void
 733print_at_dirfd(abi_long dirfd, int last)
 734{
 735#ifdef AT_FDCWD
 736    if (dirfd == AT_FDCWD) {
 737        gemu_log("AT_FDCWD%s", get_comma(last));
 738        return;
 739    }
 740#endif
 741    gemu_log("%d%s", (int)dirfd, get_comma(last));
 742}
 743
 744static void
 745print_file_mode(abi_long mode, int last)
 746{
 747    const char *sep = "";
 748    const struct flags *m;
 749
 750    for (m = &mode_flags[0]; m->f_string != NULL; m++) {
 751        if ((m->f_value & mode) == m->f_value) {
 752            gemu_log("%s%s", m->f_string, sep);
 753            sep = "|";
 754            mode &= ~m->f_value;
 755            break;
 756        }
 757    }
 758
 759    mode &= ~S_IFMT;
 760    /* print rest of the mode as octal */
 761    if (mode != 0)
 762        gemu_log("%s%#o", sep, (unsigned int)mode);
 763
 764    gemu_log("%s", get_comma(last));
 765}
 766
 767static void
 768print_open_flags(abi_long flags, int last)
 769{
 770    print_flags(open_access_flags, flags & TARGET_O_ACCMODE, 1);
 771    flags &= ~TARGET_O_ACCMODE;
 772    if (flags == 0) {
 773        gemu_log("%s", get_comma(last));
 774        return;
 775    }
 776    gemu_log("|");
 777    print_flags(open_flags, flags, last);
 778}
 779
 780static void
 781print_syscall_prologue(const struct syscallname *sc)
 782{
 783    gemu_log("%s(", sc->name);
 784}
 785
 786/*ARGSUSED*/
 787static void
 788print_syscall_epilogue(const struct syscallname *sc)
 789{
 790    (void)sc;
 791    gemu_log(")");
 792}
 793
 794static void
 795print_string(abi_long addr, int last)
 796{
 797    char *s;
 798
 799    if ((s = lock_user_string(addr)) != NULL) {
 800        gemu_log("\"%s\"%s", s, get_comma(last));
 801        unlock_user(s, addr, 0);
 802    } else {
 803        /* can't get string out of it, so print it as pointer */
 804        print_pointer(addr, last);
 805    }
 806}
 807
 808#define MAX_PRINT_BUF 40
 809static void
 810print_buf(abi_long addr, abi_long len, int last)
 811{
 812    uint8_t *s;
 813    int i;
 814
 815    s = lock_user(VERIFY_READ, addr, len, 1);
 816    if (s) {
 817        gemu_log("\"");
 818        for (i = 0; i < MAX_PRINT_BUF && i < len; i++) {
 819            if (isprint(s[i])) {
 820                gemu_log("%c", s[i]);
 821            } else {
 822                gemu_log("\\%o", s[i]);
 823            }
 824        }
 825        gemu_log("\"");
 826        if (i != len) {
 827            gemu_log("...");
 828        }
 829        if (!last) {
 830            gemu_log(",");
 831        }
 832        unlock_user(s, addr, 0);
 833    } else {
 834        print_pointer(addr, last);
 835    }
 836}
 837
 838/*
 839 * Prints out raw parameter using given format.  Caller needs
 840 * to do byte swapping if needed.
 841 */
 842static void
 843print_raw_param(const char *fmt, abi_long param, int last)
 844{
 845    char format[64];
 846
 847    (void) snprintf(format, sizeof (format), "%s%s", fmt, get_comma(last));
 848    gemu_log(format, param);
 849}
 850
 851static void
 852print_pointer(abi_long p, int last)
 853{
 854    if (p == 0)
 855        gemu_log("NULL%s", get_comma(last));
 856    else
 857        gemu_log("0x" TARGET_ABI_FMT_lx "%s", p, get_comma(last));
 858}
 859
 860/*
 861 * Reads 32-bit (int) number from guest address space from
 862 * address 'addr' and prints it.
 863 */
 864static void
 865print_number(abi_long addr, int last)
 866{
 867    if (addr == 0) {
 868        gemu_log("NULL%s", get_comma(last));
 869    } else {
 870        int num;
 871
 872        get_user_s32(num, addr);
 873        gemu_log("[%d]%s", num, get_comma(last));
 874    }
 875}
 876
 877static void
 878print_timeval(abi_ulong tv_addr, int last)
 879{
 880    if( tv_addr ) {
 881        struct target_timeval *tv;
 882
 883        tv = lock_user(VERIFY_READ, tv_addr, sizeof(*tv), 1);
 884        if (!tv)
 885            return;
 886        gemu_log("{" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "}%s",
 887            tswapal(tv->tv_sec), tswapal(tv->tv_usec), get_comma(last));
 888        unlock_user(tv, tv_addr, 0);
 889    } else
 890        gemu_log("NULL%s", get_comma(last));
 891}
 892
 893#undef UNUSED
 894
 895#ifdef TARGET_NR_accept
 896static void
 897print_accept(const struct syscallname *name,
 898    abi_long arg0, abi_long arg1, abi_long arg2,
 899    abi_long arg3, abi_long arg4, abi_long arg5)
 900{
 901    print_syscall_prologue(name);
 902    print_raw_param("%d", arg0, 0);
 903    print_pointer(arg1, 0);
 904    print_number(arg2, 1);
 905    print_syscall_epilogue(name);
 906}
 907#endif
 908
 909#ifdef TARGET_NR_access
 910static void
 911print_access(const struct syscallname *name,
 912    abi_long arg0, abi_long arg1, abi_long arg2,
 913    abi_long arg3, abi_long arg4, abi_long arg5)
 914{
 915    print_syscall_prologue(name);
 916    print_string(arg0, 0);
 917    print_flags(access_flags, arg1, 1);
 918    print_syscall_epilogue(name);
 919}
 920#endif
 921
 922#ifdef TARGET_NR_brk
 923static void
 924print_brk(const struct syscallname *name,
 925    abi_long arg0, abi_long arg1, abi_long arg2,
 926    abi_long arg3, abi_long arg4, abi_long arg5)
 927{
 928    print_syscall_prologue(name);
 929    print_pointer(arg0, 1);
 930    print_syscall_epilogue(name);
 931}
 932#endif
 933
 934#ifdef TARGET_NR_chdir
 935static void
 936print_chdir(const struct syscallname *name,
 937    abi_long arg0, abi_long arg1, abi_long arg2,
 938    abi_long arg3, abi_long arg4, abi_long arg5)
 939{
 940    print_syscall_prologue(name);
 941    print_string(arg0, 1);
 942    print_syscall_epilogue(name);
 943}
 944#endif
 945
 946#ifdef TARGET_NR_chmod
 947static void
 948print_chmod(const struct syscallname *name,
 949    abi_long arg0, abi_long arg1, abi_long arg2,
 950    abi_long arg3, abi_long arg4, abi_long arg5)
 951{
 952    print_syscall_prologue(name);
 953    print_string(arg0, 0);
 954    print_file_mode(arg1, 1);
 955    print_syscall_epilogue(name);
 956}
 957#endif
 958
 959#ifdef TARGET_NR_clone
 960static void do_print_clone(unsigned int flags, abi_ulong newsp,
 961                           abi_ulong parent_tidptr, target_ulong newtls,
 962                           abi_ulong child_tidptr)
 963{
 964    print_flags(clone_flags, flags, 0);
 965    print_raw_param("child_stack=0x" TARGET_ABI_FMT_lx, newsp, 0);
 966    print_raw_param("parent_tidptr=0x" TARGET_ABI_FMT_lx, parent_tidptr, 0);
 967    print_raw_param("tls=0x" TARGET_ABI_FMT_lx, newtls, 0);
 968    print_raw_param("child_tidptr=0x" TARGET_ABI_FMT_lx, child_tidptr, 1);
 969}
 970
 971static void
 972print_clone(const struct syscallname *name,
 973    abi_long arg1, abi_long arg2, abi_long arg3,
 974    abi_long arg4, abi_long arg5, abi_long arg6)
 975{
 976    print_syscall_prologue(name);
 977#if defined(TARGET_MICROBLAZE)
 978    do_print_clone(arg1, arg2, arg4, arg6, arg5);
 979#elif defined(TARGET_CLONE_BACKWARDS)
 980    do_print_clone(arg1, arg2, arg3, arg4, arg5);
 981#elif defined(TARGET_CLONE_BACKWARDS2)
 982    do_print_clone(arg2, arg1, arg3, arg5, arg4);
 983#else
 984    do_print_clone(arg1, arg2, arg3, arg5, arg4);
 985#endif
 986    print_syscall_epilogue(name);
 987}
 988#endif
 989
 990#ifdef TARGET_NR_creat
 991static void
 992print_creat(const struct syscallname *name,
 993    abi_long arg0, abi_long arg1, abi_long arg2,
 994    abi_long arg3, abi_long arg4, abi_long arg5)
 995{
 996    print_syscall_prologue(name);
 997    print_string(arg0, 0);
 998    print_file_mode(arg1, 1);
 999    print_syscall_epilogue(name);
1000}
1001#endif
1002
1003#ifdef TARGET_NR_execv
1004static void
1005print_execv(const struct syscallname *name,
1006    abi_long arg0, abi_long arg1, abi_long arg2,
1007    abi_long arg3, abi_long arg4, abi_long arg5)
1008{
1009    print_syscall_prologue(name);
1010    print_string(arg0, 0);
1011    print_raw_param("0x" TARGET_ABI_FMT_lx, arg1, 1);
1012    print_syscall_epilogue(name);
1013}
1014#endif
1015
1016#ifdef TARGET_NR_faccessat
1017static void
1018print_faccessat(const struct syscallname *name,
1019    abi_long arg0, abi_long arg1, abi_long arg2,
1020    abi_long arg3, abi_long arg4, abi_long arg5)
1021{
1022    print_syscall_prologue(name);
1023    print_at_dirfd(arg0, 0);
1024    print_string(arg1, 0);
1025    print_flags(access_flags, arg2, 0);
1026    print_flags(at_file_flags, arg3, 1);
1027    print_syscall_epilogue(name);
1028}
1029#endif
1030
1031#ifdef TARGET_NR_fchmodat
1032static void
1033print_fchmodat(const struct syscallname *name,
1034    abi_long arg0, abi_long arg1, abi_long arg2,
1035    abi_long arg3, abi_long arg4, abi_long arg5)
1036{
1037    print_syscall_prologue(name);
1038    print_at_dirfd(arg0, 0);
1039    print_string(arg1, 0);
1040    print_file_mode(arg2, 0);
1041    print_flags(at_file_flags, arg3, 1);
1042    print_syscall_epilogue(name);
1043}
1044#endif
1045
1046#ifdef TARGET_NR_fchownat
1047static void
1048print_fchownat(const struct syscallname *name,
1049    abi_long arg0, abi_long arg1, abi_long arg2,
1050    abi_long arg3, abi_long arg4, abi_long arg5)
1051{
1052    print_syscall_prologue(name);
1053    print_at_dirfd(arg0, 0);
1054    print_string(arg1, 0);
1055    print_raw_param("%d", arg2, 0);
1056    print_raw_param("%d", arg3, 0);
1057    print_flags(at_file_flags, arg4, 1);
1058    print_syscall_epilogue(name);
1059}
1060#endif
1061
1062#if defined(TARGET_NR_fcntl) || defined(TARGET_NR_fcntl64)
1063static void
1064print_fcntl(const struct syscallname *name,
1065    abi_long arg0, abi_long arg1, abi_long arg2,
1066    abi_long arg3, abi_long arg4, abi_long arg5)
1067{
1068    print_syscall_prologue(name);
1069    print_raw_param("%d", arg0, 0);
1070    switch(arg1) {
1071    case TARGET_F_DUPFD:
1072        gemu_log("F_DUPFD,");
1073        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
1074        break;
1075    case TARGET_F_GETFD:
1076        gemu_log("F_GETFD");
1077        break;
1078    case TARGET_F_SETFD:
1079        gemu_log("F_SETFD,");
1080        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
1081        break;
1082    case TARGET_F_GETFL:
1083        gemu_log("F_GETFL");
1084        break;
1085    case TARGET_F_SETFL:
1086        gemu_log("F_SETFL,");
1087        print_open_flags(arg2, 1);
1088        break;
1089    case TARGET_F_GETLK:
1090        gemu_log("F_GETLK,");
1091        print_pointer(arg2, 1);
1092        break;
1093    case TARGET_F_SETLK:
1094        gemu_log("F_SETLK,");
1095        print_pointer(arg2, 1);
1096        break;
1097    case TARGET_F_SETLKW:
1098        gemu_log("F_SETLKW,");
1099        print_pointer(arg2, 1);
1100        break;
1101    case TARGET_F_GETOWN:
1102        gemu_log("F_GETOWN");
1103        break;
1104    case TARGET_F_SETOWN:
1105        gemu_log("F_SETOWN,");
1106        print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
1107        break;
1108    case TARGET_F_GETSIG:
1109        gemu_log("F_GETSIG");
1110        break;
1111    case TARGET_F_SETSIG:
1112        gemu_log("F_SETSIG,");
1113        print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
1114        break;
1115#if TARGET_ABI_BITS == 32
1116    case TARGET_F_GETLK64:
1117        gemu_log("F_GETLK64,");
1118        print_pointer(arg2, 1);
1119        break;
1120    case TARGET_F_SETLK64:
1121        gemu_log("F_SETLK64,");
1122        print_pointer(arg2, 1);
1123        break;
1124    case TARGET_F_SETLKW64:
1125        gemu_log("F_SETLKW64,");
1126        print_pointer(arg2, 1);
1127        break;
1128#endif
1129    case TARGET_F_SETLEASE:
1130        gemu_log("F_SETLEASE,");
1131        print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
1132        break;
1133    case TARGET_F_GETLEASE:
1134        gemu_log("F_GETLEASE");
1135        break;
1136    case TARGET_F_SETPIPE_SZ:
1137        gemu_log("F_SETPIPE_SZ,");
1138        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
1139        break;
1140    case TARGET_F_GETPIPE_SZ:
1141        gemu_log("F_GETPIPE_SZ");
1142        break;
1143    case TARGET_F_DUPFD_CLOEXEC:
1144        gemu_log("F_DUPFD_CLOEXEC,");
1145        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
1146        break;
1147    case TARGET_F_NOTIFY:
1148        gemu_log("F_NOTIFY,");
1149        print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
1150        break;
1151    default:
1152        print_raw_param(TARGET_ABI_FMT_ld, arg1, 0);
1153        print_pointer(arg2, 1);
1154        break;
1155    }
1156    print_syscall_epilogue(name);
1157}
1158#define print_fcntl64   print_fcntl
1159#endif
1160
1161
1162#ifdef TARGET_NR_futimesat
1163static void
1164print_futimesat(const struct syscallname *name,
1165    abi_long arg0, abi_long arg1, abi_long arg2,
1166    abi_long arg3, abi_long arg4, abi_long arg5)
1167{
1168    print_syscall_prologue(name);
1169    print_at_dirfd(arg0, 0);
1170    print_string(arg1, 0);
1171    print_timeval(arg2, 0);
1172    print_timeval(arg2 + sizeof (struct target_timeval), 1);
1173    print_syscall_epilogue(name);
1174}
1175#endif
1176
1177#ifdef TARGET_NR_link
1178static void
1179print_link(const struct syscallname *name,
1180    abi_long arg0, abi_long arg1, abi_long arg2,
1181    abi_long arg3, abi_long arg4, abi_long arg5)
1182{
1183    print_syscall_prologue(name);
1184    print_string(arg0, 0);
1185    print_string(arg1, 1);
1186    print_syscall_epilogue(name);
1187}
1188#endif
1189
1190#ifdef TARGET_NR_linkat
1191static void
1192print_linkat(const struct syscallname *name,
1193    abi_long arg0, abi_long arg1, abi_long arg2,
1194    abi_long arg3, abi_long arg4, abi_long arg5)
1195{
1196    print_syscall_prologue(name);
1197    print_at_dirfd(arg0, 0);
1198    print_string(arg1, 0);
1199    print_at_dirfd(arg2, 0);
1200    print_string(arg3, 0);
1201    print_flags(at_file_flags, arg4, 1);
1202    print_syscall_epilogue(name);
1203}
1204#endif
1205
1206#ifdef TARGET_NR__llseek
1207static void
1208print__llseek(const struct syscallname *name,
1209    abi_long arg0, abi_long arg1, abi_long arg2,
1210    abi_long arg3, abi_long arg4, abi_long arg5)
1211{
1212    const char *whence = "UNKNOWN";
1213    print_syscall_prologue(name);
1214    print_raw_param("%d", arg0, 0);
1215    print_raw_param("%ld", arg1, 0);
1216    print_raw_param("%ld", arg2, 0);
1217    print_pointer(arg3, 0);
1218    switch(arg4) {
1219    case SEEK_SET: whence = "SEEK_SET"; break;
1220    case SEEK_CUR: whence = "SEEK_CUR"; break;
1221    case SEEK_END: whence = "SEEK_END"; break;
1222    }
1223    gemu_log("%s",whence);
1224    print_syscall_epilogue(name);
1225}
1226#endif
1227
1228#if defined(TARGET_NR_socket)
1229static void
1230print_socket(const struct syscallname *name,
1231             abi_long arg0, abi_long arg1, abi_long arg2,
1232             abi_long arg3, abi_long arg4, abi_long arg5)
1233{
1234    abi_ulong domain = arg0, type = arg1, protocol = arg2;
1235
1236    print_syscall_prologue(name);
1237    print_socket_domain(domain);
1238    gemu_log(",");
1239    print_socket_type(type);
1240    gemu_log(",");
1241    if (domain == AF_PACKET ||
1242        (domain == AF_INET && type == TARGET_SOCK_PACKET)) {
1243        protocol = tswap16(protocol);
1244    }
1245    print_socket_protocol(domain, type, protocol);
1246    print_syscall_epilogue(name);
1247}
1248
1249#endif
1250
1251#if defined(TARGET_NR_socketcall)
1252
1253#define get_user_ualx(x, gaddr, idx) \
1254        get_user_ual(x, (gaddr) + (idx) * sizeof(abi_long))
1255
1256static void do_print_socket(const char *name, abi_long arg1)
1257{
1258    abi_ulong domain, type, protocol;
1259
1260    get_user_ualx(domain, arg1, 0);
1261    get_user_ualx(type, arg1, 1);
1262    get_user_ualx(protocol, arg1, 2);
1263    gemu_log("%s(", name);
1264    print_socket_domain(domain);
1265    gemu_log(",");
1266    print_socket_type(type);
1267    gemu_log(",");
1268    if (domain == AF_PACKET ||
1269        (domain == AF_INET && type == TARGET_SOCK_PACKET)) {
1270        protocol = tswap16(protocol);
1271    }
1272    print_socket_protocol(domain, type, protocol);
1273    gemu_log(")");
1274}
1275
1276static void do_print_sockaddr(const char *name, abi_long arg1)
1277{
1278    abi_ulong sockfd, addr, addrlen;
1279
1280    get_user_ualx(sockfd, arg1, 0);
1281    get_user_ualx(addr, arg1, 1);
1282    get_user_ualx(addrlen, arg1, 2);
1283
1284    gemu_log("%s(", name);
1285    print_raw_param(TARGET_ABI_FMT_ld, sockfd, 0);
1286    print_sockaddr(addr, addrlen);
1287    gemu_log(")");
1288}
1289
1290static void do_print_listen(const char *name, abi_long arg1)
1291{
1292    abi_ulong sockfd, backlog;
1293
1294    get_user_ualx(sockfd, arg1, 0);
1295    get_user_ualx(backlog, arg1, 1);
1296
1297    gemu_log("%s(", name);
1298    print_raw_param(TARGET_ABI_FMT_ld, sockfd, 0);
1299    print_raw_param(TARGET_ABI_FMT_ld, backlog, 1);
1300    gemu_log(")");
1301}
1302
1303static void do_print_socketpair(const char *name, abi_long arg1)
1304{
1305    abi_ulong domain, type, protocol, tab;
1306
1307    get_user_ualx(domain, arg1, 0);
1308    get_user_ualx(type, arg1, 1);
1309    get_user_ualx(protocol, arg1, 2);
1310    get_user_ualx(tab, arg1, 3);
1311
1312    gemu_log("%s(", name);
1313    print_socket_domain(domain);
1314    gemu_log(",");
1315    print_socket_type(type);
1316    gemu_log(",");
1317    print_socket_protocol(domain, type, protocol);
1318    gemu_log(",");
1319    print_raw_param(TARGET_ABI_FMT_lx, tab, 1);
1320    gemu_log(")");
1321}
1322
1323static void do_print_sendrecv(const char *name, abi_long arg1)
1324{
1325    abi_ulong sockfd, msg, len, flags;
1326
1327    get_user_ualx(sockfd, arg1, 0);
1328    get_user_ualx(msg, arg1, 1);
1329    get_user_ualx(len, arg1, 2);
1330    get_user_ualx(flags, arg1, 3);
1331
1332    gemu_log("%s(", name);
1333    print_raw_param(TARGET_ABI_FMT_ld, sockfd, 0);
1334    print_buf(msg, len, 0);
1335    print_raw_param(TARGET_ABI_FMT_ld, len, 0);
1336    print_flags(msg_flags, flags, 1);
1337    gemu_log(")");
1338}
1339
1340static void do_print_msgaddr(const char *name, abi_long arg1)
1341{
1342    abi_ulong sockfd, msg, len, flags, addr, addrlen;
1343
1344    get_user_ualx(sockfd, arg1, 0);
1345    get_user_ualx(msg, arg1, 1);
1346    get_user_ualx(len, arg1, 2);
1347    get_user_ualx(flags, arg1, 3);
1348    get_user_ualx(addr, arg1, 4);
1349    get_user_ualx(addrlen, arg1, 5);
1350
1351    gemu_log("%s(", name);
1352    print_raw_param(TARGET_ABI_FMT_ld, sockfd, 0);
1353    print_buf(msg, len, 0);
1354    print_raw_param(TARGET_ABI_FMT_ld, len, 0);
1355    print_flags(msg_flags, flags, 0);
1356    print_sockaddr(addr, addrlen);
1357    gemu_log(")");
1358}
1359
1360static void do_print_shutdown(const char *name, abi_long arg1)
1361{
1362    abi_ulong sockfd, how;
1363
1364    get_user_ualx(sockfd, arg1, 0);
1365    get_user_ualx(how, arg1, 1);
1366
1367    gemu_log("shutdown(");
1368    print_raw_param(TARGET_ABI_FMT_ld, sockfd, 0);
1369    switch (how) {
1370    case SHUT_RD:
1371        gemu_log("SHUT_RD");
1372        break;
1373    case SHUT_WR:
1374        gemu_log("SHUT_WR");
1375        break;
1376    case SHUT_RDWR:
1377        gemu_log("SHUT_RDWR");
1378        break;
1379    default:
1380        print_raw_param(TARGET_ABI_FMT_ld, how, 1);
1381        break;
1382    }
1383    gemu_log(")");
1384}
1385
1386static void do_print_msg(const char *name, abi_long arg1)
1387{
1388    abi_ulong sockfd, msg, flags;
1389
1390    get_user_ualx(sockfd, arg1, 0);
1391    get_user_ualx(msg, arg1, 1);
1392    get_user_ualx(flags, arg1, 2);
1393
1394    gemu_log("%s(", name);
1395    print_raw_param(TARGET_ABI_FMT_ld, sockfd, 0);
1396    print_pointer(msg, 0);
1397    print_flags(msg_flags, flags, 1);
1398    gemu_log(")");
1399}
1400
1401static void do_print_sockopt(const char *name, abi_long arg1)
1402{
1403    abi_ulong sockfd, level, optname, optval, optlen;
1404
1405    get_user_ualx(sockfd, arg1, 0);
1406    get_user_ualx(level, arg1, 1);
1407    get_user_ualx(optname, arg1, 2);
1408    get_user_ualx(optval, arg1, 3);
1409    get_user_ualx(optlen, arg1, 4);
1410
1411    gemu_log("%s(", name);
1412    print_raw_param(TARGET_ABI_FMT_ld, sockfd, 0);
1413    switch (level) {
1414    case SOL_TCP:
1415        gemu_log("SOL_TCP,");
1416        print_raw_param(TARGET_ABI_FMT_ld, optname, 0);
1417        print_pointer(optval, 0);
1418        break;
1419    case SOL_IP:
1420        gemu_log("SOL_IP,");
1421        print_raw_param(TARGET_ABI_FMT_ld, optname, 0);
1422        print_pointer(optval, 0);
1423        break;
1424    case SOL_RAW:
1425        gemu_log("SOL_RAW,");
1426        print_raw_param(TARGET_ABI_FMT_ld, optname, 0);
1427        print_pointer(optval, 0);
1428        break;
1429    case TARGET_SOL_SOCKET:
1430        gemu_log("SOL_SOCKET,");
1431        switch (optname) {
1432        case TARGET_SO_DEBUG:
1433            gemu_log("SO_DEBUG,");
1434print_optint:
1435            print_number(optval, 0);
1436            break;
1437        case TARGET_SO_REUSEADDR:
1438            gemu_log("SO_REUSEADDR,");
1439            goto print_optint;
1440        case TARGET_SO_TYPE:
1441            gemu_log("SO_TYPE,");
1442            goto print_optint;
1443        case TARGET_SO_ERROR:
1444            gemu_log("SO_ERROR,");
1445            goto print_optint;
1446        case TARGET_SO_DONTROUTE:
1447            gemu_log("SO_DONTROUTE,");
1448            goto print_optint;
1449        case TARGET_SO_BROADCAST:
1450            gemu_log("SO_BROADCAST,");
1451            goto print_optint;
1452        case TARGET_SO_SNDBUF:
1453            gemu_log("SO_SNDBUF,");
1454            goto print_optint;
1455        case TARGET_SO_RCVBUF:
1456            gemu_log("SO_RCVBUF,");
1457            goto print_optint;
1458        case TARGET_SO_KEEPALIVE:
1459            gemu_log("SO_KEEPALIVE,");
1460            goto print_optint;
1461        case TARGET_SO_OOBINLINE:
1462            gemu_log("SO_OOBINLINE,");
1463            goto print_optint;
1464        case TARGET_SO_NO_CHECK:
1465            gemu_log("SO_NO_CHECK,");
1466            goto print_optint;
1467        case TARGET_SO_PRIORITY:
1468            gemu_log("SO_PRIORITY,");
1469            goto print_optint;
1470        case TARGET_SO_BSDCOMPAT:
1471            gemu_log("SO_BSDCOMPAT,");
1472            goto print_optint;
1473        case TARGET_SO_PASSCRED:
1474            gemu_log("SO_PASSCRED,");
1475            goto print_optint;
1476        case TARGET_SO_TIMESTAMP:
1477            gemu_log("SO_TIMESTAMP,");
1478            goto print_optint;
1479        case TARGET_SO_RCVLOWAT:
1480            gemu_log("SO_RCVLOWAT,");
1481            goto print_optint;
1482        case TARGET_SO_RCVTIMEO:
1483            gemu_log("SO_RCVTIMEO,");
1484            print_timeval(optval, 0);
1485            break;
1486        case TARGET_SO_SNDTIMEO:
1487            gemu_log("SO_SNDTIMEO,");
1488            print_timeval(optval, 0);
1489            break;
1490        case TARGET_SO_ATTACH_FILTER: {
1491            struct target_sock_fprog *fprog;
1492
1493            gemu_log("SO_ATTACH_FILTER,");
1494
1495            if (lock_user_struct(VERIFY_READ, fprog, optval,  0)) {
1496                struct target_sock_filter *filter;
1497                gemu_log("{");
1498                if (lock_user_struct(VERIFY_READ, filter,
1499                                     tswapal(fprog->filter),  0)) {
1500                    int i;
1501                    for (i = 0; i < tswap16(fprog->len) - 1; i++) {
1502                        gemu_log("[%d]{0x%x,%d,%d,0x%x},",
1503                                 i, tswap16(filter[i].code),
1504                                 filter[i].jt, filter[i].jf,
1505                                 tswap32(filter[i].k));
1506                    }
1507                    gemu_log("[%d]{0x%x,%d,%d,0x%x}",
1508                             i, tswap16(filter[i].code),
1509                             filter[i].jt, filter[i].jf,
1510                             tswap32(filter[i].k));
1511                } else {
1512                    gemu_log(TARGET_ABI_FMT_lx, tswapal(fprog->filter));
1513                }
1514                gemu_log(",%d},", tswap16(fprog->len));
1515                unlock_user(fprog, optval, 0);
1516            } else {
1517                print_pointer(optval, 0);
1518            }
1519            break;
1520        }
1521        default:
1522            print_raw_param(TARGET_ABI_FMT_ld, optname, 0);
1523            print_pointer(optval, 0);
1524            break;
1525        }
1526        break;
1527    default:
1528        print_raw_param(TARGET_ABI_FMT_ld, level, 0);
1529        print_raw_param(TARGET_ABI_FMT_ld, optname, 0);
1530        print_pointer(optval, 0);
1531        break;
1532    }
1533    print_raw_param(TARGET_ABI_FMT_ld, optlen, 1);
1534    gemu_log(")");
1535}
1536
1537#define PRINT_SOCKOP(name, func) \
1538    [SOCKOP_##name] = { #name, func }
1539
1540static struct {
1541    const char *name;
1542    void (*print)(const char *, abi_long);
1543} scall[] = {
1544    PRINT_SOCKOP(socket, do_print_socket),
1545    PRINT_SOCKOP(bind, do_print_sockaddr),
1546    PRINT_SOCKOP(connect, do_print_sockaddr),
1547    PRINT_SOCKOP(listen, do_print_listen),
1548    PRINT_SOCKOP(accept, do_print_sockaddr),
1549    PRINT_SOCKOP(getsockname, do_print_sockaddr),
1550    PRINT_SOCKOP(getpeername, do_print_sockaddr),
1551    PRINT_SOCKOP(socketpair, do_print_socketpair),
1552    PRINT_SOCKOP(send, do_print_sendrecv),
1553    PRINT_SOCKOP(recv, do_print_sendrecv),
1554    PRINT_SOCKOP(sendto, do_print_msgaddr),
1555    PRINT_SOCKOP(recvfrom, do_print_msgaddr),
1556    PRINT_SOCKOP(shutdown, do_print_shutdown),
1557    PRINT_SOCKOP(sendmsg, do_print_msg),
1558    PRINT_SOCKOP(recvmsg, do_print_msg),
1559    PRINT_SOCKOP(setsockopt, do_print_sockopt),
1560    PRINT_SOCKOP(getsockopt, do_print_sockopt),
1561};
1562
1563static void
1564print_socketcall(const struct syscallname *name,
1565                 abi_long arg0, abi_long arg1, abi_long arg2,
1566                 abi_long arg3, abi_long arg4, abi_long arg5)
1567{
1568    if (arg0 >= 0 && arg0 < ARRAY_SIZE(scall) && scall[arg0].print) {
1569        scall[arg0].print(scall[arg0].name, arg1);
1570        return;
1571    }
1572    print_syscall_prologue(name);
1573    print_raw_param(TARGET_ABI_FMT_ld, arg0, 0);
1574    print_raw_param(TARGET_ABI_FMT_ld, arg1, 0);
1575    print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
1576    print_raw_param(TARGET_ABI_FMT_ld, arg3, 0);
1577    print_raw_param(TARGET_ABI_FMT_ld, arg4, 0);
1578    print_raw_param(TARGET_ABI_FMT_ld, arg5, 0);
1579    print_syscall_epilogue(name);
1580}
1581#endif
1582
1583#if defined(TARGET_NR_stat) || defined(TARGET_NR_stat64) || \
1584    defined(TARGET_NR_lstat) || defined(TARGET_NR_lstat64)
1585static void
1586print_stat(const struct syscallname *name,
1587    abi_long arg0, abi_long arg1, abi_long arg2,
1588    abi_long arg3, abi_long arg4, abi_long arg5)
1589{
1590    print_syscall_prologue(name);
1591    print_string(arg0, 0);
1592    print_pointer(arg1, 1);
1593    print_syscall_epilogue(name);
1594}
1595#define print_lstat     print_stat
1596#define print_stat64    print_stat
1597#define print_lstat64   print_stat
1598#endif
1599
1600#if defined(TARGET_NR_fstat) || defined(TARGET_NR_fstat64)
1601static void
1602print_fstat(const struct syscallname *name,
1603    abi_long arg0, abi_long arg1, abi_long arg2,
1604    abi_long arg3, abi_long arg4, abi_long arg5)
1605{
1606    print_syscall_prologue(name);
1607    print_raw_param("%d", arg0, 0);
1608    print_pointer(arg1, 1);
1609    print_syscall_epilogue(name);
1610}
1611#define print_fstat64     print_fstat
1612#endif
1613
1614#ifdef TARGET_NR_mkdir
1615static void
1616print_mkdir(const struct syscallname *name,
1617    abi_long arg0, abi_long arg1, abi_long arg2,
1618    abi_long arg3, abi_long arg4, abi_long arg5)
1619{
1620    print_syscall_prologue(name);
1621    print_string(arg0, 0);
1622    print_file_mode(arg1, 1);
1623    print_syscall_epilogue(name);
1624}
1625#endif
1626
1627#ifdef TARGET_NR_mkdirat
1628static void
1629print_mkdirat(const struct syscallname *name,
1630    abi_long arg0, abi_long arg1, abi_long arg2,
1631    abi_long arg3, abi_long arg4, abi_long arg5)
1632{
1633    print_syscall_prologue(name);
1634    print_at_dirfd(arg0, 0);
1635    print_string(arg1, 0);
1636    print_file_mode(arg2, 1);
1637    print_syscall_epilogue(name);
1638}
1639#endif
1640
1641#ifdef TARGET_NR_rmdir
1642static void
1643print_rmdir(const struct syscallname *name,
1644    abi_long arg0, abi_long arg1, abi_long arg2,
1645    abi_long arg3, abi_long arg4, abi_long arg5)
1646{
1647    print_syscall_prologue(name);
1648    print_string(arg0, 0);
1649    print_syscall_epilogue(name);
1650}
1651#endif
1652
1653#ifdef TARGET_NR_rt_sigaction
1654static void
1655print_rt_sigaction(const struct syscallname *name,
1656    abi_long arg0, abi_long arg1, abi_long arg2,
1657    abi_long arg3, abi_long arg4, abi_long arg5)
1658{
1659    print_syscall_prologue(name);
1660    print_signal(arg0, 0);
1661    print_pointer(arg1, 0);
1662    print_pointer(arg2, 1);
1663    print_syscall_epilogue(name);
1664}
1665#endif
1666
1667#ifdef TARGET_NR_rt_sigprocmask
1668static void
1669print_rt_sigprocmask(const struct syscallname *name,
1670    abi_long arg0, abi_long arg1, abi_long arg2,
1671    abi_long arg3, abi_long arg4, abi_long arg5)
1672{
1673    const char *how = "UNKNOWN";
1674    print_syscall_prologue(name);
1675    switch(arg0) {
1676    case TARGET_SIG_BLOCK: how = "SIG_BLOCK"; break;
1677    case TARGET_SIG_UNBLOCK: how = "SIG_UNBLOCK"; break;
1678    case TARGET_SIG_SETMASK: how = "SIG_SETMASK"; break;
1679    }
1680    gemu_log("%s,",how);
1681    print_pointer(arg1, 0);
1682    print_pointer(arg2, 1);
1683    print_syscall_epilogue(name);
1684}
1685#endif
1686
1687#ifdef TARGET_NR_mknod
1688static void
1689print_mknod(const struct syscallname *name,
1690    abi_long arg0, abi_long arg1, abi_long arg2,
1691    abi_long arg3, abi_long arg4, abi_long arg5)
1692{
1693    int hasdev = (arg1 & (S_IFCHR|S_IFBLK));
1694
1695    print_syscall_prologue(name);
1696    print_string(arg0, 0);
1697    print_file_mode(arg1, (hasdev == 0));
1698    if (hasdev) {
1699        print_raw_param("makedev(%d", major(arg2), 0);
1700        print_raw_param("%d)", minor(arg2), 1);
1701    }
1702    print_syscall_epilogue(name);
1703}
1704#endif
1705
1706#ifdef TARGET_NR_mknodat
1707static void
1708print_mknodat(const struct syscallname *name,
1709    abi_long arg0, abi_long arg1, abi_long arg2,
1710    abi_long arg3, abi_long arg4, abi_long arg5)
1711{
1712    int hasdev = (arg2 & (S_IFCHR|S_IFBLK));
1713
1714    print_syscall_prologue(name);
1715    print_at_dirfd(arg0, 0);
1716    print_string(arg1, 0);
1717    print_file_mode(arg2, (hasdev == 0));
1718    if (hasdev) {
1719        print_raw_param("makedev(%d", major(arg3), 0);
1720        print_raw_param("%d)", minor(arg3), 1);
1721    }
1722    print_syscall_epilogue(name);
1723}
1724#endif
1725
1726#ifdef TARGET_NR_mq_open
1727static void
1728print_mq_open(const struct syscallname *name,
1729    abi_long arg0, abi_long arg1, abi_long arg2,
1730    abi_long arg3, abi_long arg4, abi_long arg5)
1731{
1732    int is_creat = (arg1 & TARGET_O_CREAT);
1733
1734    print_syscall_prologue(name);
1735    print_string(arg0, 0);
1736    print_open_flags(arg1, (is_creat == 0));
1737    if (is_creat) {
1738        print_file_mode(arg2, 0);
1739        print_pointer(arg3, 1);
1740    }
1741    print_syscall_epilogue(name);
1742}
1743#endif
1744
1745#ifdef TARGET_NR_open
1746static void
1747print_open(const struct syscallname *name,
1748    abi_long arg0, abi_long arg1, abi_long arg2,
1749    abi_long arg3, abi_long arg4, abi_long arg5)
1750{
1751    int is_creat = (arg1 & TARGET_O_CREAT);
1752
1753    print_syscall_prologue(name);
1754    print_string(arg0, 0);
1755    print_open_flags(arg1, (is_creat == 0));
1756    if (is_creat)
1757        print_file_mode(arg2, 1);
1758    print_syscall_epilogue(name);
1759}
1760#endif
1761
1762#ifdef TARGET_NR_openat
1763static void
1764print_openat(const struct syscallname *name,
1765    abi_long arg0, abi_long arg1, abi_long arg2,
1766    abi_long arg3, abi_long arg4, abi_long arg5)
1767{
1768    int is_creat = (arg2 & TARGET_O_CREAT);
1769
1770    print_syscall_prologue(name);
1771    print_at_dirfd(arg0, 0);
1772    print_string(arg1, 0);
1773    print_open_flags(arg2, (is_creat == 0));
1774    if (is_creat)
1775        print_file_mode(arg3, 1);
1776    print_syscall_epilogue(name);
1777}
1778#endif
1779
1780#ifdef TARGET_NR_mq_unlink
1781static void
1782print_mq_unlink(const struct syscallname *name,
1783    abi_long arg0, abi_long arg1, abi_long arg2,
1784    abi_long arg3, abi_long arg4, abi_long arg5)
1785{
1786    print_syscall_prologue(name);
1787    print_string(arg0, 1);
1788    print_syscall_epilogue(name);
1789}
1790#endif
1791
1792#if defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat)
1793static void
1794print_fstatat64(const struct syscallname *name,
1795    abi_long arg0, abi_long arg1, abi_long arg2,
1796    abi_long arg3, abi_long arg4, abi_long arg5)
1797{
1798    print_syscall_prologue(name);
1799    print_at_dirfd(arg0, 0);
1800    print_string(arg1, 0);
1801    print_pointer(arg2, 0);
1802    print_flags(at_file_flags, arg3, 1);
1803    print_syscall_epilogue(name);
1804}
1805#define print_newfstatat    print_fstatat64
1806#endif
1807
1808#ifdef TARGET_NR_readlink
1809static void
1810print_readlink(const struct syscallname *name,
1811    abi_long arg0, abi_long arg1, abi_long arg2,
1812    abi_long arg3, abi_long arg4, abi_long arg5)
1813{
1814    print_syscall_prologue(name);
1815    print_string(arg0, 0);
1816    print_pointer(arg1, 0);
1817    print_raw_param("%u", arg2, 1);
1818    print_syscall_epilogue(name);
1819}
1820#endif
1821
1822#ifdef TARGET_NR_readlinkat
1823static void
1824print_readlinkat(const struct syscallname *name,
1825    abi_long arg0, abi_long arg1, abi_long arg2,
1826    abi_long arg3, abi_long arg4, abi_long arg5)
1827{
1828    print_syscall_prologue(name);
1829    print_at_dirfd(arg0, 0);
1830    print_string(arg1, 0);
1831    print_pointer(arg2, 0);
1832    print_raw_param("%u", arg3, 1);
1833    print_syscall_epilogue(name);
1834}
1835#endif
1836
1837#ifdef TARGET_NR_rename
1838static void
1839print_rename(const struct syscallname *name,
1840    abi_long arg0, abi_long arg1, abi_long arg2,
1841    abi_long arg3, abi_long arg4, abi_long arg5)
1842{
1843    print_syscall_prologue(name);
1844    print_string(arg0, 0);
1845    print_string(arg1, 1);
1846    print_syscall_epilogue(name);
1847}
1848#endif
1849
1850#ifdef TARGET_NR_renameat
1851static void
1852print_renameat(const struct syscallname *name,
1853    abi_long arg0, abi_long arg1, abi_long arg2,
1854    abi_long arg3, abi_long arg4, abi_long arg5)
1855{
1856    print_syscall_prologue(name);
1857    print_at_dirfd(arg0, 0);
1858    print_string(arg1, 0);
1859    print_at_dirfd(arg2, 0);
1860    print_string(arg3, 1);
1861    print_syscall_epilogue(name);
1862}
1863#endif
1864
1865#ifdef TARGET_NR_statfs
1866static void
1867print_statfs(const struct syscallname *name,
1868    abi_long arg0, abi_long arg1, abi_long arg2,
1869    abi_long arg3, abi_long arg4, abi_long arg5)
1870{
1871    print_syscall_prologue(name);
1872    print_string(arg0, 0);
1873    print_pointer(arg1, 1);
1874    print_syscall_epilogue(name);
1875}
1876#define print_statfs64  print_statfs
1877#endif
1878
1879#ifdef TARGET_NR_symlink
1880static void
1881print_symlink(const struct syscallname *name,
1882    abi_long arg0, abi_long arg1, abi_long arg2,
1883    abi_long arg3, abi_long arg4, abi_long arg5)
1884{
1885    print_syscall_prologue(name);
1886    print_string(arg0, 0);
1887    print_string(arg1, 1);
1888    print_syscall_epilogue(name);
1889}
1890#endif
1891
1892#ifdef TARGET_NR_symlinkat
1893static void
1894print_symlinkat(const struct syscallname *name,
1895    abi_long arg0, abi_long arg1, abi_long arg2,
1896    abi_long arg3, abi_long arg4, abi_long arg5)
1897{
1898    print_syscall_prologue(name);
1899    print_string(arg0, 0);
1900    print_at_dirfd(arg1, 0);
1901    print_string(arg2, 1);
1902    print_syscall_epilogue(name);
1903}
1904#endif
1905
1906#ifdef TARGET_NR_mount
1907static void
1908print_mount(const struct syscallname *name,
1909    abi_long arg0, abi_long arg1, abi_long arg2,
1910    abi_long arg3, abi_long arg4, abi_long arg5)
1911{
1912    print_syscall_prologue(name);
1913    print_string(arg0, 0);
1914    print_string(arg1, 0);
1915    print_string(arg2, 0);
1916    print_flags(mount_flags, arg3, 0);
1917    print_pointer(arg4, 1);
1918    print_syscall_epilogue(name);
1919}
1920#endif
1921
1922#ifdef TARGET_NR_umount
1923static void
1924print_umount(const struct syscallname *name,
1925    abi_long arg0, abi_long arg1, abi_long arg2,
1926    abi_long arg3, abi_long arg4, abi_long arg5)
1927{
1928    print_syscall_prologue(name);
1929    print_string(arg0, 1);
1930    print_syscall_epilogue(name);
1931}
1932#endif
1933
1934#ifdef TARGET_NR_umount2
1935static void
1936print_umount2(const struct syscallname *name,
1937    abi_long arg0, abi_long arg1, abi_long arg2,
1938    abi_long arg3, abi_long arg4, abi_long arg5)
1939{
1940    print_syscall_prologue(name);
1941    print_string(arg0, 0);
1942    print_flags(umount2_flags, arg1, 1);
1943    print_syscall_epilogue(name);
1944}
1945#endif
1946
1947#ifdef TARGET_NR_unlink
1948static void
1949print_unlink(const struct syscallname *name,
1950    abi_long arg0, abi_long arg1, abi_long arg2,
1951    abi_long arg3, abi_long arg4, abi_long arg5)
1952{
1953    print_syscall_prologue(name);
1954    print_string(arg0, 1);
1955    print_syscall_epilogue(name);
1956}
1957#endif
1958
1959#ifdef TARGET_NR_unlinkat
1960static void
1961print_unlinkat(const struct syscallname *name,
1962    abi_long arg0, abi_long arg1, abi_long arg2,
1963    abi_long arg3, abi_long arg4, abi_long arg5)
1964{
1965    print_syscall_prologue(name);
1966    print_at_dirfd(arg0, 0);
1967    print_string(arg1, 0);
1968    print_flags(unlinkat_flags, arg2, 1);
1969    print_syscall_epilogue(name);
1970}
1971#endif
1972
1973#ifdef TARGET_NR_utime
1974static void
1975print_utime(const struct syscallname *name,
1976    abi_long arg0, abi_long arg1, abi_long arg2,
1977    abi_long arg3, abi_long arg4, abi_long arg5)
1978{
1979    print_syscall_prologue(name);
1980    print_string(arg0, 0);
1981    print_pointer(arg1, 1);
1982    print_syscall_epilogue(name);
1983}
1984#endif
1985
1986#ifdef TARGET_NR_utimes
1987static void
1988print_utimes(const struct syscallname *name,
1989    abi_long arg0, abi_long arg1, abi_long arg2,
1990    abi_long arg3, abi_long arg4, abi_long arg5)
1991{
1992    print_syscall_prologue(name);
1993    print_string(arg0, 0);
1994    print_pointer(arg1, 1);
1995    print_syscall_epilogue(name);
1996}
1997#endif
1998
1999#ifdef TARGET_NR_utimensat
2000static void
2001print_utimensat(const struct syscallname *name,
2002    abi_long arg0, abi_long arg1, abi_long arg2,
2003    abi_long arg3, abi_long arg4, abi_long arg5)
2004{
2005    print_syscall_prologue(name);
2006    print_at_dirfd(arg0, 0);
2007    print_string(arg1, 0);
2008    print_pointer(arg2, 0);
2009    print_flags(at_file_flags, arg3, 1);
2010    print_syscall_epilogue(name);
2011}
2012#endif
2013
2014#if defined(TARGET_NR_mmap) || defined(TARGET_NR_mmap2)
2015static void
2016print_mmap(const struct syscallname *name,
2017    abi_long arg0, abi_long arg1, abi_long arg2,
2018    abi_long arg3, abi_long arg4, abi_long arg5)
2019{
2020    print_syscall_prologue(name);
2021    print_pointer(arg0, 0);
2022    print_raw_param("%d", arg1, 0);
2023    print_flags(mmap_prot_flags, arg2, 0);
2024    print_flags(mmap_flags, arg3, 0);
2025    print_raw_param("%d", arg4, 0);
2026    print_raw_param("%#x", arg5, 1);
2027    print_syscall_epilogue(name);
2028}
2029#define print_mmap2     print_mmap
2030#endif
2031
2032#ifdef TARGET_NR_mprotect
2033static void
2034print_mprotect(const struct syscallname *name,
2035    abi_long arg0, abi_long arg1, abi_long arg2,
2036    abi_long arg3, abi_long arg4, abi_long arg5)
2037{
2038    print_syscall_prologue(name);
2039    print_pointer(arg0, 0);
2040    print_raw_param("%d", arg1, 0);
2041    print_flags(mmap_prot_flags, arg2, 1);
2042    print_syscall_epilogue(name);
2043}
2044#endif
2045
2046#ifdef TARGET_NR_munmap
2047static void
2048print_munmap(const struct syscallname *name,
2049    abi_long arg0, abi_long arg1, abi_long arg2,
2050    abi_long arg3, abi_long arg4, abi_long arg5)
2051{
2052    print_syscall_prologue(name);
2053    print_pointer(arg0, 0);
2054    print_raw_param("%d", arg1, 1);
2055    print_syscall_epilogue(name);
2056}
2057#endif
2058
2059#ifdef TARGET_NR_futex
2060static void print_futex_op(abi_long tflag, int last)
2061{
2062#define print_op(val) \
2063if( cmd == val ) { \
2064    gemu_log(#val); \
2065    return; \
2066}
2067
2068    int cmd = (int)tflag;
2069#ifdef FUTEX_PRIVATE_FLAG
2070    if (cmd & FUTEX_PRIVATE_FLAG) {
2071        gemu_log("FUTEX_PRIVATE_FLAG|");
2072        cmd &= ~FUTEX_PRIVATE_FLAG;
2073    }
2074#endif
2075#ifdef FUTEX_CLOCK_REALTIME
2076    if (cmd & FUTEX_CLOCK_REALTIME) {
2077        gemu_log("FUTEX_CLOCK_REALTIME|");
2078        cmd &= ~FUTEX_CLOCK_REALTIME;
2079    }
2080#endif
2081    print_op(FUTEX_WAIT)
2082    print_op(FUTEX_WAKE)
2083    print_op(FUTEX_FD)
2084    print_op(FUTEX_REQUEUE)
2085    print_op(FUTEX_CMP_REQUEUE)
2086    print_op(FUTEX_WAKE_OP)
2087    print_op(FUTEX_LOCK_PI)
2088    print_op(FUTEX_UNLOCK_PI)
2089    print_op(FUTEX_TRYLOCK_PI)
2090#ifdef FUTEX_WAIT_BITSET
2091    print_op(FUTEX_WAIT_BITSET)
2092#endif
2093#ifdef FUTEX_WAKE_BITSET
2094    print_op(FUTEX_WAKE_BITSET)
2095#endif
2096    /* unknown values */
2097    gemu_log("%d",cmd);
2098}
2099
2100static void
2101print_futex(const struct syscallname *name,
2102    abi_long arg0, abi_long arg1, abi_long arg2,
2103    abi_long arg3, abi_long arg4, abi_long arg5)
2104{
2105    print_syscall_prologue(name);
2106    print_pointer(arg0, 0);
2107    print_futex_op(arg1, 0);
2108    print_raw_param(",%d", arg2, 0);
2109    print_pointer(arg3, 0); /* struct timespec */
2110    print_pointer(arg4, 0);
2111    print_raw_param("%d", arg4, 1);
2112    print_syscall_epilogue(name);
2113}
2114#endif
2115
2116#ifdef TARGET_NR_kill
2117static void
2118print_kill(const struct syscallname *name,
2119    abi_long arg0, abi_long arg1, abi_long arg2,
2120    abi_long arg3, abi_long arg4, abi_long arg5)
2121{
2122    print_syscall_prologue(name);
2123    print_raw_param("%d", arg0, 0);
2124    print_signal(arg1, 1);
2125    print_syscall_epilogue(name);
2126}
2127#endif
2128
2129/*
2130 * An array of all of the syscalls we know about
2131 */
2132
2133static const struct syscallname scnames[] = {
2134#include "strace.list"
2135};
2136
2137static int nsyscalls = ARRAY_SIZE(scnames);
2138
2139/*
2140 * The public interface to this module.
2141 */
2142void
2143print_syscall(int num,
2144              abi_long arg1, abi_long arg2, abi_long arg3,
2145              abi_long arg4, abi_long arg5, abi_long arg6)
2146{
2147    int i;
2148    const char *format="%s(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ")";
2149
2150    gemu_log("%d ", getpid() );
2151
2152    for(i=0;i<nsyscalls;i++)
2153        if( scnames[i].nr == num ) {
2154            if( scnames[i].call != NULL ) {
2155                scnames[i].call(&scnames[i],arg1,arg2,arg3,arg4,arg5,arg6);
2156            } else {
2157                /* XXX: this format system is broken because it uses
2158                   host types and host pointers for strings */
2159                if( scnames[i].format != NULL )
2160                    format = scnames[i].format;
2161                gemu_log(format,scnames[i].name, arg1,arg2,arg3,arg4,arg5,arg6);
2162            }
2163            return;
2164        }
2165    gemu_log("Unknown syscall %d\n", num);
2166}
2167
2168
2169void
2170print_syscall_ret(int num, abi_long ret)
2171{
2172    int i;
2173    const char *errstr = NULL;
2174
2175    for(i=0;i<nsyscalls;i++)
2176        if( scnames[i].nr == num ) {
2177            if( scnames[i].result != NULL ) {
2178                scnames[i].result(&scnames[i],ret);
2179            } else {
2180                if (ret < 0) {
2181                    errstr = target_strerror(-ret);
2182                }
2183                if (errstr) {
2184                    gemu_log(" = -1 errno=" TARGET_ABI_FMT_ld " (%s)\n",
2185                             -ret, errstr);
2186                } else {
2187                    gemu_log(" = " TARGET_ABI_FMT_ld "\n", ret);
2188                }
2189            }
2190            break;
2191        }
2192}
2193