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/in.h>
  10#include <netinet/tcp.h>
  11#include <netinet/udp.h>
  12#include <linux/if_packet.h>
  13#include <linux/in6.h>
  14#include <linux/netlink.h>
  15#include <sched.h>
  16#include "qemu.h"
  17
  18struct syscallname {
  19    int nr;
  20    const char *name;
  21    const char *format;
  22    void (*call)(void *, const struct syscallname *,
  23                 abi_long, abi_long, abi_long,
  24                 abi_long, abi_long, abi_long);
  25    void (*result)(void *, const struct syscallname *, abi_long,
  26                   abi_long, abi_long, abi_long,
  27                   abi_long, abi_long, abi_long);
  28};
  29
  30/*
  31 * It is possible that target doesn't have syscall that uses
  32 * following flags but we don't want the compiler to warn
  33 * us about them being unused.  Same applies to utility print
  34 * functions.  It is ok to keep them while not used.
  35 */
  36#define UNUSED __attribute__ ((unused))
  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
  54/* Structure used to translate enumerated values into strings */
  55struct enums {
  56    abi_long    e_value;   /* enum value */
  57    const char  *e_string; /* stringified enum */
  58};
  59
  60/* common enums for all architectures */
  61#define ENUM_GENERIC(name) { name, #name }
  62/* target specific enums */
  63#define ENUM_TARGET(name)  { TARGET_ ## name, #name }
  64/* end of enums array */
  65#define ENUM_END           { 0, NULL }
  66
  67UNUSED static const char *get_comma(int);
  68UNUSED static void print_pointer(abi_long, int);
  69UNUSED static void print_flags(const struct flags *, abi_long, int);
  70UNUSED static void print_enums(const struct enums *, abi_long, int);
  71UNUSED static void print_at_dirfd(abi_long, int);
  72UNUSED static void print_file_mode(abi_long, int);
  73UNUSED static void print_open_flags(abi_long, int);
  74UNUSED static void print_syscall_prologue(const struct syscallname *);
  75UNUSED static void print_syscall_epilogue(const struct syscallname *);
  76UNUSED static void print_string(abi_long, int);
  77UNUSED static void print_buf(abi_long addr, abi_long len, int last);
  78UNUSED static void print_raw_param(const char *, abi_long, int);
  79UNUSED static void print_timeval(abi_ulong, int);
  80UNUSED static void print_timespec(abi_ulong, int);
  81UNUSED static void print_timezone(abi_ulong, int);
  82UNUSED static void print_itimerval(abi_ulong, int);
  83UNUSED static void print_number(abi_long, int);
  84UNUSED static void print_signal(abi_ulong, int);
  85UNUSED static void print_sockaddr(abi_ulong, abi_long, int);
  86UNUSED static void print_socket_domain(int domain);
  87UNUSED static void print_socket_type(int type);
  88UNUSED static void print_socket_protocol(int domain, int type, int protocol);
  89
  90/*
  91 * Utility functions
  92 */
  93static void
  94print_ipc_cmd(int cmd)
  95{
  96#define output_cmd(val) \
  97if( cmd == val ) { \
  98    qemu_log(#val); \
  99    return; \
 100}
 101
 102    cmd &= 0xff;
 103
 104    /* General IPC commands */
 105    output_cmd( IPC_RMID );
 106    output_cmd( IPC_SET );
 107    output_cmd( IPC_STAT );
 108    output_cmd( IPC_INFO );
 109    /* msgctl() commands */
 110    output_cmd( MSG_STAT );
 111    output_cmd( MSG_INFO );
 112    /* shmctl() commands */
 113    output_cmd( SHM_LOCK );
 114    output_cmd( SHM_UNLOCK );
 115    output_cmd( SHM_STAT );
 116    output_cmd( SHM_INFO );
 117    /* semctl() commands */
 118    output_cmd( GETPID );
 119    output_cmd( GETVAL );
 120    output_cmd( GETALL );
 121    output_cmd( GETNCNT );
 122    output_cmd( GETZCNT );
 123    output_cmd( SETVAL );
 124    output_cmd( SETALL );
 125    output_cmd( SEM_STAT );
 126    output_cmd( SEM_INFO );
 127    output_cmd( IPC_RMID );
 128    output_cmd( IPC_RMID );
 129    output_cmd( IPC_RMID );
 130    output_cmd( IPC_RMID );
 131    output_cmd( IPC_RMID );
 132    output_cmd( IPC_RMID );
 133    output_cmd( IPC_RMID );
 134    output_cmd( IPC_RMID );
 135    output_cmd( IPC_RMID );
 136
 137    /* Some value we don't recognize */
 138    qemu_log("%d", cmd);
 139}
 140
 141static void
 142print_signal(abi_ulong arg, int last)
 143{
 144    const char *signal_name = NULL;
 145    switch(arg) {
 146    case TARGET_SIGHUP: signal_name = "SIGHUP"; break;
 147    case TARGET_SIGINT: signal_name = "SIGINT"; break;
 148    case TARGET_SIGQUIT: signal_name = "SIGQUIT"; break;
 149    case TARGET_SIGILL: signal_name = "SIGILL"; break;
 150    case TARGET_SIGABRT: signal_name = "SIGABRT"; break;
 151    case TARGET_SIGFPE: signal_name = "SIGFPE"; break;
 152    case TARGET_SIGKILL: signal_name = "SIGKILL"; break;
 153    case TARGET_SIGSEGV: signal_name = "SIGSEGV"; break;
 154    case TARGET_SIGPIPE: signal_name = "SIGPIPE"; break;
 155    case TARGET_SIGALRM: signal_name = "SIGALRM"; break;
 156    case TARGET_SIGTERM: signal_name = "SIGTERM"; break;
 157    case TARGET_SIGUSR1: signal_name = "SIGUSR1"; break;
 158    case TARGET_SIGUSR2: signal_name = "SIGUSR2"; break;
 159    case TARGET_SIGCHLD: signal_name = "SIGCHLD"; break;
 160    case TARGET_SIGCONT: signal_name = "SIGCONT"; break;
 161    case TARGET_SIGSTOP: signal_name = "SIGSTOP"; break;
 162    case TARGET_SIGTTIN: signal_name = "SIGTTIN"; break;
 163    case TARGET_SIGTTOU: signal_name = "SIGTTOU"; break;
 164    }
 165    if (signal_name == NULL) {
 166        print_raw_param("%ld", arg, last);
 167        return;
 168    }
 169    qemu_log("%s%s", signal_name, get_comma(last));
 170}
 171
 172static void print_si_code(int arg)
 173{
 174    const char *codename = NULL;
 175
 176    switch (arg) {
 177    case SI_USER:
 178        codename = "SI_USER";
 179        break;
 180    case SI_KERNEL:
 181        codename = "SI_KERNEL";
 182        break;
 183    case SI_QUEUE:
 184        codename = "SI_QUEUE";
 185        break;
 186    case SI_TIMER:
 187        codename = "SI_TIMER";
 188        break;
 189    case SI_MESGQ:
 190        codename = "SI_MESGQ";
 191        break;
 192    case SI_ASYNCIO:
 193        codename = "SI_ASYNCIO";
 194        break;
 195    case SI_SIGIO:
 196        codename = "SI_SIGIO";
 197        break;
 198    case SI_TKILL:
 199        codename = "SI_TKILL";
 200        break;
 201    default:
 202        qemu_log("%d", arg);
 203        return;
 204    }
 205    qemu_log("%s", codename);
 206}
 207
 208static void get_target_siginfo(target_siginfo_t *tinfo,
 209                                const target_siginfo_t *info)
 210{
 211    abi_ulong sival_ptr;
 212
 213    int sig;
 214    int si_errno;
 215    int si_code;
 216    int si_type;
 217
 218    __get_user(sig, &info->si_signo);
 219    __get_user(si_errno, &tinfo->si_errno);
 220    __get_user(si_code, &info->si_code);
 221
 222    tinfo->si_signo = sig;
 223    tinfo->si_errno = si_errno;
 224    tinfo->si_code = si_code;
 225
 226    /* Ensure we don't leak random junk to the guest later */
 227    memset(tinfo->_sifields._pad, 0, sizeof(tinfo->_sifields._pad));
 228
 229    /* This is awkward, because we have to use a combination of
 230     * the si_code and si_signo to figure out which of the union's
 231     * members are valid. (Within the host kernel it is always possible
 232     * to tell, but the kernel carefully avoids giving userspace the
 233     * high 16 bits of si_code, so we don't have the information to
 234     * do this the easy way...) We therefore make our best guess,
 235     * bearing in mind that a guest can spoof most of the si_codes
 236     * via rt_sigqueueinfo() if it likes.
 237     *
 238     * Once we have made our guess, we record it in the top 16 bits of
 239     * the si_code, so that print_siginfo() later can use it.
 240     * print_siginfo() will strip these top bits out before printing
 241     * the si_code.
 242     */
 243
 244    switch (si_code) {
 245    case SI_USER:
 246    case SI_TKILL:
 247    case SI_KERNEL:
 248        /* Sent via kill(), tkill() or tgkill(), or direct from the kernel.
 249         * These are the only unspoofable si_code values.
 250         */
 251        __get_user(tinfo->_sifields._kill._pid, &info->_sifields._kill._pid);
 252        __get_user(tinfo->_sifields._kill._uid, &info->_sifields._kill._uid);
 253        si_type = QEMU_SI_KILL;
 254        break;
 255    default:
 256        /* Everything else is spoofable. Make best guess based on signal */
 257        switch (sig) {
 258        case TARGET_SIGCHLD:
 259            __get_user(tinfo->_sifields._sigchld._pid,
 260                       &info->_sifields._sigchld._pid);
 261            __get_user(tinfo->_sifields._sigchld._uid,
 262                       &info->_sifields._sigchld._uid);
 263            __get_user(tinfo->_sifields._sigchld._status,
 264                       &info->_sifields._sigchld._status);
 265            __get_user(tinfo->_sifields._sigchld._utime,
 266                       &info->_sifields._sigchld._utime);
 267            __get_user(tinfo->_sifields._sigchld._stime,
 268                       &info->_sifields._sigchld._stime);
 269            si_type = QEMU_SI_CHLD;
 270            break;
 271        case TARGET_SIGIO:
 272            __get_user(tinfo->_sifields._sigpoll._band,
 273                       &info->_sifields._sigpoll._band);
 274            __get_user(tinfo->_sifields._sigpoll._fd,
 275                       &info->_sifields._sigpoll._fd);
 276            si_type = QEMU_SI_POLL;
 277            break;
 278        default:
 279            /* Assume a sigqueue()/mq_notify()/rt_sigqueueinfo() source. */
 280            __get_user(tinfo->_sifields._rt._pid, &info->_sifields._rt._pid);
 281            __get_user(tinfo->_sifields._rt._uid, &info->_sifields._rt._uid);
 282            /* XXX: potential problem if 64 bit */
 283            __get_user(sival_ptr, &info->_sifields._rt._sigval.sival_ptr);
 284            tinfo->_sifields._rt._sigval.sival_ptr = sival_ptr;
 285
 286            si_type = QEMU_SI_RT;
 287            break;
 288        }
 289        break;
 290    }
 291
 292    tinfo->si_code = deposit32(si_code, 16, 16, si_type);
 293}
 294
 295static void print_siginfo(const target_siginfo_t *tinfo)
 296{
 297    /* Print a target_siginfo_t in the format desired for printing
 298     * signals being taken. We assume the target_siginfo_t is in the
 299     * internal form where the top 16 bits of si_code indicate which
 300     * part of the union is valid, rather than in the guest-visible
 301     * form where the bottom 16 bits are sign-extended into the top 16.
 302     */
 303    int si_type = extract32(tinfo->si_code, 16, 16);
 304    int si_code = sextract32(tinfo->si_code, 0, 16);
 305
 306    qemu_log("{si_signo=");
 307    print_signal(tinfo->si_signo, 1);
 308    qemu_log(", si_code=");
 309    print_si_code(si_code);
 310
 311    switch (si_type) {
 312    case QEMU_SI_KILL:
 313        qemu_log(", si_pid=%u, si_uid=%u",
 314                 (unsigned int)tinfo->_sifields._kill._pid,
 315                 (unsigned int)tinfo->_sifields._kill._uid);
 316        break;
 317    case QEMU_SI_TIMER:
 318        qemu_log(", si_timer1=%u, si_timer2=%u",
 319                 tinfo->_sifields._timer._timer1,
 320                 tinfo->_sifields._timer._timer2);
 321        break;
 322    case QEMU_SI_POLL:
 323        qemu_log(", si_band=%d, si_fd=%d",
 324                 tinfo->_sifields._sigpoll._band,
 325                 tinfo->_sifields._sigpoll._fd);
 326        break;
 327    case QEMU_SI_FAULT:
 328        qemu_log(", si_addr=");
 329        print_pointer(tinfo->_sifields._sigfault._addr, 1);
 330        break;
 331    case QEMU_SI_CHLD:
 332        qemu_log(", si_pid=%u, si_uid=%u, si_status=%d"
 333                 ", si_utime=" TARGET_ABI_FMT_ld
 334                 ", si_stime=" TARGET_ABI_FMT_ld,
 335                 (unsigned int)(tinfo->_sifields._sigchld._pid),
 336                 (unsigned int)(tinfo->_sifields._sigchld._uid),
 337                 tinfo->_sifields._sigchld._status,
 338                 tinfo->_sifields._sigchld._utime,
 339                 tinfo->_sifields._sigchld._stime);
 340        break;
 341    case QEMU_SI_RT:
 342        qemu_log(", si_pid=%u, si_uid=%u, si_sigval=" TARGET_ABI_FMT_ld,
 343                 (unsigned int)tinfo->_sifields._rt._pid,
 344                 (unsigned int)tinfo->_sifields._rt._uid,
 345                 tinfo->_sifields._rt._sigval.sival_ptr);
 346        break;
 347    default:
 348        g_assert_not_reached();
 349    }
 350    qemu_log("}");
 351}
 352
 353static void
 354print_sockaddr(abi_ulong addr, abi_long addrlen, int last)
 355{
 356    struct target_sockaddr *sa;
 357    int i;
 358    int sa_family;
 359
 360    sa = lock_user(VERIFY_READ, addr, addrlen, 1);
 361    if (sa) {
 362        sa_family = tswap16(sa->sa_family);
 363        switch (sa_family) {
 364        case AF_UNIX: {
 365            struct target_sockaddr_un *un = (struct target_sockaddr_un *)sa;
 366            int i;
 367            qemu_log("{sun_family=AF_UNIX,sun_path=\"");
 368            for (i = 0; i < addrlen -
 369                            offsetof(struct target_sockaddr_un, sun_path) &&
 370                 un->sun_path[i]; i++) {
 371                qemu_log("%c", un->sun_path[i]);
 372            }
 373            qemu_log("\"}");
 374            break;
 375        }
 376        case AF_INET: {
 377            struct target_sockaddr_in *in = (struct target_sockaddr_in *)sa;
 378            uint8_t *c = (uint8_t *)&in->sin_addr.s_addr;
 379            qemu_log("{sin_family=AF_INET,sin_port=htons(%d),",
 380                     ntohs(in->sin_port));
 381            qemu_log("sin_addr=inet_addr(\"%d.%d.%d.%d\")",
 382                     c[0], c[1], c[2], c[3]);
 383            qemu_log("}");
 384            break;
 385        }
 386        case AF_PACKET: {
 387            struct target_sockaddr_ll *ll = (struct target_sockaddr_ll *)sa;
 388            uint8_t *c = (uint8_t *)&ll->sll_addr;
 389            qemu_log("{sll_family=AF_PACKET,"
 390                     "sll_protocol=htons(0x%04x),if%d,pkttype=",
 391                     ntohs(ll->sll_protocol), ll->sll_ifindex);
 392            switch (ll->sll_pkttype) {
 393            case PACKET_HOST:
 394                qemu_log("PACKET_HOST");
 395                break;
 396            case PACKET_BROADCAST:
 397                qemu_log("PACKET_BROADCAST");
 398                break;
 399            case PACKET_MULTICAST:
 400                qemu_log("PACKET_MULTICAST");
 401                break;
 402            case PACKET_OTHERHOST:
 403                qemu_log("PACKET_OTHERHOST");
 404                break;
 405            case PACKET_OUTGOING:
 406                qemu_log("PACKET_OUTGOING");
 407                break;
 408            default:
 409                qemu_log("%d", ll->sll_pkttype);
 410                break;
 411            }
 412            qemu_log(",sll_addr=%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
 413                     c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
 414            qemu_log("}");
 415            break;
 416        }
 417        case AF_NETLINK: {
 418            struct target_sockaddr_nl *nl = (struct target_sockaddr_nl *)sa;
 419            qemu_log("{nl_family=AF_NETLINK,nl_pid=%u,nl_groups=%u}",
 420                     tswap32(nl->nl_pid), tswap32(nl->nl_groups));
 421            break;
 422        }
 423        default:
 424            qemu_log("{sa_family=%d, sa_data={", sa->sa_family);
 425            for (i = 0; i < 13; i++) {
 426                qemu_log("%02x, ", sa->sa_data[i]);
 427            }
 428            qemu_log("%02x}", sa->sa_data[i]);
 429            qemu_log("}");
 430            break;
 431        }
 432        unlock_user(sa, addr, 0);
 433    } else {
 434        print_raw_param("0x"TARGET_ABI_FMT_lx, addr, 0);
 435    }
 436    qemu_log(", "TARGET_ABI_FMT_ld"%s", addrlen, get_comma(last));
 437}
 438
 439static void
 440print_socket_domain(int domain)
 441{
 442    switch (domain) {
 443    case PF_UNIX:
 444        qemu_log("PF_UNIX");
 445        break;
 446    case PF_INET:
 447        qemu_log("PF_INET");
 448        break;
 449    case PF_NETLINK:
 450        qemu_log("PF_NETLINK");
 451        break;
 452    case PF_PACKET:
 453        qemu_log("PF_PACKET");
 454        break;
 455    default:
 456        qemu_log("%d", domain);
 457        break;
 458    }
 459}
 460
 461static void
 462print_socket_type(int type)
 463{
 464    switch (type & TARGET_SOCK_TYPE_MASK) {
 465    case TARGET_SOCK_DGRAM:
 466        qemu_log("SOCK_DGRAM");
 467        break;
 468    case TARGET_SOCK_STREAM:
 469        qemu_log("SOCK_STREAM");
 470        break;
 471    case TARGET_SOCK_RAW:
 472        qemu_log("SOCK_RAW");
 473        break;
 474    case TARGET_SOCK_RDM:
 475        qemu_log("SOCK_RDM");
 476        break;
 477    case TARGET_SOCK_SEQPACKET:
 478        qemu_log("SOCK_SEQPACKET");
 479        break;
 480    case TARGET_SOCK_PACKET:
 481        qemu_log("SOCK_PACKET");
 482        break;
 483    }
 484    if (type & TARGET_SOCK_CLOEXEC) {
 485        qemu_log("|SOCK_CLOEXEC");
 486    }
 487    if (type & TARGET_SOCK_NONBLOCK) {
 488        qemu_log("|SOCK_NONBLOCK");
 489    }
 490}
 491
 492static void
 493print_socket_protocol(int domain, int type, int protocol)
 494{
 495    if (domain == AF_PACKET ||
 496        (domain == AF_INET && type == TARGET_SOCK_PACKET)) {
 497        switch (protocol) {
 498        case 0x0003:
 499            qemu_log("ETH_P_ALL");
 500            break;
 501        default:
 502            qemu_log("%d", protocol);
 503        }
 504        return;
 505    }
 506
 507    if (domain == PF_NETLINK) {
 508        switch (protocol) {
 509        case NETLINK_ROUTE:
 510            qemu_log("NETLINK_ROUTE");
 511            break;
 512        case NETLINK_AUDIT:
 513            qemu_log("NETLINK_AUDIT");
 514            break;
 515        case NETLINK_NETFILTER:
 516            qemu_log("NETLINK_NETFILTER");
 517            break;
 518        case NETLINK_KOBJECT_UEVENT:
 519            qemu_log("NETLINK_KOBJECT_UEVENT");
 520            break;
 521        case NETLINK_RDMA:
 522            qemu_log("NETLINK_RDMA");
 523            break;
 524        case NETLINK_CRYPTO:
 525            qemu_log("NETLINK_CRYPTO");
 526            break;
 527        default:
 528            qemu_log("%d", protocol);
 529            break;
 530        }
 531        return;
 532    }
 533
 534    switch (protocol) {
 535    case IPPROTO_IP:
 536        qemu_log("IPPROTO_IP");
 537        break;
 538    case IPPROTO_TCP:
 539        qemu_log("IPPROTO_TCP");
 540        break;
 541    case IPPROTO_UDP:
 542        qemu_log("IPPROTO_UDP");
 543        break;
 544    case IPPROTO_RAW:
 545        qemu_log("IPPROTO_RAW");
 546        break;
 547    default:
 548        qemu_log("%d", protocol);
 549        break;
 550    }
 551}
 552
 553
 554#ifdef TARGET_NR__newselect
 555static void
 556print_fdset(int n, abi_ulong target_fds_addr)
 557{
 558    int i;
 559    int first = 1;
 560
 561    qemu_log("[");
 562    if( target_fds_addr ) {
 563        abi_long *target_fds;
 564
 565        target_fds = lock_user(VERIFY_READ,
 566                               target_fds_addr,
 567                               sizeof(*target_fds)*(n / TARGET_ABI_BITS + 1),
 568                               1);
 569
 570        if (!target_fds)
 571            return;
 572
 573        for (i=n; i>=0; i--) {
 574            if ((tswapal(target_fds[i / TARGET_ABI_BITS]) >>
 575                (i & (TARGET_ABI_BITS - 1))) & 1) {
 576                qemu_log("%s%d", get_comma(first), i);
 577                first = 0;
 578            }
 579        }
 580        unlock_user(target_fds, target_fds_addr, 0);
 581    }
 582    qemu_log("]");
 583}
 584#endif
 585
 586/*
 587 * Sysycall specific output functions
 588 */
 589
 590/* select */
 591#ifdef TARGET_NR__newselect
 592static void
 593print_newselect(void *cpu_env, const struct syscallname *name,
 594                abi_long arg1, abi_long arg2, abi_long arg3,
 595                abi_long arg4, abi_long arg5, abi_long arg6)
 596{
 597    print_syscall_prologue(name);
 598    print_fdset(arg1, arg2);
 599    qemu_log(",");
 600    print_fdset(arg1, arg3);
 601    qemu_log(",");
 602    print_fdset(arg1, arg4);
 603    qemu_log(",");
 604    print_timeval(arg5, 1);
 605    print_syscall_epilogue(name);
 606}
 607#endif
 608
 609#ifdef TARGET_NR_semctl
 610static void
 611print_semctl(void *cpu_env, const struct syscallname *name,
 612             abi_long arg1, abi_long arg2, abi_long arg3,
 613             abi_long arg4, abi_long arg5, abi_long arg6)
 614{
 615    qemu_log("%s(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ",",
 616             name->name, arg1, arg2);
 617    print_ipc_cmd(arg3);
 618    qemu_log(",0x" TARGET_ABI_FMT_lx ")", arg4);
 619}
 620#endif
 621
 622static void
 623print_execve(void *cpu_env, const struct syscallname *name,
 624             abi_long arg1, abi_long arg2, abi_long arg3,
 625             abi_long arg4, abi_long arg5, abi_long arg6)
 626{
 627    abi_ulong arg_ptr_addr;
 628    char *s;
 629
 630    if (!(s = lock_user_string(arg1)))
 631        return;
 632    qemu_log("%s(\"%s\",{", name->name, s);
 633    unlock_user(s, arg1, 0);
 634
 635    for (arg_ptr_addr = arg2; ; arg_ptr_addr += sizeof(abi_ulong)) {
 636        abi_ulong *arg_ptr, arg_addr;
 637
 638        arg_ptr = lock_user(VERIFY_READ, arg_ptr_addr, sizeof(abi_ulong), 1);
 639        if (!arg_ptr)
 640            return;
 641    arg_addr = tswapal(*arg_ptr);
 642        unlock_user(arg_ptr, arg_ptr_addr, 0);
 643        if (!arg_addr)
 644            break;
 645        if ((s = lock_user_string(arg_addr))) {
 646            qemu_log("\"%s\",", s);
 647            unlock_user(s, arg_addr, 0);
 648        }
 649    }
 650
 651    qemu_log("NULL})");
 652}
 653
 654#ifdef TARGET_NR_ipc
 655static void
 656print_ipc(void *cpu_env, const struct syscallname *name,
 657          abi_long arg1, abi_long arg2, abi_long arg3,
 658          abi_long arg4, abi_long arg5, abi_long arg6)
 659{
 660    switch(arg1) {
 661    case IPCOP_semctl:
 662        qemu_log("semctl(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ",",
 663                 arg1, arg2);
 664        print_ipc_cmd(arg3);
 665        qemu_log(",0x" TARGET_ABI_FMT_lx ")", arg4);
 666        break;
 667    default:
 668        qemu_log(("%s("
 669                  TARGET_ABI_FMT_ld ","
 670                  TARGET_ABI_FMT_ld ","
 671                  TARGET_ABI_FMT_ld ","
 672                  TARGET_ABI_FMT_ld
 673                  ")"),
 674                 name->name, arg1, arg2, arg3, arg4);
 675    }
 676}
 677#endif
 678
 679/*
 680 * Variants for the return value output function
 681 */
 682
 683static bool
 684print_syscall_err(abi_long ret)
 685{
 686    const char *errstr;
 687
 688    qemu_log(" = ");
 689    if (ret < 0) {
 690        errstr = target_strerror(-ret);
 691        if (errstr) {
 692            qemu_log("-1 errno=%d (%s)", (int)-ret, errstr);
 693            return true;
 694        }
 695    }
 696    return false;
 697}
 698
 699static void
 700print_syscall_ret_addr(void *cpu_env, const struct syscallname *name,
 701                       abi_long ret, abi_long arg0, abi_long arg1,
 702                       abi_long arg2, abi_long arg3, abi_long arg4,
 703                       abi_long arg5)
 704{
 705    if (!print_syscall_err(ret)) {
 706        qemu_log("0x" TARGET_ABI_FMT_lx, ret);
 707    }
 708    qemu_log("\n");
 709}
 710
 711#if 0 /* currently unused */
 712static void
 713print_syscall_ret_raw(struct syscallname *name, abi_long ret)
 714{
 715        qemu_log(" = 0x" TARGET_ABI_FMT_lx "\n", ret);
 716}
 717#endif
 718
 719#ifdef TARGET_NR__newselect
 720static void
 721print_syscall_ret_newselect(void *cpu_env, const struct syscallname *name,
 722                            abi_long ret, abi_long arg0, abi_long arg1,
 723                            abi_long arg2, abi_long arg3, abi_long arg4,
 724                            abi_long arg5)
 725{
 726    if (!print_syscall_err(ret)) {
 727        qemu_log(" = 0x" TARGET_ABI_FMT_lx " (", ret);
 728        print_fdset(arg0, arg1);
 729        qemu_log(",");
 730        print_fdset(arg0, arg2);
 731        qemu_log(",");
 732        print_fdset(arg0, arg3);
 733        qemu_log(",");
 734        print_timeval(arg4, 1);
 735        qemu_log(")");
 736    }
 737
 738    qemu_log("\n");
 739}
 740#endif
 741
 742/* special meanings of adjtimex()' non-negative return values */
 743#define TARGET_TIME_OK       0   /* clock synchronized, no leap second */
 744#define TARGET_TIME_INS      1   /* insert leap second */
 745#define TARGET_TIME_DEL      2   /* delete leap second */
 746#define TARGET_TIME_OOP      3   /* leap second in progress */
 747#define TARGET_TIME_WAIT     4   /* leap second has occurred */
 748#define TARGET_TIME_ERROR    5   /* clock not synchronized */
 749#ifdef TARGET_NR_adjtimex
 750static void
 751print_syscall_ret_adjtimex(void *cpu_env, const struct syscallname *name,
 752                           abi_long ret, abi_long arg0, abi_long arg1,
 753                           abi_long arg2, abi_long arg3, abi_long arg4,
 754                           abi_long arg5)
 755{
 756    if (!print_syscall_err(ret)) {
 757        qemu_log(TARGET_ABI_FMT_ld, ret);
 758        switch (ret) {
 759        case TARGET_TIME_OK:
 760            qemu_log(" TIME_OK (clock synchronized, no leap second)");
 761            break;
 762        case TARGET_TIME_INS:
 763            qemu_log(" TIME_INS (insert leap second)");
 764            break;
 765        case TARGET_TIME_DEL:
 766            qemu_log(" TIME_DEL (delete leap second)");
 767            break;
 768        case TARGET_TIME_OOP:
 769            qemu_log(" TIME_OOP (leap second in progress)");
 770            break;
 771        case TARGET_TIME_WAIT:
 772            qemu_log(" TIME_WAIT (leap second has occurred)");
 773            break;
 774        case TARGET_TIME_ERROR:
 775            qemu_log(" TIME_ERROR (clock not synchronized)");
 776            break;
 777        }
 778    }
 779
 780    qemu_log("\n");
 781}
 782#endif
 783
 784#if defined(TARGET_NR_clock_gettime) || defined(TARGET_NR_clock_getres)
 785static void
 786print_syscall_ret_clock_gettime(void *cpu_env, const struct syscallname *name,
 787                                abi_long ret, abi_long arg0, abi_long arg1,
 788                                abi_long arg2, abi_long arg3, abi_long arg4,
 789                                abi_long arg5)
 790{
 791    if (!print_syscall_err(ret)) {
 792        qemu_log(TARGET_ABI_FMT_ld, ret);
 793        qemu_log(" (");
 794        print_timespec(arg1, 1);
 795        qemu_log(")");
 796    }
 797
 798    qemu_log("\n");
 799}
 800#define print_syscall_ret_clock_getres     print_syscall_ret_clock_gettime
 801#endif
 802
 803#ifdef TARGET_NR_gettimeofday
 804static void
 805print_syscall_ret_gettimeofday(void *cpu_env, const struct syscallname *name,
 806                               abi_long ret, abi_long arg0, abi_long arg1,
 807                               abi_long arg2, abi_long arg3, abi_long arg4,
 808                               abi_long arg5)
 809{
 810    if (!print_syscall_err(ret)) {
 811        qemu_log(TARGET_ABI_FMT_ld, ret);
 812        qemu_log(" (");
 813        print_timeval(arg0, 0);
 814        print_timezone(arg1, 1);
 815        qemu_log(")");
 816    }
 817
 818    qemu_log("\n");
 819}
 820#endif
 821
 822#ifdef TARGET_NR_getitimer
 823static void
 824print_syscall_ret_getitimer(void *cpu_env, const struct syscallname *name,
 825                            abi_long ret, abi_long arg0, abi_long arg1,
 826                            abi_long arg2, abi_long arg3, abi_long arg4,
 827                            abi_long arg5)
 828{
 829    if (!print_syscall_err(ret)) {
 830        qemu_log(TARGET_ABI_FMT_ld, ret);
 831        qemu_log(" (");
 832        print_itimerval(arg1, 1);
 833        qemu_log(")");
 834    }
 835
 836    qemu_log("\n");
 837}
 838#endif
 839
 840
 841#ifdef TARGET_NR_getitimer
 842static void
 843print_syscall_ret_setitimer(void *cpu_env, const struct syscallname *name,
 844                            abi_long ret, abi_long arg0, abi_long arg1,
 845                            abi_long arg2, abi_long arg3, abi_long arg4,
 846                            abi_long arg5)
 847{
 848    if (!print_syscall_err(ret)) {
 849        qemu_log(TARGET_ABI_FMT_ld, ret);
 850        qemu_log(" (old_value = ");
 851        print_itimerval(arg2, 1);
 852        qemu_log(")");
 853    }
 854
 855    qemu_log("\n");
 856}
 857#endif
 858
 859#if defined(TARGET_NR_listxattr) || defined(TARGET_NR_llistxattr) \
 860 || defined(TARGGET_NR_flistxattr)
 861static void
 862print_syscall_ret_listxattr(void *cpu_env, const struct syscallname *name,
 863                            abi_long ret, abi_long arg0, abi_long arg1,
 864                            abi_long arg2, abi_long arg3, abi_long arg4,
 865                            abi_long arg5)
 866{
 867    if (!print_syscall_err(ret)) {
 868        qemu_log(TARGET_ABI_FMT_ld, ret);
 869        qemu_log(" (list = ");
 870        if (arg1 != 0) {
 871            abi_long attr = arg1;
 872            while (ret) {
 873                if (attr != arg1) {
 874                    qemu_log(",");
 875                }
 876                print_string(attr, 1);
 877                ret -= target_strlen(attr) + 1;
 878                attr += target_strlen(attr) + 1;
 879            }
 880        } else {
 881            qemu_log("NULL");
 882        }
 883        qemu_log(")");
 884    }
 885
 886    qemu_log("\n");
 887}
 888#define print_syscall_ret_llistxattr     print_syscall_ret_listxattr
 889#define print_syscall_ret_flistxattr     print_syscall_ret_listxattr
 890#endif
 891
 892#ifdef TARGET_NR_ioctl
 893static void
 894print_syscall_ret_ioctl(void *cpu_env, const struct syscallname *name,
 895                        abi_long ret, abi_long arg0, abi_long arg1,
 896                        abi_long arg2, abi_long arg3, abi_long arg4,
 897                        abi_long arg5)
 898{
 899    if (!print_syscall_err(ret)) {
 900        qemu_log(TARGET_ABI_FMT_ld, ret);
 901
 902        const IOCTLEntry *ie;
 903        const argtype *arg_type;
 904        void *argptr;
 905        int target_size;
 906
 907        for (ie = ioctl_entries; ie->target_cmd != 0; ie++) {
 908            if (ie->target_cmd == arg1) {
 909                break;
 910            }
 911        }
 912
 913        if (ie->target_cmd == arg1 &&
 914           (ie->access == IOC_R || ie->access == IOC_RW)) {
 915            arg_type = ie->arg_type;
 916            qemu_log(" (");
 917            arg_type++;
 918            target_size = thunk_type_size(arg_type, 0);
 919            argptr = lock_user(VERIFY_READ, arg2, target_size, 1);
 920            if (argptr) {
 921                thunk_print(argptr, arg_type);
 922                unlock_user(argptr, arg2, target_size);
 923            } else {
 924                print_pointer(arg2, 1);
 925            }
 926            qemu_log(")");
 927        }
 928    }
 929    qemu_log("\n");
 930}
 931#endif
 932
 933UNUSED static struct flags access_flags[] = {
 934    FLAG_GENERIC(F_OK),
 935    FLAG_GENERIC(R_OK),
 936    FLAG_GENERIC(W_OK),
 937    FLAG_GENERIC(X_OK),
 938    FLAG_END,
 939};
 940
 941UNUSED static struct flags at_file_flags[] = {
 942#ifdef AT_EACCESS
 943    FLAG_GENERIC(AT_EACCESS),
 944#endif
 945#ifdef AT_SYMLINK_NOFOLLOW
 946    FLAG_GENERIC(AT_SYMLINK_NOFOLLOW),
 947#endif
 948    FLAG_END,
 949};
 950
 951UNUSED static struct flags unlinkat_flags[] = {
 952#ifdef AT_REMOVEDIR
 953    FLAG_GENERIC(AT_REMOVEDIR),
 954#endif
 955    FLAG_END,
 956};
 957
 958UNUSED static struct flags mode_flags[] = {
 959    FLAG_GENERIC(S_IFSOCK),
 960    FLAG_GENERIC(S_IFLNK),
 961    FLAG_GENERIC(S_IFREG),
 962    FLAG_GENERIC(S_IFBLK),
 963    FLAG_GENERIC(S_IFDIR),
 964    FLAG_GENERIC(S_IFCHR),
 965    FLAG_GENERIC(S_IFIFO),
 966    FLAG_END,
 967};
 968
 969UNUSED static struct flags open_access_flags[] = {
 970    FLAG_TARGET(O_RDONLY),
 971    FLAG_TARGET(O_WRONLY),
 972    FLAG_TARGET(O_RDWR),
 973    FLAG_END,
 974};
 975
 976UNUSED static struct flags open_flags[] = {
 977    FLAG_TARGET(O_APPEND),
 978    FLAG_TARGET(O_CREAT),
 979    FLAG_TARGET(O_DIRECTORY),
 980    FLAG_TARGET(O_EXCL),
 981    FLAG_TARGET(O_LARGEFILE),
 982    FLAG_TARGET(O_NOCTTY),
 983    FLAG_TARGET(O_NOFOLLOW),
 984    FLAG_TARGET(O_NONBLOCK),      /* also O_NDELAY */
 985    FLAG_TARGET(O_DSYNC),
 986    FLAG_TARGET(__O_SYNC),
 987    FLAG_TARGET(O_TRUNC),
 988#ifdef O_DIRECT
 989    FLAG_TARGET(O_DIRECT),
 990#endif
 991#ifdef O_NOATIME
 992    FLAG_TARGET(O_NOATIME),
 993#endif
 994#ifdef O_CLOEXEC
 995    FLAG_TARGET(O_CLOEXEC),
 996#endif
 997#ifdef O_PATH
 998    FLAG_TARGET(O_PATH),
 999#endif
1000#ifdef O_TMPFILE
1001    FLAG_TARGET(O_TMPFILE),
1002    FLAG_TARGET(__O_TMPFILE),
1003#endif
1004    FLAG_END,
1005};
1006
1007UNUSED static struct flags mount_flags[] = {
1008#ifdef MS_BIND
1009    FLAG_GENERIC(MS_BIND),
1010#endif
1011#ifdef MS_DIRSYNC
1012    FLAG_GENERIC(MS_DIRSYNC),
1013#endif
1014    FLAG_GENERIC(MS_MANDLOCK),
1015#ifdef MS_MOVE
1016    FLAG_GENERIC(MS_MOVE),
1017#endif
1018    FLAG_GENERIC(MS_NOATIME),
1019    FLAG_GENERIC(MS_NODEV),
1020    FLAG_GENERIC(MS_NODIRATIME),
1021    FLAG_GENERIC(MS_NOEXEC),
1022    FLAG_GENERIC(MS_NOSUID),
1023    FLAG_GENERIC(MS_RDONLY),
1024#ifdef MS_RELATIME
1025    FLAG_GENERIC(MS_RELATIME),
1026#endif
1027    FLAG_GENERIC(MS_REMOUNT),
1028    FLAG_GENERIC(MS_SYNCHRONOUS),
1029    FLAG_END,
1030};
1031
1032UNUSED static struct flags umount2_flags[] = {
1033#ifdef MNT_FORCE
1034    FLAG_GENERIC(MNT_FORCE),
1035#endif
1036#ifdef MNT_DETACH
1037    FLAG_GENERIC(MNT_DETACH),
1038#endif
1039#ifdef MNT_EXPIRE
1040    FLAG_GENERIC(MNT_EXPIRE),
1041#endif
1042    FLAG_END,
1043};
1044
1045UNUSED static struct flags mmap_prot_flags[] = {
1046    FLAG_GENERIC(PROT_NONE),
1047    FLAG_GENERIC(PROT_EXEC),
1048    FLAG_GENERIC(PROT_READ),
1049    FLAG_GENERIC(PROT_WRITE),
1050    FLAG_TARGET(PROT_SEM),
1051    FLAG_GENERIC(PROT_GROWSDOWN),
1052    FLAG_GENERIC(PROT_GROWSUP),
1053    FLAG_END,
1054};
1055
1056UNUSED static struct flags mmap_flags[] = {
1057    FLAG_TARGET(MAP_SHARED),
1058    FLAG_TARGET(MAP_PRIVATE),
1059    FLAG_TARGET(MAP_ANONYMOUS),
1060    FLAG_TARGET(MAP_DENYWRITE),
1061    FLAG_TARGET(MAP_FIXED),
1062    FLAG_TARGET(MAP_GROWSDOWN),
1063    FLAG_TARGET(MAP_EXECUTABLE),
1064#ifdef MAP_LOCKED
1065    FLAG_TARGET(MAP_LOCKED),
1066#endif
1067#ifdef MAP_NONBLOCK
1068    FLAG_TARGET(MAP_NONBLOCK),
1069#endif
1070    FLAG_TARGET(MAP_NORESERVE),
1071#ifdef MAP_POPULATE
1072    FLAG_TARGET(MAP_POPULATE),
1073#endif
1074#ifdef TARGET_MAP_UNINITIALIZED
1075    FLAG_TARGET(MAP_UNINITIALIZED),
1076#endif
1077    FLAG_END,
1078};
1079
1080UNUSED static struct flags clone_flags[] = {
1081    FLAG_GENERIC(CLONE_VM),
1082    FLAG_GENERIC(CLONE_FS),
1083    FLAG_GENERIC(CLONE_FILES),
1084    FLAG_GENERIC(CLONE_SIGHAND),
1085    FLAG_GENERIC(CLONE_PTRACE),
1086    FLAG_GENERIC(CLONE_VFORK),
1087    FLAG_GENERIC(CLONE_PARENT),
1088    FLAG_GENERIC(CLONE_THREAD),
1089    FLAG_GENERIC(CLONE_NEWNS),
1090    FLAG_GENERIC(CLONE_SYSVSEM),
1091    FLAG_GENERIC(CLONE_SETTLS),
1092    FLAG_GENERIC(CLONE_PARENT_SETTID),
1093    FLAG_GENERIC(CLONE_CHILD_CLEARTID),
1094    FLAG_GENERIC(CLONE_DETACHED),
1095    FLAG_GENERIC(CLONE_UNTRACED),
1096    FLAG_GENERIC(CLONE_CHILD_SETTID),
1097#if defined(CLONE_NEWUTS)
1098    FLAG_GENERIC(CLONE_NEWUTS),
1099#endif
1100#if defined(CLONE_NEWIPC)
1101    FLAG_GENERIC(CLONE_NEWIPC),
1102#endif
1103#if defined(CLONE_NEWUSER)
1104    FLAG_GENERIC(CLONE_NEWUSER),
1105#endif
1106#if defined(CLONE_NEWPID)
1107    FLAG_GENERIC(CLONE_NEWPID),
1108#endif
1109#if defined(CLONE_NEWNET)
1110    FLAG_GENERIC(CLONE_NEWNET),
1111#endif
1112#if defined(CLONE_IO)
1113    FLAG_GENERIC(CLONE_IO),
1114#endif
1115    FLAG_END,
1116};
1117
1118UNUSED static struct flags msg_flags[] = {
1119    /* send */
1120    FLAG_GENERIC(MSG_CONFIRM),
1121    FLAG_GENERIC(MSG_DONTROUTE),
1122    FLAG_GENERIC(MSG_DONTWAIT),
1123    FLAG_GENERIC(MSG_EOR),
1124    FLAG_GENERIC(MSG_MORE),
1125    FLAG_GENERIC(MSG_NOSIGNAL),
1126    FLAG_GENERIC(MSG_OOB),
1127    /* recv */
1128    FLAG_GENERIC(MSG_CMSG_CLOEXEC),
1129    FLAG_GENERIC(MSG_ERRQUEUE),
1130    FLAG_GENERIC(MSG_PEEK),
1131    FLAG_GENERIC(MSG_TRUNC),
1132    FLAG_GENERIC(MSG_WAITALL),
1133    /* recvmsg */
1134    FLAG_GENERIC(MSG_CTRUNC),
1135    FLAG_END,
1136};
1137
1138UNUSED static struct flags statx_flags[] = {
1139#ifdef AT_EMPTY_PATH
1140    FLAG_GENERIC(AT_EMPTY_PATH),
1141#endif
1142#ifdef AT_NO_AUTOMOUNT
1143    FLAG_GENERIC(AT_NO_AUTOMOUNT),
1144#endif
1145#ifdef AT_SYMLINK_NOFOLLOW
1146    FLAG_GENERIC(AT_SYMLINK_NOFOLLOW),
1147#endif
1148#ifdef AT_STATX_SYNC_AS_STAT
1149    FLAG_GENERIC(AT_STATX_SYNC_AS_STAT),
1150#endif
1151#ifdef AT_STATX_FORCE_SYNC
1152    FLAG_GENERIC(AT_STATX_FORCE_SYNC),
1153#endif
1154#ifdef AT_STATX_DONT_SYNC
1155    FLAG_GENERIC(AT_STATX_DONT_SYNC),
1156#endif
1157    FLAG_END,
1158};
1159
1160UNUSED static struct flags statx_mask[] = {
1161/* This must come first, because it includes everything.  */
1162#ifdef STATX_ALL
1163    FLAG_GENERIC(STATX_ALL),
1164#endif
1165/* This must come second; it includes everything except STATX_BTIME.  */
1166#ifdef STATX_BASIC_STATS
1167    FLAG_GENERIC(STATX_BASIC_STATS),
1168#endif
1169#ifdef STATX_TYPE
1170    FLAG_GENERIC(STATX_TYPE),
1171#endif
1172#ifdef STATX_MODE
1173    FLAG_GENERIC(STATX_MODE),
1174#endif
1175#ifdef STATX_NLINK
1176    FLAG_GENERIC(STATX_NLINK),
1177#endif
1178#ifdef STATX_UID
1179    FLAG_GENERIC(STATX_UID),
1180#endif
1181#ifdef STATX_GID
1182    FLAG_GENERIC(STATX_GID),
1183#endif
1184#ifdef STATX_ATIME
1185    FLAG_GENERIC(STATX_ATIME),
1186#endif
1187#ifdef STATX_MTIME
1188    FLAG_GENERIC(STATX_MTIME),
1189#endif
1190#ifdef STATX_CTIME
1191    FLAG_GENERIC(STATX_CTIME),
1192#endif
1193#ifdef STATX_INO
1194    FLAG_GENERIC(STATX_INO),
1195#endif
1196#ifdef STATX_SIZE
1197    FLAG_GENERIC(STATX_SIZE),
1198#endif
1199#ifdef STATX_BLOCKS
1200    FLAG_GENERIC(STATX_BLOCKS),
1201#endif
1202#ifdef STATX_BTIME
1203    FLAG_GENERIC(STATX_BTIME),
1204#endif
1205    FLAG_END,
1206};
1207
1208UNUSED static struct flags falloc_flags[] = {
1209    FLAG_GENERIC(FALLOC_FL_KEEP_SIZE),
1210    FLAG_GENERIC(FALLOC_FL_PUNCH_HOLE),
1211#ifdef FALLOC_FL_NO_HIDE_STALE
1212    FLAG_GENERIC(FALLOC_FL_NO_HIDE_STALE),
1213#endif
1214#ifdef FALLOC_FL_COLLAPSE_RANGE
1215    FLAG_GENERIC(FALLOC_FL_COLLAPSE_RANGE),
1216#endif
1217#ifdef FALLOC_FL_ZERO_RANGE
1218    FLAG_GENERIC(FALLOC_FL_ZERO_RANGE),
1219#endif
1220#ifdef FALLOC_FL_INSERT_RANGE
1221    FLAG_GENERIC(FALLOC_FL_INSERT_RANGE),
1222#endif
1223#ifdef FALLOC_FL_UNSHARE_RANGE
1224    FLAG_GENERIC(FALLOC_FL_UNSHARE_RANGE),
1225#endif
1226};
1227
1228UNUSED static struct flags termios_iflags[] = {
1229    FLAG_TARGET(IGNBRK),
1230    FLAG_TARGET(BRKINT),
1231    FLAG_TARGET(IGNPAR),
1232    FLAG_TARGET(PARMRK),
1233    FLAG_TARGET(INPCK),
1234    FLAG_TARGET(ISTRIP),
1235    FLAG_TARGET(INLCR),
1236    FLAG_TARGET(IGNCR),
1237    FLAG_TARGET(ICRNL),
1238    FLAG_TARGET(IUCLC),
1239    FLAG_TARGET(IXON),
1240    FLAG_TARGET(IXANY),
1241    FLAG_TARGET(IXOFF),
1242    FLAG_TARGET(IMAXBEL),
1243    FLAG_TARGET(IUTF8),
1244    FLAG_END,
1245};
1246
1247UNUSED static struct flags termios_oflags[] = {
1248    FLAG_TARGET(OPOST),
1249    FLAG_TARGET(OLCUC),
1250    FLAG_TARGET(ONLCR),
1251    FLAG_TARGET(OCRNL),
1252    FLAG_TARGET(ONOCR),
1253    FLAG_TARGET(ONLRET),
1254    FLAG_TARGET(OFILL),
1255    FLAG_TARGET(OFDEL),
1256    FLAG_END,
1257};
1258
1259UNUSED static struct enums termios_oflags_NLDLY[] = {
1260    ENUM_TARGET(NL0),
1261    ENUM_TARGET(NL1),
1262    ENUM_END,
1263};
1264
1265UNUSED static struct enums termios_oflags_CRDLY[] = {
1266    ENUM_TARGET(CR0),
1267    ENUM_TARGET(CR1),
1268    ENUM_TARGET(CR2),
1269    ENUM_TARGET(CR3),
1270    ENUM_END,
1271};
1272
1273UNUSED static struct enums termios_oflags_TABDLY[] = {
1274    ENUM_TARGET(TAB0),
1275    ENUM_TARGET(TAB1),
1276    ENUM_TARGET(TAB2),
1277    ENUM_TARGET(TAB3),
1278    ENUM_END,
1279};
1280
1281UNUSED static struct enums termios_oflags_VTDLY[] = {
1282    ENUM_TARGET(VT0),
1283    ENUM_TARGET(VT1),
1284    ENUM_END,
1285};
1286
1287UNUSED static struct enums termios_oflags_FFDLY[] = {
1288    ENUM_TARGET(FF0),
1289    ENUM_TARGET(FF1),
1290    ENUM_END,
1291};
1292
1293UNUSED static struct enums termios_oflags_BSDLY[] = {
1294    ENUM_TARGET(BS0),
1295    ENUM_TARGET(BS1),
1296    ENUM_END,
1297};
1298
1299UNUSED static struct enums termios_cflags_CBAUD[] = {
1300    ENUM_TARGET(B0),
1301    ENUM_TARGET(B50),
1302    ENUM_TARGET(B75),
1303    ENUM_TARGET(B110),
1304    ENUM_TARGET(B134),
1305    ENUM_TARGET(B150),
1306    ENUM_TARGET(B200),
1307    ENUM_TARGET(B300),
1308    ENUM_TARGET(B600),
1309    ENUM_TARGET(B1200),
1310    ENUM_TARGET(B1800),
1311    ENUM_TARGET(B2400),
1312    ENUM_TARGET(B4800),
1313    ENUM_TARGET(B9600),
1314    ENUM_TARGET(B19200),
1315    ENUM_TARGET(B38400),
1316    ENUM_TARGET(B57600),
1317    ENUM_TARGET(B115200),
1318    ENUM_TARGET(B230400),
1319    ENUM_TARGET(B460800),
1320    ENUM_END,
1321};
1322
1323UNUSED static struct enums termios_cflags_CSIZE[] = {
1324    ENUM_TARGET(CS5),
1325    ENUM_TARGET(CS6),
1326    ENUM_TARGET(CS7),
1327    ENUM_TARGET(CS8),
1328    ENUM_END,
1329};
1330
1331UNUSED static struct flags termios_cflags[] = {
1332    FLAG_TARGET(CSTOPB),
1333    FLAG_TARGET(CREAD),
1334    FLAG_TARGET(PARENB),
1335    FLAG_TARGET(PARODD),
1336    FLAG_TARGET(HUPCL),
1337    FLAG_TARGET(CLOCAL),
1338    FLAG_TARGET(CRTSCTS),
1339    FLAG_END,
1340};
1341
1342UNUSED static struct flags termios_lflags[] = {
1343    FLAG_TARGET(ISIG),
1344    FLAG_TARGET(ICANON),
1345    FLAG_TARGET(XCASE),
1346    FLAG_TARGET(ECHO),
1347    FLAG_TARGET(ECHOE),
1348    FLAG_TARGET(ECHOK),
1349    FLAG_TARGET(ECHONL),
1350    FLAG_TARGET(NOFLSH),
1351    FLAG_TARGET(TOSTOP),
1352    FLAG_TARGET(ECHOCTL),
1353    FLAG_TARGET(ECHOPRT),
1354    FLAG_TARGET(ECHOKE),
1355    FLAG_TARGET(FLUSHO),
1356    FLAG_TARGET(PENDIN),
1357    FLAG_TARGET(IEXTEN),
1358    FLAG_TARGET(EXTPROC),
1359    FLAG_END,
1360};
1361
1362UNUSED static struct flags mlockall_flags[] = {
1363    FLAG_TARGET(MCL_CURRENT),
1364    FLAG_TARGET(MCL_FUTURE),
1365#ifdef MCL_ONFAULT
1366    FLAG_TARGET(MCL_ONFAULT),
1367#endif
1368    FLAG_END,
1369};
1370
1371/* IDs of the various system clocks */
1372#define TARGET_CLOCK_REALTIME              0
1373#define TARGET_CLOCK_MONOTONIC             1
1374#define TARGET_CLOCK_PROCESS_CPUTIME_ID    2
1375#define TARGET_CLOCK_THREAD_CPUTIME_ID     3
1376#define TARGET_CLOCK_MONOTONIC_RAW         4
1377#define TARGET_CLOCK_REALTIME_COARSE       5
1378#define TARGET_CLOCK_MONOTONIC_COARSE      6
1379#define TARGET_CLOCK_BOOTTIME              7
1380#define TARGET_CLOCK_REALTIME_ALARM        8
1381#define TARGET_CLOCK_BOOTTIME_ALARM        9
1382#define TARGET_CLOCK_SGI_CYCLE             10
1383#define TARGET_CLOCK_TAI                   11
1384
1385UNUSED static struct enums clockids[] = {
1386    ENUM_TARGET(CLOCK_REALTIME),
1387    ENUM_TARGET(CLOCK_MONOTONIC),
1388    ENUM_TARGET(CLOCK_PROCESS_CPUTIME_ID),
1389    ENUM_TARGET(CLOCK_THREAD_CPUTIME_ID),
1390    ENUM_TARGET(CLOCK_MONOTONIC_RAW),
1391    ENUM_TARGET(CLOCK_REALTIME_COARSE),
1392    ENUM_TARGET(CLOCK_MONOTONIC_COARSE),
1393    ENUM_TARGET(CLOCK_BOOTTIME),
1394    ENUM_TARGET(CLOCK_REALTIME_ALARM),
1395    ENUM_TARGET(CLOCK_BOOTTIME_ALARM),
1396    ENUM_TARGET(CLOCK_SGI_CYCLE),
1397    ENUM_TARGET(CLOCK_TAI),
1398    ENUM_END,
1399};
1400
1401UNUSED static struct enums itimer_types[] = {
1402    ENUM_GENERIC(ITIMER_REAL),
1403    ENUM_GENERIC(ITIMER_VIRTUAL),
1404    ENUM_GENERIC(ITIMER_PROF),
1405    ENUM_END,
1406};
1407
1408/*
1409 * print_xxx utility functions.  These are used to print syscall
1410 * parameters in certain format.  All of these have parameter
1411 * named 'last'.  This parameter is used to add comma to output
1412 * when last == 0.
1413 */
1414
1415static const char *
1416get_comma(int last)
1417{
1418    return ((last) ? "" : ",");
1419}
1420
1421static void
1422print_flags(const struct flags *f, abi_long flags, int last)
1423{
1424    const char *sep = "";
1425    int n;
1426
1427    if ((flags == 0) && (f->f_value == 0)) {
1428        qemu_log("%s%s", f->f_string, get_comma(last));
1429        return;
1430    }
1431    for (n = 0; f->f_string != NULL; f++) {
1432        if ((f->f_value != 0) && ((flags & f->f_value) == f->f_value)) {
1433            qemu_log("%s%s", sep, f->f_string);
1434            flags &= ~f->f_value;
1435            sep = "|";
1436            n++;
1437        }
1438    }
1439
1440    if (n > 0) {
1441        /* print rest of the flags as numeric */
1442        if (flags != 0) {
1443            qemu_log("%s%#x%s", sep, (unsigned int)flags, get_comma(last));
1444        } else {
1445            qemu_log("%s", get_comma(last));
1446        }
1447    } else {
1448        /* no string version of flags found, print them in hex then */
1449        qemu_log("%#x%s", (unsigned int)flags, get_comma(last));
1450    }
1451}
1452
1453static void
1454print_enums(const struct enums *e, abi_long enum_arg, int last)
1455{
1456    for (; e->e_string != NULL; e++) {
1457        if (e->e_value == enum_arg) {
1458            qemu_log("%s", e->e_string);
1459            break;
1460        }
1461    }
1462
1463    if (e->e_string == NULL) {
1464        qemu_log("%#x", (unsigned int)enum_arg);
1465    }
1466
1467    qemu_log("%s", get_comma(last));
1468}
1469
1470static void
1471print_at_dirfd(abi_long dirfd, int last)
1472{
1473#ifdef AT_FDCWD
1474    if (dirfd == AT_FDCWD) {
1475        qemu_log("AT_FDCWD%s", get_comma(last));
1476        return;
1477    }
1478#endif
1479    qemu_log("%d%s", (int)dirfd, get_comma(last));
1480}
1481
1482static void
1483print_file_mode(abi_long mode, int last)
1484{
1485    const char *sep = "";
1486    const struct flags *m;
1487
1488    for (m = &mode_flags[0]; m->f_string != NULL; m++) {
1489        if ((m->f_value & mode) == m->f_value) {
1490            qemu_log("%s%s", m->f_string, sep);
1491            sep = "|";
1492            mode &= ~m->f_value;
1493            break;
1494        }
1495    }
1496
1497    mode &= ~S_IFMT;
1498    /* print rest of the mode as octal */
1499    if (mode != 0)
1500        qemu_log("%s%#o", sep, (unsigned int)mode);
1501
1502    qemu_log("%s", get_comma(last));
1503}
1504
1505static void
1506print_open_flags(abi_long flags, int last)
1507{
1508    print_flags(open_access_flags, flags & TARGET_O_ACCMODE, 1);
1509    flags &= ~TARGET_O_ACCMODE;
1510    if (flags == 0) {
1511        qemu_log("%s", get_comma(last));
1512        return;
1513    }
1514    qemu_log("|");
1515    print_flags(open_flags, flags, last);
1516}
1517
1518static void
1519print_syscall_prologue(const struct syscallname *sc)
1520{
1521    qemu_log("%s(", sc->name);
1522}
1523
1524/*ARGSUSED*/
1525static void
1526print_syscall_epilogue(const struct syscallname *sc)
1527{
1528    (void)sc;
1529    qemu_log(")");
1530}
1531
1532static void
1533print_string(abi_long addr, int last)
1534{
1535    char *s;
1536
1537    if ((s = lock_user_string(addr)) != NULL) {
1538        qemu_log("\"%s\"%s", s, get_comma(last));
1539        unlock_user(s, addr, 0);
1540    } else {
1541        /* can't get string out of it, so print it as pointer */
1542        print_pointer(addr, last);
1543    }
1544}
1545
1546#define MAX_PRINT_BUF 40
1547static void
1548print_buf(abi_long addr, abi_long len, int last)
1549{
1550    uint8_t *s;
1551    int i;
1552
1553    s = lock_user(VERIFY_READ, addr, len, 1);
1554    if (s) {
1555        qemu_log("\"");
1556        for (i = 0; i < MAX_PRINT_BUF && i < len; i++) {
1557            if (isprint(s[i])) {
1558                qemu_log("%c", s[i]);
1559            } else {
1560                qemu_log("\\%o", s[i]);
1561            }
1562        }
1563        qemu_log("\"");
1564        if (i != len) {
1565            qemu_log("...");
1566        }
1567        if (!last) {
1568            qemu_log(",");
1569        }
1570        unlock_user(s, addr, 0);
1571    } else {
1572        print_pointer(addr, last);
1573    }
1574}
1575
1576/*
1577 * Prints out raw parameter using given format.  Caller needs
1578 * to do byte swapping if needed.
1579 */
1580static void
1581print_raw_param(const char *fmt, abi_long param, int last)
1582{
1583    char format[64];
1584
1585    (void) snprintf(format, sizeof (format), "%s%s", fmt, get_comma(last));
1586    qemu_log(format, param);
1587}
1588
1589static void
1590print_pointer(abi_long p, int last)
1591{
1592    if (p == 0)
1593        qemu_log("NULL%s", get_comma(last));
1594    else
1595        qemu_log("0x" TARGET_ABI_FMT_lx "%s", p, get_comma(last));
1596}
1597
1598/*
1599 * Reads 32-bit (int) number from guest address space from
1600 * address 'addr' and prints it.
1601 */
1602static void
1603print_number(abi_long addr, int last)
1604{
1605    if (addr == 0) {
1606        qemu_log("NULL%s", get_comma(last));
1607    } else {
1608        int num;
1609
1610        get_user_s32(num, addr);
1611        qemu_log("[%d]%s", num, get_comma(last));
1612    }
1613}
1614
1615static void
1616print_timeval(abi_ulong tv_addr, int last)
1617{
1618    if( tv_addr ) {
1619        struct target_timeval *tv;
1620
1621        tv = lock_user(VERIFY_READ, tv_addr, sizeof(*tv), 1);
1622        if (!tv) {
1623            print_pointer(tv_addr, last);
1624            return;
1625        }
1626        qemu_log("{tv_sec = " TARGET_ABI_FMT_ld
1627                 ",tv_usec = " TARGET_ABI_FMT_ld "}%s",
1628                 tswapal(tv->tv_sec), tswapal(tv->tv_usec), get_comma(last));
1629        unlock_user(tv, tv_addr, 0);
1630    } else
1631        qemu_log("NULL%s", get_comma(last));
1632}
1633
1634static void
1635print_timespec(abi_ulong ts_addr, int last)
1636{
1637    if (ts_addr) {
1638        struct target_timespec *ts;
1639
1640        ts = lock_user(VERIFY_READ, ts_addr, sizeof(*ts), 1);
1641        if (!ts) {
1642            print_pointer(ts_addr, last);
1643            return;
1644        }
1645        qemu_log("{tv_sec = " TARGET_ABI_FMT_ld
1646                 ",tv_nsec = " TARGET_ABI_FMT_ld "}%s",
1647                 tswapal(ts->tv_sec), tswapal(ts->tv_nsec), get_comma(last));
1648        unlock_user(ts, ts_addr, 0);
1649    } else {
1650        qemu_log("NULL%s", get_comma(last));
1651    }
1652}
1653
1654static void
1655print_timezone(abi_ulong tz_addr, int last)
1656{
1657    if (tz_addr) {
1658        struct target_timezone *tz;
1659
1660        tz = lock_user(VERIFY_READ, tz_addr, sizeof(*tz), 1);
1661        if (!tz) {
1662            print_pointer(tz_addr, last);
1663            return;
1664        }
1665        qemu_log("{%d,%d}%s", tswap32(tz->tz_minuteswest),
1666                 tswap32(tz->tz_dsttime), get_comma(last));
1667        unlock_user(tz, tz_addr, 0);
1668    } else {
1669        qemu_log("NULL%s", get_comma(last));
1670    }
1671}
1672
1673static void
1674print_itimerval(abi_ulong it_addr, int last)
1675{
1676    if (it_addr) {
1677        qemu_log("{it_interval=");
1678        print_timeval(it_addr +
1679                      offsetof(struct target_itimerval, it_interval), 0);
1680        qemu_log("it_value=");
1681        print_timeval(it_addr +
1682                      offsetof(struct target_itimerval, it_value), 0);
1683        qemu_log("}%s", get_comma(last));
1684    } else {
1685        qemu_log("NULL%s", get_comma(last));
1686    }
1687}
1688
1689void
1690print_termios(void *arg)
1691{
1692    const struct target_termios *target = arg;
1693
1694    target_tcflag_t iflags = tswap32(target->c_iflag);
1695    target_tcflag_t oflags = tswap32(target->c_oflag);
1696    target_tcflag_t cflags = tswap32(target->c_cflag);
1697    target_tcflag_t lflags = tswap32(target->c_lflag);
1698
1699    qemu_log("{");
1700
1701    qemu_log("c_iflag = ");
1702    print_flags(termios_iflags, iflags, 0);
1703
1704    qemu_log("c_oflag = ");
1705    target_tcflag_t oflags_clean =  oflags & ~(TARGET_NLDLY | TARGET_CRDLY |
1706                                               TARGET_TABDLY | TARGET_BSDLY |
1707                                               TARGET_VTDLY | TARGET_FFDLY);
1708    print_flags(termios_oflags, oflags_clean, 0);
1709    if (oflags & TARGET_NLDLY) {
1710        print_enums(termios_oflags_NLDLY, oflags & TARGET_NLDLY, 0);
1711    }
1712    if (oflags & TARGET_CRDLY) {
1713        print_enums(termios_oflags_CRDLY, oflags & TARGET_CRDLY, 0);
1714    }
1715    if (oflags & TARGET_TABDLY) {
1716        print_enums(termios_oflags_TABDLY, oflags & TARGET_TABDLY, 0);
1717    }
1718    if (oflags & TARGET_BSDLY) {
1719        print_enums(termios_oflags_BSDLY, oflags & TARGET_BSDLY, 0);
1720    }
1721    if (oflags & TARGET_VTDLY) {
1722        print_enums(termios_oflags_VTDLY, oflags & TARGET_VTDLY, 0);
1723    }
1724    if (oflags & TARGET_FFDLY) {
1725        print_enums(termios_oflags_FFDLY, oflags & TARGET_FFDLY, 0);
1726    }
1727
1728    qemu_log("c_cflag = ");
1729    if (cflags & TARGET_CBAUD) {
1730        print_enums(termios_cflags_CBAUD, cflags & TARGET_CBAUD, 0);
1731    }
1732    if (cflags & TARGET_CSIZE) {
1733        print_enums(termios_cflags_CSIZE, cflags & TARGET_CSIZE, 0);
1734    }
1735    target_tcflag_t cflags_clean = cflags & ~(TARGET_CBAUD | TARGET_CSIZE);
1736    print_flags(termios_cflags, cflags_clean, 0);
1737
1738    qemu_log("c_lflag = ");
1739    print_flags(termios_lflags, lflags, 0);
1740
1741    qemu_log("c_cc = ");
1742    qemu_log("\"%s\",", target->c_cc);
1743
1744    qemu_log("c_line = ");
1745    print_raw_param("\'%c\'", target->c_line, 1);
1746
1747    qemu_log("}");
1748}
1749
1750#undef UNUSED
1751
1752#ifdef TARGET_NR_accept
1753static void
1754print_accept(void *cpu_env, const struct syscallname *name,
1755             abi_long arg0, abi_long arg1, abi_long arg2,
1756             abi_long arg3, abi_long arg4, abi_long arg5)
1757{
1758    print_syscall_prologue(name);
1759    print_raw_param("%d", arg0, 0);
1760    print_pointer(arg1, 0);
1761    print_number(arg2, 1);
1762    print_syscall_epilogue(name);
1763}
1764#endif
1765
1766#ifdef TARGET_NR_access
1767static void
1768print_access(void *cpu_env, const struct syscallname *name,
1769             abi_long arg0, abi_long arg1, abi_long arg2,
1770             abi_long arg3, abi_long arg4, abi_long arg5)
1771{
1772    print_syscall_prologue(name);
1773    print_string(arg0, 0);
1774    print_flags(access_flags, arg1, 1);
1775    print_syscall_epilogue(name);
1776}
1777#endif
1778
1779#ifdef TARGET_NR_acct
1780static void
1781print_acct(void *cpu_env, const struct syscallname *name,
1782           abi_long arg0, abi_long arg1, abi_long arg2,
1783           abi_long arg3, abi_long arg4, abi_long arg5)
1784{
1785    print_syscall_prologue(name);
1786    print_string(arg0, 1);
1787    print_syscall_epilogue(name);
1788}
1789#endif
1790
1791#ifdef TARGET_NR_brk
1792static void
1793print_brk(void *cpu_env, const struct syscallname *name,
1794          abi_long arg0, abi_long arg1, abi_long arg2,
1795          abi_long arg3, abi_long arg4, abi_long arg5)
1796{
1797    print_syscall_prologue(name);
1798    print_pointer(arg0, 1);
1799    print_syscall_epilogue(name);
1800}
1801#endif
1802
1803#ifdef TARGET_NR_chdir
1804static void
1805print_chdir(void *cpu_env, const struct syscallname *name,
1806            abi_long arg0, abi_long arg1, abi_long arg2,
1807            abi_long arg3, abi_long arg4, abi_long arg5)
1808{
1809    print_syscall_prologue(name);
1810    print_string(arg0, 1);
1811    print_syscall_epilogue(name);
1812}
1813#endif
1814
1815#ifdef TARGET_NR_chroot
1816static void
1817print_chroot(void *cpu_env, const struct syscallname *name,
1818             abi_long arg0, abi_long arg1, abi_long arg2,
1819             abi_long arg3, abi_long arg4, abi_long arg5)
1820{
1821    print_syscall_prologue(name);
1822    print_string(arg0, 1);
1823    print_syscall_epilogue(name);
1824}
1825#endif
1826
1827#ifdef TARGET_NR_chmod
1828static void
1829print_chmod(void *cpu_env, const struct syscallname *name,
1830            abi_long arg0, abi_long arg1, abi_long arg2,
1831            abi_long arg3, abi_long arg4, abi_long arg5)
1832{
1833    print_syscall_prologue(name);
1834    print_string(arg0, 0);
1835    print_file_mode(arg1, 1);
1836    print_syscall_epilogue(name);
1837}
1838#endif
1839
1840#if defined(TARGET_NR_chown) || defined(TARGET_NR_lchown)
1841static void
1842print_chown(void *cpu_env, const struct syscallname *name,
1843            abi_long arg0, abi_long arg1, abi_long arg2,
1844            abi_long arg3, abi_long arg4, abi_long arg5)
1845{
1846    print_syscall_prologue(name);
1847    print_string(arg0, 0);
1848    print_raw_param("%d", arg1, 0);
1849    print_raw_param("%d", arg2, 1);
1850    print_syscall_epilogue(name);
1851}
1852#define print_lchown     print_chown
1853#endif
1854
1855#ifdef TARGET_NR_clock_adjtime
1856static void
1857print_clock_adjtime(void *cpu_env, const struct syscallname *name,
1858                    abi_long arg0, abi_long arg1, abi_long arg2,
1859                    abi_long arg3, abi_long arg4, abi_long arg5)
1860{
1861    print_syscall_prologue(name);
1862    print_enums(clockids, arg0, 0);
1863    print_pointer(arg1, 1);
1864    print_syscall_epilogue(name);
1865}
1866#endif
1867
1868#ifdef TARGET_NR_clone
1869static void do_print_clone(unsigned int flags, abi_ulong newsp,
1870                           abi_ulong parent_tidptr, target_ulong newtls,
1871                           abi_ulong child_tidptr)
1872{
1873    print_flags(clone_flags, flags, 0);
1874    print_raw_param("child_stack=0x" TARGET_ABI_FMT_lx, newsp, 0);
1875    print_raw_param("parent_tidptr=0x" TARGET_ABI_FMT_lx, parent_tidptr, 0);
1876    print_raw_param("tls=0x" TARGET_ABI_FMT_lx, newtls, 0);
1877    print_raw_param("child_tidptr=0x" TARGET_ABI_FMT_lx, child_tidptr, 1);
1878}
1879
1880static void
1881print_clone(void *cpu_env, const struct syscallname *name,
1882            abi_long arg1, abi_long arg2, abi_long arg3,
1883            abi_long arg4, abi_long arg5, abi_long arg6)
1884{
1885    print_syscall_prologue(name);
1886#if defined(TARGET_MICROBLAZE)
1887    do_print_clone(arg1, arg2, arg4, arg6, arg5);
1888#elif defined(TARGET_CLONE_BACKWARDS)
1889    do_print_clone(arg1, arg2, arg3, arg4, arg5);
1890#elif defined(TARGET_CLONE_BACKWARDS2)
1891    do_print_clone(arg2, arg1, arg3, arg5, arg4);
1892#else
1893    do_print_clone(arg1, arg2, arg3, arg5, arg4);
1894#endif
1895    print_syscall_epilogue(name);
1896}
1897#endif
1898
1899#ifdef TARGET_NR_creat
1900static void
1901print_creat(void *cpu_env, const struct syscallname *name,
1902            abi_long arg0, abi_long arg1, abi_long arg2,
1903            abi_long arg3, abi_long arg4, abi_long arg5)
1904{
1905    print_syscall_prologue(name);
1906    print_string(arg0, 0);
1907    print_file_mode(arg1, 1);
1908    print_syscall_epilogue(name);
1909}
1910#endif
1911
1912#ifdef TARGET_NR_execv
1913static void
1914print_execv(void *cpu_env, const struct syscallname *name,
1915            abi_long arg0, abi_long arg1, abi_long arg2,
1916            abi_long arg3, abi_long arg4, abi_long arg5)
1917{
1918    print_syscall_prologue(name);
1919    print_string(arg0, 0);
1920    print_raw_param("0x" TARGET_ABI_FMT_lx, arg1, 1);
1921    print_syscall_epilogue(name);
1922}
1923#endif
1924
1925#ifdef TARGET_NR_faccessat
1926static void
1927print_faccessat(void *cpu_env, const struct syscallname *name,
1928                abi_long arg0, abi_long arg1, abi_long arg2,
1929                abi_long arg3, abi_long arg4, abi_long arg5)
1930{
1931    print_syscall_prologue(name);
1932    print_at_dirfd(arg0, 0);
1933    print_string(arg1, 0);
1934    print_flags(access_flags, arg2, 0);
1935    print_flags(at_file_flags, arg3, 1);
1936    print_syscall_epilogue(name);
1937}
1938#endif
1939
1940#ifdef TARGET_NR_fallocate
1941static void
1942print_fallocate(void *cpu_env, const struct syscallname *name,
1943                abi_long arg0, abi_long arg1, abi_long arg2,
1944                abi_long arg3, abi_long arg4, abi_long arg5)
1945{
1946    print_syscall_prologue(name);
1947    print_raw_param("%d", arg0, 0);
1948    print_flags(falloc_flags, arg1, 0);
1949#if TARGET_ABI_BITS == 32
1950    print_raw_param("%" PRIu64, target_offset64(arg2, arg3), 0);
1951    print_raw_param("%" PRIu64, target_offset64(arg4, arg5), 1);
1952#else
1953    print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
1954    print_raw_param(TARGET_ABI_FMT_ld, arg3, 1);
1955#endif
1956    print_syscall_epilogue(name);
1957}
1958#endif
1959
1960#ifdef TARGET_NR_fchmodat
1961static void
1962print_fchmodat(void *cpu_env, const struct syscallname *name,
1963               abi_long arg0, abi_long arg1, abi_long arg2,
1964               abi_long arg3, abi_long arg4, abi_long arg5)
1965{
1966    print_syscall_prologue(name);
1967    print_at_dirfd(arg0, 0);
1968    print_string(arg1, 0);
1969    print_file_mode(arg2, 0);
1970    print_flags(at_file_flags, arg3, 1);
1971    print_syscall_epilogue(name);
1972}
1973#endif
1974
1975#ifdef TARGET_NR_fchownat
1976static void
1977print_fchownat(void *cpu_env, const struct syscallname *name,
1978               abi_long arg0, abi_long arg1, abi_long arg2,
1979               abi_long arg3, abi_long arg4, abi_long arg5)
1980{
1981    print_syscall_prologue(name);
1982    print_at_dirfd(arg0, 0);
1983    print_string(arg1, 0);
1984    print_raw_param("%d", arg2, 0);
1985    print_raw_param("%d", arg3, 0);
1986    print_flags(at_file_flags, arg4, 1);
1987    print_syscall_epilogue(name);
1988}
1989#endif
1990
1991#if defined(TARGET_NR_fcntl) || defined(TARGET_NR_fcntl64)
1992static void
1993print_fcntl(void *cpu_env, const struct syscallname *name,
1994            abi_long arg0, abi_long arg1, abi_long arg2,
1995            abi_long arg3, abi_long arg4, abi_long arg5)
1996{
1997    print_syscall_prologue(name);
1998    print_raw_param("%d", arg0, 0);
1999    switch(arg1) {
2000    case TARGET_F_DUPFD:
2001        qemu_log("F_DUPFD,");
2002        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
2003        break;
2004    case TARGET_F_GETFD:
2005        qemu_log("F_GETFD");
2006        break;
2007    case TARGET_F_SETFD:
2008        qemu_log("F_SETFD,");
2009        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
2010        break;
2011    case TARGET_F_GETFL:
2012        qemu_log("F_GETFL");
2013        break;
2014    case TARGET_F_SETFL:
2015        qemu_log("F_SETFL,");
2016        print_open_flags(arg2, 1);
2017        break;
2018    case TARGET_F_GETLK:
2019        qemu_log("F_GETLK,");
2020        print_pointer(arg2, 1);
2021        break;
2022    case TARGET_F_SETLK:
2023        qemu_log("F_SETLK,");
2024        print_pointer(arg2, 1);
2025        break;
2026    case TARGET_F_SETLKW:
2027        qemu_log("F_SETLKW,");
2028        print_pointer(arg2, 1);
2029        break;
2030    case TARGET_F_GETOWN:
2031        qemu_log("F_GETOWN");
2032        break;
2033    case TARGET_F_SETOWN:
2034        qemu_log("F_SETOWN,");
2035        print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
2036        break;
2037    case TARGET_F_GETSIG:
2038        qemu_log("F_GETSIG");
2039        break;
2040    case TARGET_F_SETSIG:
2041        qemu_log("F_SETSIG,");
2042        print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
2043        break;
2044#if TARGET_ABI_BITS == 32
2045    case TARGET_F_GETLK64:
2046        qemu_log("F_GETLK64,");
2047        print_pointer(arg2, 1);
2048        break;
2049    case TARGET_F_SETLK64:
2050        qemu_log("F_SETLK64,");
2051        print_pointer(arg2, 1);
2052        break;
2053    case TARGET_F_SETLKW64:
2054        qemu_log("F_SETLKW64,");
2055        print_pointer(arg2, 1);
2056        break;
2057#endif
2058    case TARGET_F_OFD_GETLK:
2059        qemu_log("F_OFD_GETLK,");
2060        print_pointer(arg2, 1);
2061        break;
2062    case TARGET_F_OFD_SETLK:
2063        qemu_log("F_OFD_SETLK,");
2064        print_pointer(arg2, 1);
2065        break;
2066    case TARGET_F_OFD_SETLKW:
2067        qemu_log("F_OFD_SETLKW,");
2068        print_pointer(arg2, 1);
2069        break;
2070    case TARGET_F_SETLEASE:
2071        qemu_log("F_SETLEASE,");
2072        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
2073        break;
2074    case TARGET_F_GETLEASE:
2075        qemu_log("F_GETLEASE");
2076        break;
2077#ifdef F_DUPFD_CLOEXEC
2078    case TARGET_F_DUPFD_CLOEXEC:
2079        qemu_log("F_DUPFD_CLOEXEC,");
2080        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
2081        break;
2082#endif
2083    case TARGET_F_NOTIFY:
2084        qemu_log("F_NOTIFY,");
2085        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
2086        break;
2087#ifdef F_GETOWN_EX
2088    case TARGET_F_GETOWN_EX:
2089        qemu_log("F_GETOWN_EX,");
2090        print_pointer(arg2, 1);
2091        break;
2092#endif
2093#ifdef F_SETOWN_EX
2094    case TARGET_F_SETOWN_EX:
2095        qemu_log("F_SETOWN_EX,");
2096        print_pointer(arg2, 1);
2097        break;
2098#endif
2099#ifdef F_SETPIPE_SZ
2100    case TARGET_F_SETPIPE_SZ:
2101        qemu_log("F_SETPIPE_SZ,");
2102        print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
2103        break;
2104    case TARGET_F_GETPIPE_SZ:
2105        qemu_log("F_GETPIPE_SZ");
2106        break;
2107#endif
2108#ifdef F_ADD_SEALS
2109    case TARGET_F_ADD_SEALS:
2110        qemu_log("F_ADD_SEALS,");
2111        print_raw_param("0x"TARGET_ABI_FMT_lx, arg2, 1);
2112        break;
2113    case TARGET_F_GET_SEALS:
2114        qemu_log("F_GET_SEALS");
2115        break;
2116#endif
2117    default:
2118        print_raw_param(TARGET_ABI_FMT_ld, arg1, 0);
2119        print_pointer(arg2, 1);
2120        break;
2121    }
2122    print_syscall_epilogue(name);
2123}
2124#define print_fcntl64   print_fcntl
2125#endif
2126
2127#ifdef TARGET_NR_fgetxattr
2128static void
2129print_fgetxattr(void *cpu_env, const struct syscallname *name,
2130                abi_long arg0, abi_long arg1, abi_long arg2,
2131                abi_long arg3, abi_long arg4, abi_long arg5)
2132{
2133    print_syscall_prologue(name);
2134    print_raw_param("%d", arg0, 0);
2135    print_string(arg1, 0);
2136    print_pointer(arg2, 0);
2137    print_raw_param(TARGET_FMT_lu, arg3, 1);
2138    print_syscall_epilogue(name);
2139}
2140#endif
2141
2142#ifdef TARGET_NR_flistxattr
2143static void
2144print_flistxattr(void *cpu_env, const struct syscallname *name,
2145                 abi_long arg0, abi_long arg1, abi_long arg2,
2146                 abi_long arg3, abi_long arg4, abi_long arg5)
2147{
2148    print_syscall_prologue(name);
2149    print_raw_param("%d", arg0, 0);
2150    print_pointer(arg1, 0);
2151    print_raw_param(TARGET_FMT_lu, arg2, 1);
2152    print_syscall_epilogue(name);
2153}
2154#endif
2155
2156#if defined(TARGET_NR_getxattr) || defined(TARGET_NR_lgetxattr)
2157static void
2158print_getxattr(void *cpu_env, const struct syscallname *name,
2159               abi_long arg0, abi_long arg1, abi_long arg2,
2160               abi_long arg3, abi_long arg4, abi_long arg5)
2161{
2162    print_syscall_prologue(name);
2163    print_string(arg0, 0);
2164    print_string(arg1, 0);
2165    print_pointer(arg2, 0);
2166    print_raw_param(TARGET_FMT_lu, arg3, 1);
2167    print_syscall_epilogue(name);
2168}
2169#define print_lgetxattr     print_getxattr
2170#endif
2171
2172#if defined(TARGET_NR_listxattr) || defined(TARGET_NR_llistxattr)
2173static void
2174print_listxattr(void *cpu_env, const struct syscallname *name,
2175                abi_long arg0, abi_long arg1, abi_long arg2,
2176                abi_long arg3, abi_long arg4, abi_long arg5)
2177{
2178    print_syscall_prologue(name);
2179    print_string(arg0, 0);
2180    print_pointer(arg1, 0);
2181    print_raw_param(TARGET_FMT_lu, arg2, 1);
2182    print_syscall_epilogue(name);
2183}
2184#define print_llistxattr     print_listxattr
2185#endif
2186
2187#if defined(TARGET_NR_fremovexattr)
2188static void
2189print_fremovexattr(void *cpu_env, const struct syscallname *name,
2190                   abi_long arg0, abi_long arg1, abi_long arg2,
2191                   abi_long arg3, abi_long arg4, abi_long arg5)
2192{
2193    print_syscall_prologue(name);
2194    print_raw_param("%d", arg0, 0);
2195    print_string(arg1, 1);
2196    print_syscall_epilogue(name);
2197}
2198#endif
2199
2200#if defined(TARGET_NR_removexattr) || defined(TARGET_NR_lremovexattr)
2201static void
2202print_removexattr(void *cpu_env, const struct syscallname *name,
2203                  abi_long arg0, abi_long arg1, abi_long arg2,
2204                  abi_long arg3, abi_long arg4, abi_long arg5)
2205{
2206    print_syscall_prologue(name);
2207    print_string(arg0, 0);
2208    print_string(arg1, 1);
2209    print_syscall_epilogue(name);
2210}
2211#define print_lremovexattr     print_removexattr
2212#endif
2213
2214#ifdef TARGET_NR_futimesat
2215static void
2216print_futimesat(void *cpu_env, const struct syscallname *name,
2217                abi_long arg0, abi_long arg1, abi_long arg2,
2218                abi_long arg3, abi_long arg4, abi_long arg5)
2219{
2220    print_syscall_prologue(name);
2221    print_at_dirfd(arg0, 0);
2222    print_string(arg1, 0);
2223    print_timeval(arg2, 0);
2224    print_timeval(arg2 + sizeof (struct target_timeval), 1);
2225    print_syscall_epilogue(name);
2226}
2227#endif
2228
2229#ifdef TARGET_NR_gettimeofday
2230static void
2231print_gettimeofday(void *cpu_env, const struct syscallname *name,
2232                   abi_long arg0, abi_long arg1, abi_long arg2,
2233                   abi_long arg3, abi_long arg4, abi_long arg5)
2234{
2235    print_syscall_prologue(name);
2236    print_pointer(arg0, 0);
2237    print_pointer(arg1, 1);
2238    print_syscall_epilogue(name);
2239}
2240#endif
2241
2242#ifdef TARGET_NR_settimeofday
2243static void
2244print_settimeofday(void *cpu_env, const struct syscallname *name,
2245                   abi_long arg0, abi_long arg1, abi_long arg2,
2246                   abi_long arg3, abi_long arg4, abi_long arg5)
2247{
2248    print_syscall_prologue(name);
2249    print_timeval(arg0, 0);
2250    print_timezone(arg1, 1);
2251    print_syscall_epilogue(name);
2252}
2253#endif
2254
2255#if defined(TARGET_NR_clock_gettime) || defined(TARGET_NR_clock_getres)
2256static void
2257print_clock_gettime(void *cpu_env, const struct syscallname *name,
2258                    abi_long arg0, abi_long arg1, abi_long arg2,
2259                    abi_long arg3, abi_long arg4, abi_long arg5)
2260{
2261    print_syscall_prologue(name);
2262    print_enums(clockids, arg0, 0);
2263    print_pointer(arg1, 1);
2264    print_syscall_epilogue(name);
2265}
2266#define print_clock_getres     print_clock_gettime
2267#endif
2268
2269#ifdef TARGET_NR_clock_settime
2270static void
2271print_clock_settime(void *cpu_env, const struct syscallname *name,
2272                    abi_long arg0, abi_long arg1, abi_long arg2,
2273                    abi_long arg3, abi_long arg4, abi_long arg5)
2274{
2275    print_syscall_prologue(name);
2276    print_enums(clockids, arg0, 0);
2277    print_timespec(arg1, 1);
2278    print_syscall_epilogue(name);
2279}
2280#endif
2281
2282#ifdef TARGET_NR_getitimer
2283static void
2284print_getitimer(void *cpu_env, const struct syscallname *name,
2285                abi_long arg0, abi_long arg1, abi_long arg2,
2286                abi_long arg3, abi_long arg4, abi_long arg5)
2287{
2288    print_syscall_prologue(name);
2289    print_enums(itimer_types, arg0, 0);
2290    print_pointer(arg1, 1);
2291    print_syscall_epilogue(name);
2292}
2293#endif
2294
2295#ifdef TARGET_NR_setitimer
2296static void
2297print_setitimer(void *cpu_env, const struct syscallname *name,
2298                abi_long arg0, abi_long arg1, abi_long arg2,
2299                abi_long arg3, abi_long arg4, abi_long arg5)
2300{
2301    print_syscall_prologue(name);
2302    print_enums(itimer_types, arg0, 0);
2303    print_itimerval(arg1, 0);
2304    print_pointer(arg2, 1);
2305    print_syscall_epilogue(name);
2306}
2307#endif
2308
2309#ifdef TARGET_NR_link
2310static void
2311print_link(void *cpu_env, const struct syscallname *name,
2312           abi_long arg0, abi_long arg1, abi_long arg2,
2313           abi_long arg3, abi_long arg4, abi_long arg5)
2314{
2315    print_syscall_prologue(name);
2316    print_string(arg0, 0);
2317    print_string(arg1, 1);
2318    print_syscall_epilogue(name);
2319}
2320#endif
2321
2322#ifdef TARGET_NR_linkat
2323static void
2324print_linkat(void *cpu_env, const struct syscallname *name,
2325             abi_long arg0, abi_long arg1, abi_long arg2,
2326             abi_long arg3, abi_long arg4, abi_long arg5)
2327{
2328    print_syscall_prologue(name);
2329    print_at_dirfd(arg0, 0);
2330    print_string(arg1, 0);
2331    print_at_dirfd(arg2, 0);
2332    print_string(arg3, 0);
2333    print_flags(at_file_flags, arg4, 1);
2334    print_syscall_epilogue(name);
2335}
2336#endif
2337
2338#ifdef TARGET_NR__llseek
2339static void
2340print__llseek(void *cpu_env, const struct syscallname *name,
2341              abi_long arg0, abi_long arg1, abi_long arg2,
2342              abi_long arg3, abi_long arg4, abi_long arg5)
2343{
2344    const char *whence = "UNKNOWN";
2345    print_syscall_prologue(name);
2346    print_raw_param("%d", arg0, 0);
2347    print_raw_param("%ld", arg1, 0);
2348    print_raw_param("%ld", arg2, 0);
2349    print_pointer(arg3, 0);
2350    switch(arg4) {
2351    case SEEK_SET: whence = "SEEK_SET"; break;
2352    case SEEK_CUR: whence = "SEEK_CUR"; break;
2353    case SEEK_END: whence = "SEEK_END"; break;
2354    }
2355    qemu_log("%s", whence);
2356    print_syscall_epilogue(name);
2357}
2358#endif
2359
2360#ifdef TARGET_NR_lseek
2361static void
2362print_lseek(void *cpu_env, const struct syscallname *name,
2363            abi_long arg0, abi_long arg1, abi_long arg2,
2364            abi_long arg3, abi_long arg4, abi_long arg5)
2365{
2366    print_syscall_prologue(name);
2367    print_raw_param("%d", arg0, 0);
2368    print_raw_param(TARGET_ABI_FMT_ld, arg1, 0);
2369    switch (arg2) {
2370    case SEEK_SET:
2371        qemu_log("SEEK_SET"); break;
2372    case SEEK_CUR:
2373        qemu_log("SEEK_CUR"); break;
2374    case SEEK_END:
2375        qemu_log("SEEK_END"); break;
2376#ifdef SEEK_DATA
2377    case SEEK_DATA:
2378        qemu_log("SEEK_DATA"); break;
2379#endif
2380#ifdef SEEK_HOLE
2381    case SEEK_HOLE:
2382        qemu_log("SEEK_HOLE"); break;
2383#endif
2384    default:
2385        print_raw_param("%#x", arg2, 1);
2386    }
2387    print_syscall_epilogue(name);
2388}
2389#endif
2390
2391#ifdef TARGET_NR_truncate
2392static void
2393print_truncate(void *cpu_env, const struct syscallname *name,
2394               abi_long arg0, abi_long arg1, abi_long arg2,
2395               abi_long arg3, abi_long arg4, abi_long arg5)
2396{
2397    print_syscall_prologue(name);
2398    print_string(arg0, 0);
2399    print_raw_param(TARGET_ABI_FMT_ld, arg1, 1);
2400    print_syscall_epilogue(name);
2401}
2402#endif
2403
2404#ifdef TARGET_NR_truncate64
2405static void
2406print_truncate64(void *cpu_env, const struct syscallname *name,
2407                 abi_long arg0, abi_long arg1, abi_long arg2,
2408                 abi_long arg3, abi_long arg4, abi_long arg5)
2409{
2410    print_syscall_prologue(name);
2411    print_string(arg0, 0);
2412    if (regpairs_aligned(cpu_env, TARGET_NR_truncate64)) {
2413        arg1 = arg2;
2414        arg2 = arg3;
2415    }
2416    print_raw_param("%" PRIu64, target_offset64(arg1, arg2), 1);
2417    print_syscall_epilogue(name);
2418}
2419#endif
2420
2421#ifdef TARGET_NR_ftruncate64
2422static void
2423print_ftruncate64(void *cpu_env, const struct syscallname *name,
2424                  abi_long arg0, abi_long arg1, abi_long arg2,
2425                  abi_long arg3, abi_long arg4, abi_long arg5)
2426{
2427    print_syscall_prologue(name);
2428    print_raw_param("%d", arg0, 0);
2429    if (regpairs_aligned(cpu_env, TARGET_NR_ftruncate64)) {
2430        arg1 = arg2;
2431        arg2 = arg3;
2432    }
2433    print_raw_param("%" PRIu64, target_offset64(arg1, arg2), 1);
2434    print_syscall_epilogue(name);
2435}
2436#endif
2437
2438#ifdef TARGET_NR_mlockall
2439static void
2440print_mlockall(void *cpu_env, const struct syscallname *name,
2441               abi_long arg0, abi_long arg1, abi_long arg2,
2442               abi_long arg3, abi_long arg4, abi_long arg5)
2443{
2444    print_syscall_prologue(name);
2445    print_flags(mlockall_flags, arg0, 1);
2446    print_syscall_epilogue(name);
2447}
2448#endif
2449
2450#if defined(TARGET_NR_socket)
2451static void
2452print_socket(void *cpu_env, const struct syscallname *name,
2453             abi_long arg0, abi_long arg1, abi_long arg2,
2454             abi_long arg3, abi_long arg4, abi_long arg5)
2455{
2456    abi_ulong domain = arg0, type = arg1, protocol = arg2;
2457
2458    print_syscall_prologue(name);
2459    print_socket_domain(domain);
2460    qemu_log(",");
2461    print_socket_type(type);
2462    qemu_log(",");
2463    if (domain == AF_PACKET ||
2464        (domain == AF_INET && type == TARGET_SOCK_PACKET)) {
2465        protocol = tswap16(protocol);
2466    }
2467    print_socket_protocol(domain, type, protocol);
2468    print_syscall_epilogue(name);
2469}
2470
2471#endif
2472
2473#if defined(TARGET_NR_socketcall) || defined(TARGET_NR_bind)
2474
2475static void print_sockfd(abi_long sockfd, int last)
2476{
2477    print_raw_param(TARGET_ABI_FMT_ld, sockfd, last);
2478}
2479
2480#endif
2481
2482#if defined(TARGET_NR_socketcall)
2483
2484#define get_user_ualx(x, gaddr, idx) \
2485        get_user_ual(x, (gaddr) + (idx) * sizeof(abi_long))
2486
2487static void do_print_socket(const char *name, abi_long arg1)
2488{
2489    abi_ulong domain, type, protocol;
2490
2491    get_user_ualx(domain, arg1, 0);
2492    get_user_ualx(type, arg1, 1);
2493    get_user_ualx(protocol, arg1, 2);
2494    qemu_log("%s(", name);
2495    print_socket_domain(domain);
2496    qemu_log(",");
2497    print_socket_type(type);
2498    qemu_log(",");
2499    if (domain == AF_PACKET ||
2500        (domain == AF_INET && type == TARGET_SOCK_PACKET)) {
2501        protocol = tswap16(protocol);
2502    }
2503    print_socket_protocol(domain, type, protocol);
2504    qemu_log(")");
2505}
2506
2507static void do_print_sockaddr(const char *name, abi_long arg1)
2508{
2509    abi_ulong sockfd, addr, addrlen;
2510
2511    get_user_ualx(sockfd, arg1, 0);
2512    get_user_ualx(addr, arg1, 1);
2513    get_user_ualx(addrlen, arg1, 2);
2514
2515    qemu_log("%s(", name);
2516    print_sockfd(sockfd, 0);
2517    print_sockaddr(addr, addrlen, 0);
2518    qemu_log(")");
2519}
2520
2521static void do_print_listen(const char *name, abi_long arg1)
2522{
2523    abi_ulong sockfd, backlog;
2524
2525    get_user_ualx(sockfd, arg1, 0);
2526    get_user_ualx(backlog, arg1, 1);
2527
2528    qemu_log("%s(", name);
2529    print_sockfd(sockfd, 0);
2530    print_raw_param(TARGET_ABI_FMT_ld, backlog, 1);
2531    qemu_log(")");
2532}
2533
2534static void do_print_socketpair(const char *name, abi_long arg1)
2535{
2536    abi_ulong domain, type, protocol, tab;
2537
2538    get_user_ualx(domain, arg1, 0);
2539    get_user_ualx(type, arg1, 1);
2540    get_user_ualx(protocol, arg1, 2);
2541    get_user_ualx(tab, arg1, 3);
2542
2543    qemu_log("%s(", name);
2544    print_socket_domain(domain);
2545    qemu_log(",");
2546    print_socket_type(type);
2547    qemu_log(",");
2548    print_socket_protocol(domain, type, protocol);
2549    qemu_log(",");
2550    print_raw_param(TARGET_ABI_FMT_lx, tab, 1);
2551    qemu_log(")");
2552}
2553
2554static void do_print_sendrecv(const char *name, abi_long arg1)
2555{
2556    abi_ulong sockfd, msg, len, flags;
2557
2558    get_user_ualx(sockfd, arg1, 0);
2559    get_user_ualx(msg, arg1, 1);
2560    get_user_ualx(len, arg1, 2);
2561    get_user_ualx(flags, arg1, 3);
2562
2563    qemu_log("%s(", name);
2564    print_sockfd(sockfd, 0);
2565    print_buf(msg, len, 0);
2566    print_raw_param(TARGET_ABI_FMT_ld, len, 0);
2567    print_flags(msg_flags, flags, 1);
2568    qemu_log(")");
2569}
2570
2571static void do_print_msgaddr(const char *name, abi_long arg1)
2572{
2573    abi_ulong sockfd, msg, len, flags, addr, addrlen;
2574
2575    get_user_ualx(sockfd, arg1, 0);
2576    get_user_ualx(msg, arg1, 1);
2577    get_user_ualx(len, arg1, 2);
2578    get_user_ualx(flags, arg1, 3);
2579    get_user_ualx(addr, arg1, 4);
2580    get_user_ualx(addrlen, arg1, 5);
2581
2582    qemu_log("%s(", name);
2583    print_sockfd(sockfd, 0);
2584    print_buf(msg, len, 0);
2585    print_raw_param(TARGET_ABI_FMT_ld, len, 0);
2586    print_flags(msg_flags, flags, 0);
2587    print_sockaddr(addr, addrlen, 0);
2588    qemu_log(")");
2589}
2590
2591static void do_print_shutdown(const char *name, abi_long arg1)
2592{
2593    abi_ulong sockfd, how;
2594
2595    get_user_ualx(sockfd, arg1, 0);
2596    get_user_ualx(how, arg1, 1);
2597
2598    qemu_log("shutdown(");
2599    print_sockfd(sockfd, 0);
2600    switch (how) {
2601    case SHUT_RD:
2602        qemu_log("SHUT_RD");
2603        break;
2604    case SHUT_WR:
2605        qemu_log("SHUT_WR");
2606        break;
2607    case SHUT_RDWR:
2608        qemu_log("SHUT_RDWR");
2609        break;
2610    default:
2611        print_raw_param(TARGET_ABI_FMT_ld, how, 1);
2612        break;
2613    }
2614    qemu_log(")");
2615}
2616
2617static void do_print_msg(const char *name, abi_long arg1)
2618{
2619    abi_ulong sockfd, msg, flags;
2620
2621    get_user_ualx(sockfd, arg1, 0);
2622    get_user_ualx(msg, arg1, 1);
2623    get_user_ualx(flags, arg1, 2);
2624
2625    qemu_log("%s(", name);
2626    print_sockfd(sockfd, 0);
2627    print_pointer(msg, 0);
2628    print_flags(msg_flags, flags, 1);
2629    qemu_log(")");
2630}
2631
2632static void do_print_sockopt(const char *name, abi_long arg1)
2633{
2634    abi_ulong sockfd, level, optname, optval, optlen;
2635
2636    get_user_ualx(sockfd, arg1, 0);
2637    get_user_ualx(level, arg1, 1);
2638    get_user_ualx(optname, arg1, 2);
2639    get_user_ualx(optval, arg1, 3);
2640    get_user_ualx(optlen, arg1, 4);
2641
2642    qemu_log("%s(", name);
2643    print_sockfd(sockfd, 0);
2644    switch (level) {
2645    case SOL_TCP:
2646        qemu_log("SOL_TCP,");
2647        print_raw_param(TARGET_ABI_FMT_ld, optname, 0);
2648        print_pointer(optval, 0);
2649        break;
2650    case SOL_UDP:
2651        qemu_log("SOL_UDP,");
2652        print_raw_param(TARGET_ABI_FMT_ld, optname, 0);
2653        print_pointer(optval, 0);
2654        break;
2655    case SOL_IP:
2656        qemu_log("SOL_IP,");
2657        print_raw_param(TARGET_ABI_FMT_ld, optname, 0);
2658        print_pointer(optval, 0);
2659        break;
2660    case SOL_RAW:
2661        qemu_log("SOL_RAW,");
2662        print_raw_param(TARGET_ABI_FMT_ld, optname, 0);
2663        print_pointer(optval, 0);
2664        break;
2665    case TARGET_SOL_SOCKET:
2666        qemu_log("SOL_SOCKET,");
2667        switch (optname) {
2668        case TARGET_SO_DEBUG:
2669            qemu_log("SO_DEBUG,");
2670print_optint:
2671            print_number(optval, 0);
2672            break;
2673        case TARGET_SO_REUSEADDR:
2674            qemu_log("SO_REUSEADDR,");
2675            goto print_optint;
2676        case TARGET_SO_REUSEPORT:
2677            qemu_log("SO_REUSEPORT,");
2678            goto print_optint;
2679        case TARGET_SO_TYPE:
2680            qemu_log("SO_TYPE,");
2681            goto print_optint;
2682        case TARGET_SO_ERROR:
2683            qemu_log("SO_ERROR,");
2684            goto print_optint;
2685        case TARGET_SO_DONTROUTE:
2686            qemu_log("SO_DONTROUTE,");
2687            goto print_optint;
2688        case TARGET_SO_BROADCAST:
2689            qemu_log("SO_BROADCAST,");
2690            goto print_optint;
2691        case TARGET_SO_SNDBUF:
2692            qemu_log("SO_SNDBUF,");
2693            goto print_optint;
2694        case TARGET_SO_RCVBUF:
2695            qemu_log("SO_RCVBUF,");
2696            goto print_optint;
2697        case TARGET_SO_KEEPALIVE:
2698            qemu_log("SO_KEEPALIVE,");
2699            goto print_optint;
2700        case TARGET_SO_OOBINLINE:
2701            qemu_log("SO_OOBINLINE,");
2702            goto print_optint;
2703        case TARGET_SO_NO_CHECK:
2704            qemu_log("SO_NO_CHECK,");
2705            goto print_optint;
2706        case TARGET_SO_PRIORITY:
2707            qemu_log("SO_PRIORITY,");
2708            goto print_optint;
2709        case TARGET_SO_BSDCOMPAT:
2710            qemu_log("SO_BSDCOMPAT,");
2711            goto print_optint;
2712        case TARGET_SO_PASSCRED:
2713            qemu_log("SO_PASSCRED,");
2714            goto print_optint;
2715        case TARGET_SO_TIMESTAMP:
2716            qemu_log("SO_TIMESTAMP,");
2717            goto print_optint;
2718        case TARGET_SO_RCVLOWAT:
2719            qemu_log("SO_RCVLOWAT,");
2720            goto print_optint;
2721        case TARGET_SO_RCVTIMEO:
2722            qemu_log("SO_RCVTIMEO,");
2723            print_timeval(optval, 0);
2724            break;
2725        case TARGET_SO_SNDTIMEO:
2726            qemu_log("SO_SNDTIMEO,");
2727            print_timeval(optval, 0);
2728            break;
2729        case TARGET_SO_ATTACH_FILTER: {
2730            struct target_sock_fprog *fprog;
2731
2732            qemu_log("SO_ATTACH_FILTER,");
2733
2734            if (lock_user_struct(VERIFY_READ, fprog, optval,  0)) {
2735                struct target_sock_filter *filter;
2736                qemu_log("{");
2737                if (lock_user_struct(VERIFY_READ, filter,
2738                                     tswapal(fprog->filter),  0)) {
2739                    int i;
2740                    for (i = 0; i < tswap16(fprog->len) - 1; i++) {
2741                        qemu_log("[%d]{0x%x,%d,%d,0x%x},",
2742                                 i, tswap16(filter[i].code),
2743                                 filter[i].jt, filter[i].jf,
2744                                 tswap32(filter[i].k));
2745                    }
2746                    qemu_log("[%d]{0x%x,%d,%d,0x%x}",
2747                             i, tswap16(filter[i].code),
2748                             filter[i].jt, filter[i].jf,
2749                             tswap32(filter[i].k));
2750                } else {
2751                    qemu_log(TARGET_ABI_FMT_lx, tswapal(fprog->filter));
2752                }
2753                qemu_log(",%d},", tswap16(fprog->len));
2754                unlock_user(fprog, optval, 0);
2755            } else {
2756                print_pointer(optval, 0);
2757            }
2758            break;
2759        }
2760        default:
2761            print_raw_param(TARGET_ABI_FMT_ld, optname, 0);
2762            print_pointer(optval, 0);
2763            break;
2764        }
2765        break;
2766    case SOL_IPV6:
2767        qemu_log("SOL_IPV6,");
2768        switch (optname) {
2769        case IPV6_MTU_DISCOVER:
2770            qemu_log("IPV6_MTU_DISCOVER,");
2771            goto print_optint;
2772        case IPV6_MTU:
2773            qemu_log("IPV6_MTU,");
2774            goto print_optint;
2775        case IPV6_V6ONLY:
2776            qemu_log("IPV6_V6ONLY,");
2777            goto print_optint;
2778        case IPV6_RECVPKTINFO:
2779            qemu_log("IPV6_RECVPKTINFO,");
2780            goto print_optint;
2781        case IPV6_UNICAST_HOPS:
2782            qemu_log("IPV6_UNICAST_HOPS,");
2783            goto print_optint;
2784        case IPV6_MULTICAST_HOPS:
2785            qemu_log("IPV6_MULTICAST_HOPS,");
2786            goto print_optint;
2787        case IPV6_MULTICAST_LOOP:
2788            qemu_log("IPV6_MULTICAST_LOOP,");
2789            goto print_optint;
2790        case IPV6_RECVERR:
2791            qemu_log("IPV6_RECVERR,");
2792            goto print_optint;
2793        case IPV6_RECVHOPLIMIT:
2794            qemu_log("IPV6_RECVHOPLIMIT,");
2795            goto print_optint;
2796        case IPV6_2292HOPLIMIT:
2797            qemu_log("IPV6_2292HOPLIMIT,");
2798            goto print_optint;
2799        case IPV6_CHECKSUM:
2800            qemu_log("IPV6_CHECKSUM,");
2801            goto print_optint;
2802        case IPV6_ADDRFORM:
2803            qemu_log("IPV6_ADDRFORM,");
2804            goto print_optint;
2805        case IPV6_2292PKTINFO:
2806            qemu_log("IPV6_2292PKTINFO,");
2807            goto print_optint;
2808        case IPV6_RECVTCLASS:
2809            qemu_log("IPV6_RECVTCLASS,");
2810            goto print_optint;
2811        case IPV6_RECVRTHDR:
2812            qemu_log("IPV6_RECVRTHDR,");
2813            goto print_optint;
2814        case IPV6_2292RTHDR:
2815            qemu_log("IPV6_2292RTHDR,");
2816            goto print_optint;
2817        case IPV6_RECVHOPOPTS:
2818            qemu_log("IPV6_RECVHOPOPTS,");
2819            goto print_optint;
2820        case IPV6_2292HOPOPTS:
2821            qemu_log("IPV6_2292HOPOPTS,");
2822            goto print_optint;
2823        case IPV6_RECVDSTOPTS:
2824            qemu_log("IPV6_RECVDSTOPTS,");
2825            goto print_optint;
2826        case IPV6_2292DSTOPTS:
2827            qemu_log("IPV6_2292DSTOPTS,");
2828            goto print_optint;
2829        case IPV6_TCLASS:
2830            qemu_log("IPV6_TCLASS,");
2831            goto print_optint;
2832        case IPV6_ADDR_PREFERENCES:
2833            qemu_log("IPV6_ADDR_PREFERENCES,");
2834            goto print_optint;
2835#ifdef IPV6_RECVPATHMTU
2836        case IPV6_RECVPATHMTU:
2837            qemu_log("IPV6_RECVPATHMTU,");
2838            goto print_optint;
2839#endif
2840#ifdef IPV6_TRANSPARENT
2841        case IPV6_TRANSPARENT:
2842            qemu_log("IPV6_TRANSPARENT,");
2843            goto print_optint;
2844#endif
2845#ifdef IPV6_FREEBIND
2846        case IPV6_FREEBIND:
2847            qemu_log("IPV6_FREEBIND,");
2848            goto print_optint;
2849#endif
2850#ifdef IPV6_RECVORIGDSTADDR
2851        case IPV6_RECVORIGDSTADDR:
2852            qemu_log("IPV6_RECVORIGDSTADDR,");
2853            goto print_optint;
2854#endif
2855        case IPV6_PKTINFO:
2856            qemu_log("IPV6_PKTINFO,");
2857            print_pointer(optval, 0);
2858            break;
2859        case IPV6_ADD_MEMBERSHIP:
2860            qemu_log("IPV6_ADD_MEMBERSHIP,");
2861            print_pointer(optval, 0);
2862            break;
2863        case IPV6_DROP_MEMBERSHIP:
2864            qemu_log("IPV6_DROP_MEMBERSHIP,");
2865            print_pointer(optval, 0);
2866            break;
2867        default:
2868            print_raw_param(TARGET_ABI_FMT_ld, optname, 0);
2869            print_pointer(optval, 0);
2870            break;
2871        }
2872        break;
2873    default:
2874        print_raw_param(TARGET_ABI_FMT_ld, level, 0);
2875        print_raw_param(TARGET_ABI_FMT_ld, optname, 0);
2876        print_pointer(optval, 0);
2877        break;
2878    }
2879    print_raw_param(TARGET_ABI_FMT_ld, optlen, 1);
2880    qemu_log(")");
2881}
2882
2883#define PRINT_SOCKOP(name, func) \
2884    [TARGET_SYS_##name] = { #name, func }
2885
2886static struct {
2887    const char *name;
2888    void (*print)(const char *, abi_long);
2889} scall[] = {
2890    PRINT_SOCKOP(SOCKET, do_print_socket),
2891    PRINT_SOCKOP(BIND, do_print_sockaddr),
2892    PRINT_SOCKOP(CONNECT, do_print_sockaddr),
2893    PRINT_SOCKOP(LISTEN, do_print_listen),
2894    PRINT_SOCKOP(ACCEPT, do_print_sockaddr),
2895    PRINT_SOCKOP(GETSOCKNAME, do_print_sockaddr),
2896    PRINT_SOCKOP(GETPEERNAME, do_print_sockaddr),
2897    PRINT_SOCKOP(SOCKETPAIR, do_print_socketpair),
2898    PRINT_SOCKOP(SEND, do_print_sendrecv),
2899    PRINT_SOCKOP(RECV, do_print_sendrecv),
2900    PRINT_SOCKOP(SENDTO, do_print_msgaddr),
2901    PRINT_SOCKOP(RECVFROM, do_print_msgaddr),
2902    PRINT_SOCKOP(SHUTDOWN, do_print_shutdown),
2903    PRINT_SOCKOP(SETSOCKOPT, do_print_sockopt),
2904    PRINT_SOCKOP(GETSOCKOPT, do_print_sockopt),
2905    PRINT_SOCKOP(SENDMSG, do_print_msg),
2906    PRINT_SOCKOP(RECVMSG, do_print_msg),
2907    PRINT_SOCKOP(ACCEPT4, NULL),
2908    PRINT_SOCKOP(RECVMMSG, NULL),
2909    PRINT_SOCKOP(SENDMMSG, NULL),
2910};
2911
2912static void
2913print_socketcall(void *cpu_env, const struct syscallname *name,
2914                 abi_long arg0, abi_long arg1, abi_long arg2,
2915                 abi_long arg3, abi_long arg4, abi_long arg5)
2916{
2917    if (arg0 >= 0 && arg0 < ARRAY_SIZE(scall) && scall[arg0].print) {
2918        scall[arg0].print(scall[arg0].name, arg1);
2919        return;
2920    }
2921    print_syscall_prologue(name);
2922    print_raw_param(TARGET_ABI_FMT_ld, arg0, 0);
2923    print_raw_param(TARGET_ABI_FMT_ld, arg1, 0);
2924    print_raw_param(TARGET_ABI_FMT_ld, arg2, 0);
2925    print_raw_param(TARGET_ABI_FMT_ld, arg3, 0);
2926    print_raw_param(TARGET_ABI_FMT_ld, arg4, 0);
2927    print_raw_param(TARGET_ABI_FMT_ld, arg5, 0);
2928    print_syscall_epilogue(name);
2929}
2930#endif
2931
2932#if defined(TARGET_NR_bind)
2933static void
2934print_bind(void *cpu_env, const struct syscallname *name,
2935           abi_long arg0, abi_long arg1, abi_long arg2,
2936           abi_long arg3, abi_long arg4, abi_long arg5)
2937{
2938    print_syscall_prologue(name);
2939    print_sockfd(arg0, 0);
2940    print_sockaddr(arg1, arg2, 1);
2941    print_syscall_epilogue(name);
2942}
2943#endif
2944
2945#if defined(TARGET_NR_stat) || defined(TARGET_NR_stat64) || \
2946    defined(TARGET_NR_lstat) || defined(TARGET_NR_lstat64)
2947static void
2948print_stat(void *cpu_env, const struct syscallname *name,
2949           abi_long arg0, abi_long arg1, abi_long arg2,
2950           abi_long arg3, abi_long arg4, abi_long arg5)
2951{
2952    print_syscall_prologue(name);
2953    print_string(arg0, 0);
2954    print_pointer(arg1, 1);
2955    print_syscall_epilogue(name);
2956}
2957#define print_lstat     print_stat
2958#define print_stat64    print_stat
2959#define print_lstat64   print_stat
2960#endif
2961
2962#if defined(TARGET_NR_fstat) || defined(TARGET_NR_fstat64)
2963static void
2964print_fstat(void *cpu_env, const struct syscallname *name,
2965            abi_long arg0, abi_long arg1, abi_long arg2,
2966            abi_long arg3, abi_long arg4, abi_long arg5)
2967{
2968    print_syscall_prologue(name);
2969    print_raw_param("%d", arg0, 0);
2970    print_pointer(arg1, 1);
2971    print_syscall_epilogue(name);
2972}
2973#define print_fstat64     print_fstat
2974#endif
2975
2976#ifdef TARGET_NR_mkdir
2977static void
2978print_mkdir(void *cpu_env, const struct syscallname *name,
2979            abi_long arg0, abi_long arg1, abi_long arg2,
2980            abi_long arg3, abi_long arg4, abi_long arg5)
2981{
2982    print_syscall_prologue(name);
2983    print_string(arg0, 0);
2984    print_file_mode(arg1, 1);
2985    print_syscall_epilogue(name);
2986}
2987#endif
2988
2989#ifdef TARGET_NR_mkdirat
2990static void
2991print_mkdirat(void *cpu_env, const struct syscallname *name,
2992              abi_long arg0, abi_long arg1, abi_long arg2,
2993              abi_long arg3, abi_long arg4, abi_long arg5)
2994{
2995    print_syscall_prologue(name);
2996    print_at_dirfd(arg0, 0);
2997    print_string(arg1, 0);
2998    print_file_mode(arg2, 1);
2999    print_syscall_epilogue(name);
3000}
3001#endif
3002
3003#ifdef TARGET_NR_rmdir
3004static void
3005print_rmdir(void *cpu_env, const struct syscallname *name,
3006            abi_long arg0, abi_long arg1, abi_long arg2,
3007            abi_long arg3, abi_long arg4, abi_long arg5)
3008{
3009    print_syscall_prologue(name);
3010    print_string(arg0, 0);
3011    print_syscall_epilogue(name);
3012}
3013#endif
3014
3015#ifdef TARGET_NR_rt_sigaction
3016static void
3017print_rt_sigaction(void *cpu_env, const struct syscallname *name,
3018                   abi_long arg0, abi_long arg1, abi_long arg2,
3019                   abi_long arg3, abi_long arg4, abi_long arg5)
3020{
3021    print_syscall_prologue(name);
3022    print_signal(arg0, 0);
3023    print_pointer(arg1, 0);
3024    print_pointer(arg2, 1);
3025    print_syscall_epilogue(name);
3026}
3027#endif
3028
3029#ifdef TARGET_NR_rt_sigprocmask
3030static void
3031print_rt_sigprocmask(void *cpu_env, const struct syscallname *name,
3032                     abi_long arg0, abi_long arg1, abi_long arg2,
3033                     abi_long arg3, abi_long arg4, abi_long arg5)
3034{
3035    const char *how = "UNKNOWN";
3036    print_syscall_prologue(name);
3037    switch(arg0) {
3038    case TARGET_SIG_BLOCK: how = "SIG_BLOCK"; break;
3039    case TARGET_SIG_UNBLOCK: how = "SIG_UNBLOCK"; break;
3040    case TARGET_SIG_SETMASK: how = "SIG_SETMASK"; break;
3041    }
3042    qemu_log("%s,", how);
3043    print_pointer(arg1, 0);
3044    print_pointer(arg2, 1);
3045    print_syscall_epilogue(name);
3046}
3047#endif
3048
3049#ifdef TARGET_NR_rt_sigqueueinfo
3050static void
3051print_rt_sigqueueinfo(void *cpu_env, const struct syscallname *name,
3052                      abi_long arg0, abi_long arg1, abi_long arg2,
3053                      abi_long arg3, abi_long arg4, abi_long arg5)
3054{
3055    void *p;
3056    target_siginfo_t uinfo;
3057
3058    print_syscall_prologue(name);
3059    print_raw_param("%d", arg0, 0);
3060    print_signal(arg1, 0);
3061    p = lock_user(VERIFY_READ, arg2, sizeof(target_siginfo_t), 1);
3062    if (p) {
3063        get_target_siginfo(&uinfo, p);
3064        print_siginfo(&uinfo);
3065
3066        unlock_user(p, arg2, 0);
3067    } else {
3068        print_pointer(arg2, 1);
3069    }
3070    print_syscall_epilogue(name);
3071}
3072#endif
3073
3074#ifdef TARGET_NR_rt_tgsigqueueinfo
3075static void
3076print_rt_tgsigqueueinfo(void *cpu_env, const struct syscallname *name,
3077                        abi_long arg0, abi_long arg1, abi_long arg2,
3078                        abi_long arg3, abi_long arg4, abi_long arg5)
3079{
3080    void *p;
3081    target_siginfo_t uinfo;
3082
3083    print_syscall_prologue(name);
3084    print_raw_param("%d", arg0, 0);
3085    print_raw_param("%d", arg1, 0);
3086    print_signal(arg2, 0);
3087    p = lock_user(VERIFY_READ, arg3, sizeof(target_siginfo_t), 1);
3088    if (p) {
3089        get_target_siginfo(&uinfo, p);
3090        print_siginfo(&uinfo);
3091
3092        unlock_user(p, arg3, 0);
3093    } else {
3094        print_pointer(arg3, 1);
3095    }
3096    print_syscall_epilogue(name);
3097}
3098#endif
3099
3100#ifdef TARGET_NR_syslog
3101static void
3102print_syslog_action(abi_ulong arg, int last)
3103{
3104    const char *type;
3105
3106    switch (arg) {
3107        case TARGET_SYSLOG_ACTION_CLOSE: {
3108            type = "SYSLOG_ACTION_CLOSE";
3109            break;
3110        }
3111        case TARGET_SYSLOG_ACTION_OPEN: {
3112            type = "SYSLOG_ACTION_OPEN";
3113            break;
3114        }
3115        case TARGET_SYSLOG_ACTION_READ: {
3116            type = "SYSLOG_ACTION_READ";
3117            break;
3118        }
3119        case TARGET_SYSLOG_ACTION_READ_ALL: {
3120            type = "SYSLOG_ACTION_READ_ALL";
3121            break;
3122        }
3123        case TARGET_SYSLOG_ACTION_READ_CLEAR: {
3124            type = "SYSLOG_ACTION_READ_CLEAR";
3125            break;
3126        }
3127        case TARGET_SYSLOG_ACTION_CLEAR: {
3128            type = "SYSLOG_ACTION_CLEAR";
3129            break;
3130        }
3131        case TARGET_SYSLOG_ACTION_CONSOLE_OFF: {
3132            type = "SYSLOG_ACTION_CONSOLE_OFF";
3133            break;
3134        }
3135        case TARGET_SYSLOG_ACTION_CONSOLE_ON: {
3136            type = "SYSLOG_ACTION_CONSOLE_ON";
3137            break;
3138        }
3139        case TARGET_SYSLOG_ACTION_CONSOLE_LEVEL: {
3140            type = "SYSLOG_ACTION_CONSOLE_LEVEL";
3141            break;
3142        }
3143        case TARGET_SYSLOG_ACTION_SIZE_UNREAD: {
3144            type = "SYSLOG_ACTION_SIZE_UNREAD";
3145            break;
3146        }
3147        case TARGET_SYSLOG_ACTION_SIZE_BUFFER: {
3148            type = "SYSLOG_ACTION_SIZE_BUFFER";
3149            break;
3150        }
3151        default: {
3152            print_raw_param("%ld", arg, last);
3153            return;
3154        }
3155    }
3156    qemu_log("%s%s", type, get_comma(last));
3157}
3158
3159static void
3160print_syslog(void *cpu_env, const struct syscallname *name,
3161             abi_long arg0, abi_long arg1, abi_long arg2,
3162             abi_long arg3, abi_long arg4, abi_long arg5)
3163{
3164    print_syscall_prologue(name);
3165    print_syslog_action(arg0, 0);
3166    print_pointer(arg1, 0);
3167    print_raw_param("%d", arg2, 1);
3168    print_syscall_epilogue(name);
3169}
3170#endif
3171
3172#ifdef TARGET_NR_mknod
3173static void
3174print_mknod(void *cpu_env, const struct syscallname *name,
3175            abi_long arg0, abi_long arg1, abi_long arg2,
3176            abi_long arg3, abi_long arg4, abi_long arg5)
3177{
3178    int hasdev = (arg1 & (S_IFCHR|S_IFBLK));
3179
3180    print_syscall_prologue(name);
3181    print_string(arg0, 0);
3182    print_file_mode(arg1, (hasdev == 0));
3183    if (hasdev) {
3184        print_raw_param("makedev(%d", major(arg2), 0);
3185        print_raw_param("%d)", minor(arg2), 1);
3186    }
3187    print_syscall_epilogue(name);
3188}
3189#endif
3190
3191#ifdef TARGET_NR_mknodat
3192static void
3193print_mknodat(void *cpu_env, const struct syscallname *name,
3194              abi_long arg0, abi_long arg1, abi_long arg2,
3195              abi_long arg3, abi_long arg4, abi_long arg5)
3196{
3197    int hasdev = (arg2 & (S_IFCHR|S_IFBLK));
3198
3199    print_syscall_prologue(name);
3200    print_at_dirfd(arg0, 0);
3201    print_string(arg1, 0);
3202    print_file_mode(arg2, (hasdev == 0));
3203    if (hasdev) {
3204        print_raw_param("makedev(%d", major(arg3), 0);
3205        print_raw_param("%d)", minor(arg3), 1);
3206    }
3207    print_syscall_epilogue(name);
3208}
3209#endif
3210
3211#ifdef TARGET_NR_mq_open
3212static void
3213print_mq_open(void *cpu_env, const struct syscallname *name,
3214              abi_long arg0, abi_long arg1, abi_long arg2,
3215              abi_long arg3, abi_long arg4, abi_long arg5)
3216{
3217    int is_creat = (arg1 & TARGET_O_CREAT);
3218
3219    print_syscall_prologue(name);
3220    print_string(arg0, 0);
3221    print_open_flags(arg1, (is_creat == 0));
3222    if (is_creat) {
3223        print_file_mode(arg2, 0);
3224        print_pointer(arg3, 1);
3225    }
3226    print_syscall_epilogue(name);
3227}
3228#endif
3229
3230#ifdef TARGET_NR_open
3231static void
3232print_open(void *cpu_env, const struct syscallname *name,
3233           abi_long arg0, abi_long arg1, abi_long arg2,
3234           abi_long arg3, abi_long arg4, abi_long arg5)
3235{
3236    int is_creat = (arg1 & TARGET_O_CREAT);
3237
3238    print_syscall_prologue(name);
3239    print_string(arg0, 0);
3240    print_open_flags(arg1, (is_creat == 0));
3241    if (is_creat)
3242        print_file_mode(arg2, 1);
3243    print_syscall_epilogue(name);
3244}
3245#endif
3246
3247#ifdef TARGET_NR_openat
3248static void
3249print_openat(void *cpu_env, const struct syscallname *name,
3250             abi_long arg0, abi_long arg1, abi_long arg2,
3251             abi_long arg3, abi_long arg4, abi_long arg5)
3252{
3253    int is_creat = (arg2 & TARGET_O_CREAT);
3254
3255    print_syscall_prologue(name);
3256    print_at_dirfd(arg0, 0);
3257    print_string(arg1, 0);
3258    print_open_flags(arg2, (is_creat == 0));
3259    if (is_creat)
3260        print_file_mode(arg3, 1);
3261    print_syscall_epilogue(name);
3262}
3263#endif
3264
3265#ifdef TARGET_NR_mq_unlink
3266static void
3267print_mq_unlink(void *cpu_env, const struct syscallname *name,
3268                abi_long arg0, abi_long arg1, abi_long arg2,
3269                abi_long arg3, abi_long arg4, abi_long arg5)
3270{
3271    print_syscall_prologue(name);
3272    print_string(arg0, 1);
3273    print_syscall_epilogue(name);
3274}
3275#endif
3276
3277#if defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat)
3278static void
3279print_fstatat64(void *cpu_env, const struct syscallname *name,
3280                abi_long arg0, abi_long arg1, abi_long arg2,
3281                abi_long arg3, abi_long arg4, abi_long arg5)
3282{
3283    print_syscall_prologue(name);
3284    print_at_dirfd(arg0, 0);
3285    print_string(arg1, 0);
3286    print_pointer(arg2, 0);
3287    print_flags(at_file_flags, arg3, 1);
3288    print_syscall_epilogue(name);
3289}
3290#define print_newfstatat    print_fstatat64
3291#endif
3292
3293#ifdef TARGET_NR_readlink
3294static void
3295print_readlink(void *cpu_env, const struct syscallname *name,
3296               abi_long arg0, abi_long arg1, abi_long arg2,
3297               abi_long arg3, abi_long arg4, abi_long arg5)
3298{
3299    print_syscall_prologue(name);
3300    print_string(arg0, 0);
3301    print_pointer(arg1, 0);
3302    print_raw_param("%u", arg2, 1);
3303    print_syscall_epilogue(name);
3304}
3305#endif
3306
3307#ifdef TARGET_NR_readlinkat
3308static void
3309print_readlinkat(void *cpu_env, const struct syscallname *name,
3310                 abi_long arg0, abi_long arg1, abi_long arg2,
3311                 abi_long arg3, abi_long arg4, abi_long arg5)
3312{
3313    print_syscall_prologue(name);
3314    print_at_dirfd(arg0, 0);
3315    print_string(arg1, 0);
3316    print_pointer(arg2, 0);
3317    print_raw_param("%u", arg3, 1);
3318    print_syscall_epilogue(name);
3319}
3320#endif
3321
3322#ifdef TARGET_NR_rename
3323static void
3324print_rename(void *cpu_env, const struct syscallname *name,
3325             abi_long arg0, abi_long arg1, abi_long arg2,
3326             abi_long arg3, abi_long arg4, abi_long arg5)
3327{
3328    print_syscall_prologue(name);
3329    print_string(arg0, 0);
3330    print_string(arg1, 1);
3331    print_syscall_epilogue(name);
3332}
3333#endif
3334
3335#ifdef TARGET_NR_renameat
3336static void
3337print_renameat(void *cpu_env, const struct syscallname *name,
3338               abi_long arg0, abi_long arg1, abi_long arg2,
3339               abi_long arg3, abi_long arg4, abi_long arg5)
3340{
3341    print_syscall_prologue(name);
3342    print_at_dirfd(arg0, 0);
3343    print_string(arg1, 0);
3344    print_at_dirfd(arg2, 0);
3345    print_string(arg3, 1);
3346    print_syscall_epilogue(name);
3347}
3348#endif
3349
3350#ifdef TARGET_NR_statfs
3351static void
3352print_statfs(void *cpu_env, const struct syscallname *name,
3353             abi_long arg0, abi_long arg1, abi_long arg2,
3354             abi_long arg3, abi_long arg4, abi_long arg5)
3355{
3356    print_syscall_prologue(name);
3357    print_string(arg0, 0);
3358    print_pointer(arg1, 1);
3359    print_syscall_epilogue(name);
3360}
3361#endif
3362
3363#ifdef TARGET_NR_statfs64
3364static void
3365print_statfs64(void *cpu_env, const struct syscallname *name,
3366               abi_long arg0, abi_long arg1, abi_long arg2,
3367               abi_long arg3, abi_long arg4, abi_long arg5)
3368{
3369    print_syscall_prologue(name);
3370    print_string(arg0, 0);
3371    print_pointer(arg1, 1);
3372    print_syscall_epilogue(name);
3373}
3374#endif
3375
3376#ifdef TARGET_NR_symlink
3377static void
3378print_symlink(void *cpu_env, const struct syscallname *name,
3379              abi_long arg0, abi_long arg1, abi_long arg2,
3380              abi_long arg3, abi_long arg4, abi_long arg5)
3381{
3382    print_syscall_prologue(name);
3383    print_string(arg0, 0);
3384    print_string(arg1, 1);
3385    print_syscall_epilogue(name);
3386}
3387#endif
3388
3389#ifdef TARGET_NR_symlinkat
3390static void
3391print_symlinkat(void *cpu_env, const struct syscallname *name,
3392                abi_long arg0, abi_long arg1, abi_long arg2,
3393                abi_long arg3, abi_long arg4, abi_long arg5)
3394{
3395    print_syscall_prologue(name);
3396    print_string(arg0, 0);
3397    print_at_dirfd(arg1, 0);
3398    print_string(arg2, 1);
3399    print_syscall_epilogue(name);
3400}
3401#endif
3402
3403#ifdef TARGET_NR_mount
3404static void
3405print_mount(void *cpu_env, const struct syscallname *name,
3406            abi_long arg0, abi_long arg1, abi_long arg2,
3407            abi_long arg3, abi_long arg4, abi_long arg5)
3408{
3409    print_syscall_prologue(name);
3410    print_string(arg0, 0);
3411    print_string(arg1, 0);
3412    print_string(arg2, 0);
3413    print_flags(mount_flags, arg3, 0);
3414    print_pointer(arg4, 1);
3415    print_syscall_epilogue(name);
3416}
3417#endif
3418
3419#ifdef TARGET_NR_umount
3420static void
3421print_umount(void *cpu_env, const struct syscallname *name,
3422             abi_long arg0, abi_long arg1, abi_long arg2,
3423             abi_long arg3, abi_long arg4, abi_long arg5)
3424{
3425    print_syscall_prologue(name);
3426    print_string(arg0, 1);
3427    print_syscall_epilogue(name);
3428}
3429#endif
3430
3431#ifdef TARGET_NR_umount2
3432static void
3433print_umount2(void *cpu_env, const struct syscallname *name,
3434              abi_long arg0, abi_long arg1, abi_long arg2,
3435              abi_long arg3, abi_long arg4, abi_long arg5)
3436{
3437    print_syscall_prologue(name);
3438    print_string(arg0, 0);
3439    print_flags(umount2_flags, arg1, 1);
3440    print_syscall_epilogue(name);
3441}
3442#endif
3443
3444#ifdef TARGET_NR_unlink
3445static void
3446print_unlink(void *cpu_env, const struct syscallname *name,
3447             abi_long arg0, abi_long arg1, abi_long arg2,
3448             abi_long arg3, abi_long arg4, abi_long arg5)
3449{
3450    print_syscall_prologue(name);
3451    print_string(arg0, 1);
3452    print_syscall_epilogue(name);
3453}
3454#endif
3455
3456#ifdef TARGET_NR_unlinkat
3457static void
3458print_unlinkat(void *cpu_env, const struct syscallname *name,
3459               abi_long arg0, abi_long arg1, abi_long arg2,
3460               abi_long arg3, abi_long arg4, abi_long arg5)
3461{
3462    print_syscall_prologue(name);
3463    print_at_dirfd(arg0, 0);
3464    print_string(arg1, 0);
3465    print_flags(unlinkat_flags, arg2, 1);
3466    print_syscall_epilogue(name);
3467}
3468#endif
3469
3470#ifdef TARGET_NR_utime
3471static void
3472print_utime(void *cpu_env, const struct syscallname *name,
3473            abi_long arg0, abi_long arg1, abi_long arg2,
3474            abi_long arg3, abi_long arg4, abi_long arg5)
3475{
3476    print_syscall_prologue(name);
3477    print_string(arg0, 0);
3478    print_pointer(arg1, 1);
3479    print_syscall_epilogue(name);
3480}
3481#endif
3482
3483#ifdef TARGET_NR_utimes
3484static void
3485print_utimes(void *cpu_env, const struct syscallname *name,
3486             abi_long arg0, abi_long arg1, abi_long arg2,
3487             abi_long arg3, abi_long arg4, abi_long arg5)
3488{
3489    print_syscall_prologue(name);
3490    print_string(arg0, 0);
3491    print_pointer(arg1, 1);
3492    print_syscall_epilogue(name);
3493}
3494#endif
3495
3496#ifdef TARGET_NR_utimensat
3497static void
3498print_utimensat(void *cpu_env, const struct syscallname *name,
3499                abi_long arg0, abi_long arg1, abi_long arg2,
3500                abi_long arg3, abi_long arg4, abi_long arg5)
3501{
3502    print_syscall_prologue(name);
3503    print_at_dirfd(arg0, 0);
3504    print_string(arg1, 0);
3505    print_pointer(arg2, 0);
3506    print_flags(at_file_flags, arg3, 1);
3507    print_syscall_epilogue(name);
3508}
3509#endif
3510
3511#if defined(TARGET_NR_mmap) || defined(TARGET_NR_mmap2)
3512static void
3513print_mmap(void *cpu_env, const struct syscallname *name,
3514           abi_long arg0, abi_long arg1, abi_long arg2,
3515           abi_long arg3, abi_long arg4, abi_long arg5)
3516{
3517    print_syscall_prologue(name);
3518    print_pointer(arg0, 0);
3519    print_raw_param("%d", arg1, 0);
3520    print_flags(mmap_prot_flags, arg2, 0);
3521    print_flags(mmap_flags, arg3, 0);
3522    print_raw_param("%d", arg4, 0);
3523    print_raw_param("%#x", arg5, 1);
3524    print_syscall_epilogue(name);
3525}
3526#define print_mmap2     print_mmap
3527#endif
3528
3529#ifdef TARGET_NR_mprotect
3530static void
3531print_mprotect(void *cpu_env, const struct syscallname *name,
3532               abi_long arg0, abi_long arg1, abi_long arg2,
3533               abi_long arg3, abi_long arg4, abi_long arg5)
3534{
3535    print_syscall_prologue(name);
3536    print_pointer(arg0, 0);
3537    print_raw_param("%d", arg1, 0);
3538    print_flags(mmap_prot_flags, arg2, 1);
3539    print_syscall_epilogue(name);
3540}
3541#endif
3542
3543#ifdef TARGET_NR_munmap
3544static void
3545print_munmap(void *cpu_env, const struct syscallname *name,
3546             abi_long arg0, abi_long arg1, abi_long arg2,
3547             abi_long arg3, abi_long arg4, abi_long arg5)
3548{
3549    print_syscall_prologue(name);
3550    print_pointer(arg0, 0);
3551    print_raw_param("%d", arg1, 1);
3552    print_syscall_epilogue(name);
3553}
3554#endif
3555
3556#ifdef TARGET_NR_futex
3557static void print_futex_op(abi_long tflag, int last)
3558{
3559#define print_op(val) \
3560if( cmd == val ) { \
3561    qemu_log(#val); \
3562    return; \
3563}
3564
3565    int cmd = (int)tflag;
3566#ifdef FUTEX_PRIVATE_FLAG
3567    if (cmd & FUTEX_PRIVATE_FLAG) {
3568        qemu_log("FUTEX_PRIVATE_FLAG|");
3569        cmd &= ~FUTEX_PRIVATE_FLAG;
3570    }
3571#endif
3572#ifdef FUTEX_CLOCK_REALTIME
3573    if (cmd & FUTEX_CLOCK_REALTIME) {
3574        qemu_log("FUTEX_CLOCK_REALTIME|");
3575        cmd &= ~FUTEX_CLOCK_REALTIME;
3576    }
3577#endif
3578    print_op(FUTEX_WAIT)
3579    print_op(FUTEX_WAKE)
3580    print_op(FUTEX_FD)
3581    print_op(FUTEX_REQUEUE)
3582    print_op(FUTEX_CMP_REQUEUE)
3583    print_op(FUTEX_WAKE_OP)
3584    print_op(FUTEX_LOCK_PI)
3585    print_op(FUTEX_UNLOCK_PI)
3586    print_op(FUTEX_TRYLOCK_PI)
3587#ifdef FUTEX_WAIT_BITSET
3588    print_op(FUTEX_WAIT_BITSET)
3589#endif
3590#ifdef FUTEX_WAKE_BITSET
3591    print_op(FUTEX_WAKE_BITSET)
3592#endif
3593    /* unknown values */
3594    qemu_log("%d", cmd);
3595}
3596
3597static void
3598print_futex(void *cpu_env, const struct syscallname *name,
3599            abi_long arg0, abi_long arg1, abi_long arg2,
3600            abi_long arg3, abi_long arg4, abi_long arg5)
3601{
3602    print_syscall_prologue(name);
3603    print_pointer(arg0, 0);
3604    print_futex_op(arg1, 0);
3605    print_raw_param(",%d", arg2, 0);
3606    print_pointer(arg3, 0); /* struct timespec */
3607    print_pointer(arg4, 0);
3608    print_raw_param("%d", arg4, 1);
3609    print_syscall_epilogue(name);
3610}
3611#endif
3612
3613#ifdef TARGET_NR_kill
3614static void
3615print_kill(void *cpu_env, const struct syscallname *name,
3616           abi_long arg0, abi_long arg1, abi_long arg2,
3617           abi_long arg3, abi_long arg4, abi_long arg5)
3618{
3619    print_syscall_prologue(name);
3620    print_raw_param("%d", arg0, 0);
3621    print_signal(arg1, 1);
3622    print_syscall_epilogue(name);
3623}
3624#endif
3625
3626#ifdef TARGET_NR_tkill
3627static void
3628print_tkill(void *cpu_env, const struct syscallname *name,
3629            abi_long arg0, abi_long arg1, abi_long arg2,
3630            abi_long arg3, abi_long arg4, abi_long arg5)
3631{
3632    print_syscall_prologue(name);
3633    print_raw_param("%d", arg0, 0);
3634    print_signal(arg1, 1);
3635    print_syscall_epilogue(name);
3636}
3637#endif
3638
3639#ifdef TARGET_NR_tgkill
3640static void
3641print_tgkill(void *cpu_env, const struct syscallname *name,
3642             abi_long arg0, abi_long arg1, abi_long arg2,
3643             abi_long arg3, abi_long arg4, abi_long arg5)
3644{
3645    print_syscall_prologue(name);
3646    print_raw_param("%d", arg0, 0);
3647    print_raw_param("%d", arg1, 0);
3648    print_signal(arg2, 1);
3649    print_syscall_epilogue(name);
3650}
3651#endif
3652
3653#ifdef TARGET_NR_statx
3654static void
3655print_statx(void *cpu_env, const struct syscallname *name,
3656            abi_long arg0, abi_long arg1, abi_long arg2,
3657            abi_long arg3, abi_long arg4, abi_long arg5)
3658{
3659    print_syscall_prologue(name);
3660    print_at_dirfd(arg0, 0);
3661    print_string(arg1, 0);
3662    print_flags(statx_flags, arg2, 0);
3663    print_flags(statx_mask, arg3, 0);
3664    print_pointer(arg4, 1);
3665    print_syscall_epilogue(name);
3666}
3667#endif
3668
3669#ifdef TARGET_NR_ioctl
3670static void
3671print_ioctl(void *cpu_env, const struct syscallname *name,
3672            abi_long arg0, abi_long arg1, abi_long arg2,
3673            abi_long arg3, abi_long arg4, abi_long arg5)
3674{
3675    print_syscall_prologue(name);
3676    print_raw_param("%d", arg0, 0);
3677
3678    const IOCTLEntry *ie;
3679    const argtype *arg_type;
3680    void *argptr;
3681    int target_size;
3682
3683    for (ie = ioctl_entries; ie->target_cmd != 0; ie++) {
3684        if (ie->target_cmd == arg1) {
3685            break;
3686        }
3687    }
3688
3689    if (ie->target_cmd == 0) {
3690        print_raw_param("%#x", arg1, 0);
3691        print_raw_param("%#x", arg2, 1);
3692    } else {
3693        qemu_log("%s", ie->name);
3694        arg_type = ie->arg_type;
3695
3696        if (arg_type[0] != TYPE_NULL) {
3697            qemu_log(",");
3698
3699            switch (arg_type[0]) {
3700            case TYPE_PTRVOID:
3701                print_pointer(arg2, 1);
3702                break;
3703            case TYPE_CHAR:
3704            case TYPE_SHORT:
3705            case TYPE_INT:
3706                print_raw_param("%d", arg2, 1);
3707                break;
3708            case TYPE_LONG:
3709                print_raw_param(TARGET_ABI_FMT_ld, arg2, 1);
3710                break;
3711            case TYPE_ULONG:
3712                print_raw_param(TARGET_ABI_FMT_lu, arg2, 1);
3713                break;
3714            case TYPE_PTR:
3715                switch (ie->access) {
3716                case IOC_R:
3717                    print_pointer(arg2, 1);
3718                    break;
3719                case IOC_W:
3720                case IOC_RW:
3721                    arg_type++;
3722                    target_size = thunk_type_size(arg_type, 0);
3723                    argptr = lock_user(VERIFY_READ, arg2, target_size, 1);
3724                    if (argptr) {
3725                        thunk_print(argptr, arg_type);
3726                        unlock_user(argptr, arg2, target_size);
3727                    } else {
3728                        print_pointer(arg2, 1);
3729                    }
3730                    break;
3731                }
3732                break;
3733            default:
3734                g_assert_not_reached();
3735            }
3736        }
3737    }
3738    print_syscall_epilogue(name);
3739}
3740#endif
3741
3742/*
3743 * An array of all of the syscalls we know about
3744 */
3745
3746static const struct syscallname scnames[] = {
3747#include "strace.list"
3748};
3749
3750static int nsyscalls = ARRAY_SIZE(scnames);
3751
3752/*
3753 * The public interface to this module.
3754 */
3755void
3756print_syscall(void *cpu_env, int num,
3757              abi_long arg1, abi_long arg2, abi_long arg3,
3758              abi_long arg4, abi_long arg5, abi_long arg6)
3759{
3760    int i;
3761    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 ")";
3762
3763    qemu_log("%d ", getpid());
3764
3765    for(i=0;i<nsyscalls;i++)
3766        if( scnames[i].nr == num ) {
3767            if( scnames[i].call != NULL ) {
3768                scnames[i].call(
3769                    cpu_env, &scnames[i], arg1, arg2, arg3, arg4, arg5, arg6);
3770            } else {
3771                /* XXX: this format system is broken because it uses
3772                   host types and host pointers for strings */
3773                if( scnames[i].format != NULL )
3774                    format = scnames[i].format;
3775                qemu_log(format,
3776                         scnames[i].name, arg1, arg2, arg3, arg4, arg5, arg6);
3777            }
3778            return;
3779        }
3780    qemu_log("Unknown syscall %d\n", num);
3781}
3782
3783
3784void
3785print_syscall_ret(void *cpu_env, int num, abi_long ret,
3786                  abi_long arg1, abi_long arg2, abi_long arg3,
3787                  abi_long arg4, abi_long arg5, abi_long arg6)
3788{
3789    int i;
3790
3791    for(i=0;i<nsyscalls;i++)
3792        if( scnames[i].nr == num ) {
3793            if( scnames[i].result != NULL ) {
3794                scnames[i].result(cpu_env, &scnames[i], ret,
3795                                  arg1, arg2, arg3,
3796                                  arg4, arg5, arg6);
3797            } else {
3798                if (!print_syscall_err(ret)) {
3799                    qemu_log(TARGET_ABI_FMT_ld, ret);
3800                }
3801                qemu_log("\n");
3802            }
3803            break;
3804        }
3805}
3806
3807void print_taken_signal(int target_signum, const target_siginfo_t *tinfo)
3808{
3809    /* Print the strace output for a signal being taken:
3810     * --- SIGSEGV {si_signo=SIGSEGV, si_code=SI_KERNEL, si_addr=0} ---
3811     */
3812    qemu_log("--- ");
3813    print_signal(target_signum, 1);
3814    qemu_log(" ");
3815    print_siginfo(tinfo);
3816    qemu_log(" ---\n");
3817}
3818