Annotation of qemu/linux-user/strace.c, revision 1.1.1.7

1.1       root        1: #include <stdio.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/types.h>
1.1.1.3   root        8: #include <sys/mount.h>
                      9: #include <sys/mman.h>
1.1       root       10: #include <unistd.h>
1.1.1.5   root       11: #include <sched.h>
1.1       root       12: #include "qemu.h"
                     13: 
                     14: int do_strace=0;
                     15: 
                     16: struct syscallname {
                     17:     int nr;
1.1.1.2   root       18:     const char *name;
                     19:     const char *format;
                     20:     void (*call)(const struct syscallname *,
1.1       root       21:                  abi_long, abi_long, abi_long,
                     22:                  abi_long, abi_long, abi_long);
1.1.1.2   root       23:     void (*result)(const struct syscallname *, abi_long);
1.1       root       24: };
                     25: 
1.1.1.3   root       26: #ifdef __GNUC__
                     27: /*
                     28:  * It is possible that target doesn't have syscall that uses
                     29:  * following flags but we don't want the compiler to warn
                     30:  * us about them being unused.  Same applies to utility print
                     31:  * functions.  It is ok to keep them while not used.
                     32:  */
                     33: #define UNUSED __attribute__ ((unused))
                     34: #else
                     35: #define UNUSED
                     36: #endif
                     37: 
                     38: /*
                     39:  * Structure used to translate flag values into strings.  This is
                     40:  * similar that is in the actual strace tool.
                     41:  */
                     42: struct 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: UNUSED static const char *get_comma(int);
                     55: UNUSED static void print_pointer(abi_long, int);
                     56: UNUSED static void print_flags(const struct flags *, abi_long, int);
                     57: UNUSED static void print_at_dirfd(abi_long, int);
                     58: UNUSED static void print_file_mode(abi_long, int);
                     59: UNUSED static void print_open_flags(abi_long, int);
                     60: UNUSED static void print_syscall_prologue(const struct syscallname *);
                     61: UNUSED static void print_syscall_epilogue(const struct syscallname *);
                     62: UNUSED static void print_string(abi_long, int);
                     63: UNUSED static void print_raw_param(const char *, abi_long, int);
                     64: UNUSED static void print_timeval(abi_ulong, int);
                     65: UNUSED static void print_number(abi_long, int);
1.1.1.5   root       66: UNUSED static void print_signal(abi_ulong, int);
1.1.1.3   root       67: 
1.1       root       68: /*
                     69:  * Utility functions
                     70:  */
                     71: static void
                     72: print_ipc_cmd(int cmd)
                     73: {
                     74: #define output_cmd(val) \
                     75: if( cmd == val ) { \
                     76:     gemu_log(#val); \
                     77:     return; \
                     78: }
                     79: 
                     80:     cmd &= 0xff;
                     81: 
                     82:     /* General IPC commands */
                     83:     output_cmd( IPC_RMID );
                     84:     output_cmd( IPC_SET );
                     85:     output_cmd( IPC_STAT );
                     86:     output_cmd( IPC_INFO );
                     87:     /* msgctl() commands */
                     88:     #ifdef __USER_MISC
                     89:     output_cmd( MSG_STAT );
                     90:     output_cmd( MSG_INFO );
                     91:     #endif
                     92:     /* shmctl() commands */
                     93:     output_cmd( SHM_LOCK );
                     94:     output_cmd( SHM_UNLOCK );
                     95:     output_cmd( SHM_STAT );
                     96:     output_cmd( SHM_INFO );
                     97:     /* semctl() commands */
                     98:     output_cmd( GETPID );
                     99:     output_cmd( GETVAL );
                    100:     output_cmd( GETALL );
                    101:     output_cmd( GETNCNT );
                    102:     output_cmd( GETZCNT );
                    103:     output_cmd( SETVAL );
                    104:     output_cmd( SETALL );
                    105:     output_cmd( SEM_STAT );
                    106:     output_cmd( SEM_INFO );
                    107:     output_cmd( IPC_RMID );
                    108:     output_cmd( IPC_RMID );
                    109:     output_cmd( IPC_RMID );
                    110:     output_cmd( IPC_RMID );
                    111:     output_cmd( IPC_RMID );
                    112:     output_cmd( IPC_RMID );
                    113:     output_cmd( IPC_RMID );
                    114:     output_cmd( IPC_RMID );
                    115:     output_cmd( IPC_RMID );
                    116: 
                    117:     /* Some value we don't recognize */
                    118:     gemu_log("%d",cmd);
                    119: }
                    120: 
1.1.1.5   root      121: static void
                    122: print_signal(abi_ulong arg, int last)
                    123: {
                    124:     const char *signal_name = NULL;
                    125:     switch(arg) {
                    126:     case TARGET_SIGHUP: signal_name = "SIGHUP"; break;
                    127:     case TARGET_SIGINT: signal_name = "SIGINT"; break;
                    128:     case TARGET_SIGQUIT: signal_name = "SIGQUIT"; break;
                    129:     case TARGET_SIGILL: signal_name = "SIGILL"; break;
                    130:     case TARGET_SIGABRT: signal_name = "SIGABRT"; break;
                    131:     case TARGET_SIGFPE: signal_name = "SIGFPE"; break;
                    132:     case TARGET_SIGKILL: signal_name = "SIGKILL"; break;
                    133:     case TARGET_SIGSEGV: signal_name = "SIGSEGV"; break;
                    134:     case TARGET_SIGPIPE: signal_name = "SIGPIPE"; break;
                    135:     case TARGET_SIGALRM: signal_name = "SIGALRM"; break;
                    136:     case TARGET_SIGTERM: signal_name = "SIGTERM"; break;
                    137:     case TARGET_SIGUSR1: signal_name = "SIGUSR1"; break;
                    138:     case TARGET_SIGUSR2: signal_name = "SIGUSR2"; break;
                    139:     case TARGET_SIGCHLD: signal_name = "SIGCHLD"; break;
                    140:     case TARGET_SIGCONT: signal_name = "SIGCONT"; break;
                    141:     case TARGET_SIGSTOP: signal_name = "SIGSTOP"; break;
                    142:     case TARGET_SIGTTIN: signal_name = "SIGTTIN"; break;
                    143:     case TARGET_SIGTTOU: signal_name = "SIGTTOU"; break;
                    144:     }
                    145:     if (signal_name == NULL) {
                    146:         print_raw_param("%ld", arg, 1);
                    147:         return;
                    148:     }
                    149:     gemu_log("%s%s", signal_name, get_comma(last));
                    150: }
                    151: 
1.1       root      152: #ifdef TARGET_NR__newselect
                    153: static void
                    154: print_fdset(int n, abi_ulong target_fds_addr)
                    155: {
                    156:     int i;
                    157: 
                    158:     gemu_log("[");
                    159:     if( target_fds_addr ) {
                    160:         abi_long *target_fds;
                    161: 
                    162:         target_fds = lock_user(VERIFY_READ,
                    163:                                target_fds_addr,
                    164:                                sizeof(*target_fds)*(n / TARGET_ABI_BITS + 1),
                    165:                                1);
                    166: 
                    167:         if (!target_fds)
                    168:             return;
                    169: 
                    170:         for (i=n; i>=0; i--) {
1.1.1.6   root      171:             if ((tswapal(target_fds[i / TARGET_ABI_BITS]) >> (i & (TARGET_ABI_BITS - 1))) & 1)
1.1       root      172:                 gemu_log("%d,", i );
                    173:             }
                    174:         unlock_user(target_fds, target_fds_addr, 0);
                    175:     }
                    176:     gemu_log("]");
                    177: }
                    178: #endif
                    179: 
                    180: /*
                    181:  * Sysycall specific output functions
                    182:  */
                    183: 
                    184: /* select */
                    185: #ifdef TARGET_NR__newselect
                    186: static long newselect_arg1 = 0;
                    187: static long newselect_arg2 = 0;
                    188: static long newselect_arg3 = 0;
                    189: static long newselect_arg4 = 0;
                    190: static long newselect_arg5 = 0;
                    191: 
                    192: static void
1.1.1.2   root      193: print_newselect(const struct syscallname *name,
1.1       root      194:                 abi_long arg1, abi_long arg2, abi_long arg3,
                    195:                 abi_long arg4, abi_long arg5, abi_long arg6)
                    196: {
                    197:     gemu_log("%s(" TARGET_ABI_FMT_ld ",", name->name, arg1);
                    198:     print_fdset(arg1, arg2);
                    199:     gemu_log(",");
                    200:     print_fdset(arg1, arg3);
                    201:     gemu_log(",");
                    202:     print_fdset(arg1, arg4);
                    203:     gemu_log(",");
1.1.1.3   root      204:     print_timeval(arg5, 1);
1.1       root      205:     gemu_log(")");
                    206: 
                    207:     /* save for use in the return output function below */
                    208:     newselect_arg1=arg1;
                    209:     newselect_arg2=arg2;
                    210:     newselect_arg3=arg3;
                    211:     newselect_arg4=arg4;
                    212:     newselect_arg5=arg5;
                    213: }
                    214: #endif
                    215: 
1.1.1.2   root      216: #ifdef TARGET_NR_semctl
1.1       root      217: static void
1.1.1.2   root      218: print_semctl(const struct syscallname *name,
1.1       root      219:              abi_long arg1, abi_long arg2, abi_long arg3,
                    220:              abi_long arg4, abi_long arg5, abi_long arg6)
                    221: {
                    222:     gemu_log("%s(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ",", name->name, arg1, arg2);
                    223:     print_ipc_cmd(arg3);
                    224:     gemu_log(",0x" TARGET_ABI_FMT_lx ")", arg4);
                    225: }
1.1.1.2   root      226: #endif
1.1       root      227: 
                    228: static void
1.1.1.2   root      229: print_execve(const struct syscallname *name,
1.1       root      230:              abi_long arg1, abi_long arg2, abi_long arg3,
                    231:              abi_long arg4, abi_long arg5, abi_long arg6)
                    232: {
                    233:     abi_ulong arg_ptr_addr;
                    234:     char *s;
                    235: 
                    236:     if (!(s = lock_user_string(arg1)))
                    237:         return;
                    238:     gemu_log("%s(\"%s\",{", name->name, s);
                    239:     unlock_user(s, arg1, 0);
                    240: 
                    241:     for (arg_ptr_addr = arg2; ; arg_ptr_addr += sizeof(abi_ulong)) {
1.1.1.2   root      242:         abi_ulong *arg_ptr, arg_addr;
1.1       root      243: 
                    244:        arg_ptr = lock_user(VERIFY_READ, arg_ptr_addr, sizeof(abi_ulong), 1);
                    245:         if (!arg_ptr)
                    246:             return;
1.1.1.6   root      247:     arg_addr = tswapal(*arg_ptr);
1.1       root      248:        unlock_user(arg_ptr, arg_ptr_addr, 0);
                    249:         if (!arg_addr)
                    250:             break;
                    251:         if ((s = lock_user_string(arg_addr))) {
                    252:             gemu_log("\"%s\",", s);
1.1.1.2   root      253:             unlock_user(s, arg_addr, 0);
1.1       root      254:         }
                    255:     }
                    256: 
                    257:     gemu_log("NULL})");
                    258: }
                    259: 
                    260: #ifdef TARGET_NR_ipc
                    261: static void
1.1.1.2   root      262: print_ipc(const struct syscallname *name,
1.1       root      263:           abi_long arg1, abi_long arg2, abi_long arg3,
                    264:           abi_long arg4, abi_long arg5, abi_long arg6)
                    265: {
                    266:     switch(arg1) {
                    267:     case IPCOP_semctl:
1.1.1.2   root      268:         gemu_log("semctl(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ",", arg1, arg2);
                    269:         print_ipc_cmd(arg3);
                    270:         gemu_log(",0x" TARGET_ABI_FMT_lx ")", arg4);
1.1       root      271:         break;
                    272:     default:
                    273:         gemu_log("%s(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ")",
                    274:                  name->name, arg1, arg2, arg3, arg4);
                    275:     }
                    276: }
                    277: #endif
                    278: 
                    279: /*
                    280:  * Variants for the return value output function
                    281:  */
                    282: 
                    283: static void
1.1.1.2   root      284: print_syscall_ret_addr(const struct syscallname *name, abi_long ret)
1.1       root      285: {
1.1.1.7 ! root      286:     char *errstr = NULL;
        !           287: 
        !           288:     if (ret < 0) {
        !           289:         errstr = target_strerror(-ret);
        !           290:     }
        !           291:     if (errstr) {
        !           292:         gemu_log(" = -1 errno=%d (%s)\n", (int)-ret, errstr);
1.1       root      293:     } else {
                    294:         gemu_log(" = 0x" TARGET_ABI_FMT_lx "\n", ret);
                    295:     }
                    296: }
                    297: 
                    298: #if 0 /* currently unused */
                    299: static void
                    300: print_syscall_ret_raw(struct syscallname *name, abi_long ret)
                    301: {
                    302:         gemu_log(" = 0x" TARGET_ABI_FMT_lx "\n", ret);
                    303: }
                    304: #endif
                    305: 
                    306: #ifdef TARGET_NR__newselect
                    307: static void
1.1.1.2   root      308: print_syscall_ret_newselect(const struct syscallname *name, abi_long ret)
1.1       root      309: {
                    310:     gemu_log(" = 0x" TARGET_ABI_FMT_lx " (", ret);
                    311:     print_fdset(newselect_arg1,newselect_arg2);
                    312:     gemu_log(",");
                    313:     print_fdset(newselect_arg1,newselect_arg3);
                    314:     gemu_log(",");
                    315:     print_fdset(newselect_arg1,newselect_arg4);
                    316:     gemu_log(",");
1.1.1.3   root      317:     print_timeval(newselect_arg5, 1);
1.1       root      318:     gemu_log(")\n");
                    319: }
                    320: #endif
                    321: 
1.1.1.3   root      322: UNUSED static struct flags access_flags[] = {
                    323:     FLAG_GENERIC(F_OK),
                    324:     FLAG_GENERIC(R_OK),
                    325:     FLAG_GENERIC(W_OK),
                    326:     FLAG_GENERIC(X_OK),
                    327:     FLAG_END,
                    328: };
                    329: 
                    330: UNUSED static struct flags at_file_flags[] = {
                    331: #ifdef AT_EACCESS
                    332:     FLAG_GENERIC(AT_EACCESS),
                    333: #endif
                    334: #ifdef AT_SYMLINK_NOFOLLOW
                    335:     FLAG_GENERIC(AT_SYMLINK_NOFOLLOW),
                    336: #endif
                    337:     FLAG_END,
                    338: };
                    339: 
                    340: UNUSED static struct flags unlinkat_flags[] = {
                    341: #ifdef AT_REMOVEDIR
                    342:     FLAG_GENERIC(AT_REMOVEDIR),
                    343: #endif
                    344:     FLAG_END,
                    345: };
                    346: 
                    347: UNUSED static struct flags mode_flags[] = {
                    348:     FLAG_GENERIC(S_IFSOCK),
                    349:     FLAG_GENERIC(S_IFLNK),
                    350:     FLAG_GENERIC(S_IFREG),
                    351:     FLAG_GENERIC(S_IFBLK),
                    352:     FLAG_GENERIC(S_IFDIR),
                    353:     FLAG_GENERIC(S_IFCHR),
                    354:     FLAG_GENERIC(S_IFIFO),
                    355:     FLAG_END,
                    356: };
                    357: 
                    358: UNUSED static struct flags open_access_flags[] = {
                    359:     FLAG_TARGET(O_RDONLY),
                    360:     FLAG_TARGET(O_WRONLY),
                    361:     FLAG_TARGET(O_RDWR),
                    362:     FLAG_END,
                    363: };
                    364: 
                    365: UNUSED static struct flags open_flags[] = {
                    366:     FLAG_TARGET(O_APPEND),
                    367:     FLAG_TARGET(O_CREAT),
                    368:     FLAG_TARGET(O_DIRECTORY),
                    369:     FLAG_TARGET(O_EXCL),
                    370:     FLAG_TARGET(O_LARGEFILE),
                    371:     FLAG_TARGET(O_NOCTTY),
                    372:     FLAG_TARGET(O_NOFOLLOW),
                    373:     FLAG_TARGET(O_NONBLOCK),      /* also O_NDELAY */
                    374:     FLAG_TARGET(O_SYNC),
                    375:     FLAG_TARGET(O_TRUNC),
                    376: #ifdef O_DIRECT
                    377:     FLAG_TARGET(O_DIRECT),
                    378: #endif
                    379:     FLAG_END,
                    380: };
                    381: 
                    382: UNUSED static struct flags mount_flags[] = {
                    383: #ifdef MS_BIND
                    384:     FLAG_GENERIC(MS_BIND),
                    385: #endif
                    386: #ifdef MS_DIRSYNC
                    387:     FLAG_GENERIC(MS_DIRSYNC),
                    388: #endif
                    389:     FLAG_GENERIC(MS_MANDLOCK),
                    390: #ifdef MS_MOVE
                    391:     FLAG_GENERIC(MS_MOVE),
                    392: #endif
                    393:     FLAG_GENERIC(MS_NOATIME),
                    394:     FLAG_GENERIC(MS_NODEV),
                    395:     FLAG_GENERIC(MS_NODIRATIME),
                    396:     FLAG_GENERIC(MS_NOEXEC),
                    397:     FLAG_GENERIC(MS_NOSUID),
                    398:     FLAG_GENERIC(MS_RDONLY),
                    399: #ifdef MS_RELATIME
                    400:     FLAG_GENERIC(MS_RELATIME),
                    401: #endif
                    402:     FLAG_GENERIC(MS_REMOUNT),
                    403:     FLAG_GENERIC(MS_SYNCHRONOUS),
                    404:     FLAG_END,
                    405: };
                    406: 
                    407: UNUSED static struct flags umount2_flags[] = {
                    408: #ifdef MNT_FORCE
                    409:     FLAG_GENERIC(MNT_FORCE),
                    410: #endif
                    411: #ifdef MNT_DETACH
                    412:     FLAG_GENERIC(MNT_DETACH),
                    413: #endif
                    414: #ifdef MNT_EXPIRE
                    415:     FLAG_GENERIC(MNT_EXPIRE),
                    416: #endif
                    417:     FLAG_END,
                    418: };
                    419: 
                    420: UNUSED static struct flags mmap_prot_flags[] = {
                    421:     FLAG_GENERIC(PROT_NONE),
                    422:     FLAG_GENERIC(PROT_EXEC),
                    423:     FLAG_GENERIC(PROT_READ),
                    424:     FLAG_GENERIC(PROT_WRITE),
1.1.1.4   root      425:     FLAG_TARGET(PROT_SEM),
                    426:     FLAG_GENERIC(PROT_GROWSDOWN),
                    427:     FLAG_GENERIC(PROT_GROWSUP),
1.1.1.3   root      428:     FLAG_END,
                    429: };
                    430: 
                    431: UNUSED static struct flags mmap_flags[] = {
                    432:     FLAG_TARGET(MAP_SHARED),
                    433:     FLAG_TARGET(MAP_PRIVATE),
                    434:     FLAG_TARGET(MAP_ANONYMOUS),
                    435:     FLAG_TARGET(MAP_DENYWRITE),
                    436:     FLAG_TARGET(MAP_FIXED),
                    437:     FLAG_TARGET(MAP_GROWSDOWN),
1.1.1.5   root      438:     FLAG_TARGET(MAP_EXECUTABLE),
1.1.1.3   root      439: #ifdef MAP_LOCKED
                    440:     FLAG_TARGET(MAP_LOCKED),
                    441: #endif
                    442: #ifdef MAP_NONBLOCK
                    443:     FLAG_TARGET(MAP_NONBLOCK),
                    444: #endif
                    445:     FLAG_TARGET(MAP_NORESERVE),
                    446: #ifdef MAP_POPULATE
                    447:     FLAG_TARGET(MAP_POPULATE),
                    448: #endif
1.1.1.5   root      449: #ifdef TARGET_MAP_UNINITIALIZED
                    450:     FLAG_TARGET(MAP_UNINITIALIZED),
                    451: #endif
1.1.1.3   root      452:     FLAG_END,
                    453: };
                    454: 
                    455: UNUSED static struct flags fcntl_flags[] = {
                    456:     FLAG_TARGET(F_DUPFD),
                    457:     FLAG_TARGET(F_GETFD),
                    458:     FLAG_TARGET(F_SETFD),
                    459:     FLAG_TARGET(F_GETFL),
                    460:     FLAG_TARGET(F_SETFL),
                    461:     FLAG_TARGET(F_GETLK),
                    462:     FLAG_TARGET(F_SETLK),
                    463:     FLAG_TARGET(F_SETLKW),
                    464:     FLAG_END,
                    465: };
                    466: 
1.1.1.5   root      467: UNUSED static struct flags clone_flags[] = {
                    468:     FLAG_GENERIC(CLONE_VM),
                    469:     FLAG_GENERIC(CLONE_FS),
                    470:     FLAG_GENERIC(CLONE_FILES),
                    471:     FLAG_GENERIC(CLONE_SIGHAND),
                    472:     FLAG_GENERIC(CLONE_PTRACE),
                    473:     FLAG_GENERIC(CLONE_VFORK),
                    474:     FLAG_GENERIC(CLONE_PARENT),
                    475:     FLAG_GENERIC(CLONE_THREAD),
                    476:     FLAG_GENERIC(CLONE_NEWNS),
                    477:     FLAG_GENERIC(CLONE_SYSVSEM),
                    478:     FLAG_GENERIC(CLONE_SETTLS),
                    479:     FLAG_GENERIC(CLONE_PARENT_SETTID),
                    480:     FLAG_GENERIC(CLONE_CHILD_CLEARTID),
                    481:     FLAG_GENERIC(CLONE_DETACHED),
                    482:     FLAG_GENERIC(CLONE_UNTRACED),
                    483:     FLAG_GENERIC(CLONE_CHILD_SETTID),
                    484: #if defined(CLONE_NEWUTS)
                    485:     FLAG_GENERIC(CLONE_NEWUTS),
                    486: #endif
                    487: #if defined(CLONE_NEWIPC)
                    488:     FLAG_GENERIC(CLONE_NEWIPC),
                    489: #endif
                    490: #if defined(CLONE_NEWUSER)
                    491:     FLAG_GENERIC(CLONE_NEWUSER),
                    492: #endif
                    493: #if defined(CLONE_NEWPID)
                    494:     FLAG_GENERIC(CLONE_NEWPID),
                    495: #endif
                    496: #if defined(CLONE_NEWNET)
                    497:     FLAG_GENERIC(CLONE_NEWNET),
                    498: #endif
                    499: #if defined(CLONE_IO)
                    500:     FLAG_GENERIC(CLONE_IO),
                    501: #endif
                    502:     FLAG_END,
                    503: };
                    504: 
1.1.1.3   root      505: /*
                    506:  * print_xxx utility functions.  These are used to print syscall
                    507:  * parameters in certain format.  All of these have parameter
                    508:  * named 'last'.  This parameter is used to add comma to output
                    509:  * when last == 0.
                    510:  */
                    511: 
                    512: static const char *
                    513: get_comma(int last)
                    514: {
                    515:     return ((last) ? "" : ",");
                    516: }
                    517: 
                    518: static void
1.1.1.5   root      519: print_flags(const struct flags *f, abi_long flags, int last)
1.1.1.3   root      520: {
                    521:     const char *sep = "";
                    522:     int n;
                    523: 
                    524:     if ((flags == 0) && (f->f_value == 0)) {
                    525:         gemu_log("%s%s", f->f_string, get_comma(last));
                    526:         return;
                    527:     }
                    528:     for (n = 0; f->f_string != NULL; f++) {
                    529:         if ((f->f_value != 0) && ((flags & f->f_value) == f->f_value)) {
                    530:             gemu_log("%s%s", sep, f->f_string);
                    531:             flags &= ~f->f_value;
                    532:             sep = "|";
                    533:             n++;
                    534:         }
                    535:     }
                    536: 
                    537:     if (n > 0) {
                    538:         /* print rest of the flags as numeric */
                    539:         if (flags != 0) {
1.1.1.5   root      540:             gemu_log("%s%#x%s", sep, (unsigned int)flags, get_comma(last));
1.1.1.3   root      541:         } else {
                    542:             gemu_log("%s", get_comma(last));
                    543:         }
                    544:     } else {
                    545:         /* no string version of flags found, print them in hex then */
1.1.1.5   root      546:         gemu_log("%#x%s", (unsigned int)flags, get_comma(last));
1.1.1.3   root      547:     }
                    548: }
                    549: 
                    550: static void
1.1.1.5   root      551: print_at_dirfd(abi_long dirfd, int last)
1.1.1.3   root      552: {
                    553: #ifdef AT_FDCWD
                    554:     if (dirfd == AT_FDCWD) {
                    555:         gemu_log("AT_FDCWD%s", get_comma(last));
                    556:         return;
                    557:     }
                    558: #endif
1.1.1.5   root      559:     gemu_log("%d%s", (int)dirfd, get_comma(last));
1.1.1.3   root      560: }
                    561: 
                    562: static void
1.1.1.5   root      563: print_file_mode(abi_long mode, int last)
1.1.1.3   root      564: {
                    565:     const char *sep = "";
                    566:     const struct flags *m;
                    567: 
                    568:     for (m = &mode_flags[0]; m->f_string != NULL; m++) {
                    569:         if ((m->f_value & mode) == m->f_value) {
                    570:             gemu_log("%s%s", m->f_string, sep);
                    571:             sep = "|";
                    572:             mode &= ~m->f_value;
                    573:             break;
                    574:         }
                    575:     }
                    576: 
                    577:     mode &= ~S_IFMT;
                    578:     /* print rest of the mode as octal */
                    579:     if (mode != 0)
1.1.1.5   root      580:         gemu_log("%s%#o", sep, (unsigned int)mode);
1.1.1.3   root      581: 
                    582:     gemu_log("%s", get_comma(last));
                    583: }
                    584: 
                    585: static void
1.1.1.5   root      586: print_open_flags(abi_long flags, int last)
1.1.1.3   root      587: {
                    588:     print_flags(open_access_flags, flags & TARGET_O_ACCMODE, 1);
                    589:     flags &= ~TARGET_O_ACCMODE;
                    590:     if (flags == 0) {
                    591:         gemu_log("%s", get_comma(last));
                    592:         return;
                    593:     }
                    594:     gemu_log("|");
                    595:     print_flags(open_flags, flags, last);
                    596: }
                    597: 
                    598: static void
                    599: print_syscall_prologue(const struct syscallname *sc)
                    600: {
                    601:     gemu_log("%s(", sc->name);
                    602: }
                    603: 
                    604: /*ARGSUSED*/
                    605: static void
                    606: print_syscall_epilogue(const struct syscallname *sc)
                    607: {
                    608:     (void)sc;
                    609:     gemu_log(")");
                    610: }
                    611: 
                    612: static void
                    613: print_string(abi_long addr, int last)
                    614: {
                    615:     char *s;
                    616: 
                    617:     if ((s = lock_user_string(addr)) != NULL) {
                    618:         gemu_log("\"%s\"%s", s, get_comma(last));
                    619:         unlock_user(s, addr, 0);
                    620:     } else {
                    621:         /* can't get string out of it, so print it as pointer */
                    622:         print_pointer(addr, last);
                    623:     }
                    624: }
                    625: 
                    626: /*
                    627:  * Prints out raw parameter using given format.  Caller needs
                    628:  * to do byte swapping if needed.
                    629:  */
                    630: static void
                    631: print_raw_param(const char *fmt, abi_long param, int last)
                    632: {
                    633:     char format[64];
                    634: 
                    635:     (void) snprintf(format, sizeof (format), "%s%s", fmt, get_comma(last));
                    636:     gemu_log(format, param);
                    637: }
                    638: 
                    639: static void
                    640: print_pointer(abi_long p, int last)
                    641: {
                    642:     if (p == 0)
                    643:         gemu_log("NULL%s", get_comma(last));
                    644:     else
                    645:         gemu_log("0x" TARGET_ABI_FMT_lx "%s", p, get_comma(last));
                    646: }
                    647: 
                    648: /*
                    649:  * Reads 32-bit (int) number from guest address space from
                    650:  * address 'addr' and prints it.
                    651:  */
                    652: static void
                    653: print_number(abi_long addr, int last)
                    654: {
                    655:     if (addr == 0) {
                    656:         gemu_log("NULL%s", get_comma(last));
                    657:     } else {
                    658:         int num;
                    659: 
                    660:         get_user_s32(num, addr);
                    661:         gemu_log("[%d]%s", num, get_comma(last));
                    662:     }
                    663: }
                    664: 
                    665: static void
                    666: print_timeval(abi_ulong tv_addr, int last)
                    667: {
                    668:     if( tv_addr ) {
                    669:         struct target_timeval *tv;
                    670: 
                    671:         tv = lock_user(VERIFY_READ, tv_addr, sizeof(*tv), 1);
                    672:         if (!tv)
                    673:             return;
                    674:         gemu_log("{" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "}%s",
                    675:             tv->tv_sec, tv->tv_usec, get_comma(last));
                    676:         unlock_user(tv, tv_addr, 0);
                    677:     } else
                    678:         gemu_log("NULL%s", get_comma(last));
                    679: }
                    680: 
                    681: #undef UNUSED
                    682: 
                    683: #ifdef TARGET_NR_accept
                    684: static void
                    685: print_accept(const struct syscallname *name,
                    686:     abi_long arg0, abi_long arg1, abi_long arg2,
                    687:     abi_long arg3, abi_long arg4, abi_long arg5)
                    688: {
                    689:     print_syscall_prologue(name);
1.1.1.5   root      690:     print_raw_param("%d", arg0, 0);
1.1.1.3   root      691:     print_pointer(arg1, 0);
                    692:     print_number(arg2, 1);
                    693:     print_syscall_epilogue(name);
                    694: }
                    695: #endif
                    696: 
                    697: #ifdef TARGET_NR_access
                    698: static void
                    699: print_access(const struct syscallname *name,
                    700:     abi_long arg0, abi_long arg1, abi_long arg2,
                    701:     abi_long arg3, abi_long arg4, abi_long arg5)
                    702: {
                    703:     print_syscall_prologue(name);
                    704:     print_string(arg0, 0);
                    705:     print_flags(access_flags, arg1, 1);
                    706:     print_syscall_epilogue(name);
                    707: }
                    708: #endif
                    709: 
                    710: #ifdef TARGET_NR_brk
                    711: static void
                    712: print_brk(const struct syscallname *name,
                    713:     abi_long arg0, abi_long arg1, abi_long arg2,
                    714:     abi_long arg3, abi_long arg4, abi_long arg5)
                    715: {
                    716:     print_syscall_prologue(name);
                    717:     print_pointer(arg0, 1);
                    718:     print_syscall_epilogue(name);
                    719: }
                    720: #endif
                    721: 
                    722: #ifdef TARGET_NR_chdir
                    723: static void
                    724: print_chdir(const struct syscallname *name,
                    725:     abi_long arg0, abi_long arg1, abi_long arg2,
                    726:     abi_long arg3, abi_long arg4, abi_long arg5)
                    727: {
                    728:     print_syscall_prologue(name);
                    729:     print_string(arg0, 1);
                    730:     print_syscall_epilogue(name);
                    731: }
                    732: #endif
                    733: 
                    734: #ifdef TARGET_NR_chmod
                    735: static void
                    736: print_chmod(const struct syscallname *name,
                    737:     abi_long arg0, abi_long arg1, abi_long arg2,
                    738:     abi_long arg3, abi_long arg4, abi_long arg5)
                    739: {
                    740:     print_syscall_prologue(name);
                    741:     print_string(arg0, 0);
                    742:     print_file_mode(arg1, 1);
                    743:     print_syscall_epilogue(name);
                    744: }
                    745: #endif
                    746: 
1.1.1.5   root      747: #ifdef TARGET_NR_clone
                    748: static void
                    749: print_clone(const struct syscallname *name,
                    750:     abi_long arg0, abi_long arg1, abi_long arg2,
                    751:     abi_long arg3, abi_long arg4, abi_long arg5)
                    752: {
                    753:     print_syscall_prologue(name);
                    754: #if defined(TARGET_M68K)
                    755:     print_flags(clone_flags, arg0, 0);
                    756:     print_raw_param("newsp=0x" TARGET_ABI_FMT_lx, arg1, 1);
                    757: #elif defined(TARGET_SH4) || defined(TARGET_ALPHA)
                    758:     print_flags(clone_flags, arg0, 0);
                    759:     print_raw_param("child_stack=0x" TARGET_ABI_FMT_lx, arg1, 0);
                    760:     print_raw_param("parent_tidptr=0x" TARGET_ABI_FMT_lx, arg2, 0);
                    761:     print_raw_param("child_tidptr=0x" TARGET_ABI_FMT_lx, arg3, 0);
                    762:     print_raw_param("tls=0x" TARGET_ABI_FMT_lx, arg4, 1);
                    763: #elif defined(TARGET_CRIS)
                    764:     print_raw_param("child_stack=0x" TARGET_ABI_FMT_lx, arg0, 0);
                    765:     print_flags(clone_flags, arg1, 0);
                    766:     print_raw_param("parent_tidptr=0x" TARGET_ABI_FMT_lx, arg2, 0);
                    767:     print_raw_param("tls=0x" TARGET_ABI_FMT_lx, arg3, 0);
                    768:     print_raw_param("child_tidptr=0x" TARGET_ABI_FMT_lx, arg4, 1);
                    769: #else
                    770:     print_flags(clone_flags, arg0, 0);
                    771:     print_raw_param("child_stack=0x" TARGET_ABI_FMT_lx, arg1, 0);
                    772:     print_raw_param("parent_tidptr=0x" TARGET_ABI_FMT_lx, arg2, 0);
                    773:     print_raw_param("tls=0x" TARGET_ABI_FMT_lx, arg3, 0);
                    774:     print_raw_param("child_tidptr=0x" TARGET_ABI_FMT_lx, arg4, 1);
                    775: #endif
                    776:     print_syscall_epilogue(name);
                    777: }
                    778: #endif
                    779: 
1.1.1.3   root      780: #ifdef TARGET_NR_creat
                    781: static void
                    782: print_creat(const struct syscallname *name,
                    783:     abi_long arg0, abi_long arg1, abi_long arg2,
                    784:     abi_long arg3, abi_long arg4, abi_long arg5)
                    785: {
                    786:     print_syscall_prologue(name);
                    787:     print_string(arg0, 0);
                    788:     print_file_mode(arg1, 1);
                    789:     print_syscall_epilogue(name);
                    790: }
                    791: #endif
                    792: 
                    793: #ifdef TARGET_NR_execv
                    794: static void
                    795: print_execv(const struct syscallname *name,
                    796:     abi_long arg0, abi_long arg1, abi_long arg2,
                    797:     abi_long arg3, abi_long arg4, abi_long arg5)
                    798: {
                    799:     print_syscall_prologue(name);
                    800:     print_string(arg0, 0);
1.1.1.5   root      801:     print_raw_param("0x" TARGET_ABI_FMT_lx, arg1, 1);
1.1.1.3   root      802:     print_syscall_epilogue(name);
                    803: }
                    804: #endif
                    805: 
                    806: #ifdef TARGET_NR_faccessat
                    807: static void
                    808: print_faccessat(const struct syscallname *name,
                    809:     abi_long arg0, abi_long arg1, abi_long arg2,
                    810:     abi_long arg3, abi_long arg4, abi_long arg5)
                    811: {
                    812:     print_syscall_prologue(name);
                    813:     print_at_dirfd(arg0, 0);
                    814:     print_string(arg1, 0);
                    815:     print_flags(access_flags, arg2, 0);
                    816:     print_flags(at_file_flags, arg3, 1);
                    817:     print_syscall_epilogue(name);
                    818: }
                    819: #endif
                    820: 
                    821: #ifdef TARGET_NR_fchmodat
                    822: static void
                    823: print_fchmodat(const struct syscallname *name,
                    824:     abi_long arg0, abi_long arg1, abi_long arg2,
                    825:     abi_long arg3, abi_long arg4, abi_long arg5)
                    826: {
                    827:     print_syscall_prologue(name);
                    828:     print_at_dirfd(arg0, 0);
                    829:     print_string(arg1, 0);
                    830:     print_file_mode(arg2, 0);
                    831:     print_flags(at_file_flags, arg3, 1);
                    832:     print_syscall_epilogue(name);
                    833: }
                    834: #endif
                    835: 
                    836: #ifdef TARGET_NR_fchownat
                    837: static void
                    838: print_fchownat(const struct syscallname *name,
                    839:     abi_long arg0, abi_long arg1, abi_long arg2,
                    840:     abi_long arg3, abi_long arg4, abi_long arg5)
                    841: {
                    842:     print_syscall_prologue(name);
                    843:     print_at_dirfd(arg0, 0);
                    844:     print_string(arg1, 0);
1.1.1.5   root      845:     print_raw_param("%d", arg2, 0);
                    846:     print_raw_param("%d", arg3, 0);
1.1.1.3   root      847:     print_flags(at_file_flags, arg4, 1);
                    848:     print_syscall_epilogue(name);
                    849: }
                    850: #endif
                    851: 
                    852: #if defined(TARGET_NR_fcntl) || defined(TARGET_NR_fcntl64)
                    853: static void
                    854: print_fcntl(const struct syscallname *name,
                    855:     abi_long arg0, abi_long arg1, abi_long arg2,
                    856:     abi_long arg3, abi_long arg4, abi_long arg5)
                    857: {
                    858:     print_syscall_prologue(name);
1.1.1.5   root      859:     print_raw_param("%d", arg0, 0);
1.1.1.3   root      860:     print_flags(fcntl_flags, arg1, 0);
                    861:     /*
                    862:      * TODO: check flags and print following argument only
                    863:      *       when needed.
                    864:      */
                    865:     print_pointer(arg2, 1);
                    866:     print_syscall_epilogue(name);
                    867: }
                    868: #define print_fcntl64   print_fcntl
                    869: #endif
                    870: 
                    871: 
                    872: #ifdef TARGET_NR_futimesat
                    873: static void
                    874: print_futimesat(const struct syscallname *name,
                    875:     abi_long arg0, abi_long arg1, abi_long arg2,
                    876:     abi_long arg3, abi_long arg4, abi_long arg5)
                    877: {
                    878:     print_syscall_prologue(name);
                    879:     print_at_dirfd(arg0, 0);
                    880:     print_string(arg1, 0);
                    881:     print_timeval(arg2, 0);
                    882:     print_timeval(arg2 + sizeof (struct target_timeval), 1);
                    883:     print_syscall_epilogue(name);
                    884: }
                    885: #endif
                    886: 
                    887: #ifdef TARGET_NR_link
                    888: static void
                    889: print_link(const struct syscallname *name,
                    890:     abi_long arg0, abi_long arg1, abi_long arg2,
                    891:     abi_long arg3, abi_long arg4, abi_long arg5)
                    892: {
                    893:     print_syscall_prologue(name);
                    894:     print_string(arg0, 0);
                    895:     print_string(arg1, 1);
                    896:     print_syscall_epilogue(name);
                    897: }
                    898: #endif
                    899: 
                    900: #ifdef TARGET_NR_linkat
                    901: static void
                    902: print_linkat(const struct syscallname *name,
                    903:     abi_long arg0, abi_long arg1, abi_long arg2,
                    904:     abi_long arg3, abi_long arg4, abi_long arg5)
                    905: {
                    906:     print_syscall_prologue(name);
                    907:     print_at_dirfd(arg0, 0);
                    908:     print_string(arg1, 0);
                    909:     print_at_dirfd(arg2, 0);
                    910:     print_string(arg3, 0);
                    911:     print_flags(at_file_flags, arg4, 1);
                    912:     print_syscall_epilogue(name);
                    913: }
                    914: #endif
                    915: 
1.1.1.5   root      916: #ifdef TARGET_NR__llseek
                    917: static void
                    918: print__llseek(const struct syscallname *name,
                    919:     abi_long arg0, abi_long arg1, abi_long arg2,
                    920:     abi_long arg3, abi_long arg4, abi_long arg5)
                    921: {
                    922:     const char *whence = "UNKNOWN";
                    923:     print_syscall_prologue(name);
                    924:     print_raw_param("%d", arg0, 0);
                    925:     print_raw_param("%ld", arg1, 0);
                    926:     print_raw_param("%ld", arg2, 0);
                    927:     print_pointer(arg3, 0);
                    928:     switch(arg4) {
                    929:     case SEEK_SET: whence = "SEEK_SET"; break;
                    930:     case SEEK_CUR: whence = "SEEK_CUR"; break;
                    931:     case SEEK_END: whence = "SEEK_END"; break;
                    932:     }
                    933:     gemu_log("%s",whence);
                    934:     print_syscall_epilogue(name);
                    935: }
                    936: #endif
                    937: 
1.1.1.3   root      938: #if defined(TARGET_NR_stat) || defined(TARGET_NR_stat64) || \
                    939:     defined(TARGET_NR_lstat) || defined(TARGET_NR_lstat64)
                    940: static void
                    941: print_stat(const struct syscallname *name,
                    942:     abi_long arg0, abi_long arg1, abi_long arg2,
                    943:     abi_long arg3, abi_long arg4, abi_long arg5)
                    944: {
                    945:     print_syscall_prologue(name);
                    946:     print_string(arg0, 0);
                    947:     print_pointer(arg1, 1);
                    948:     print_syscall_epilogue(name);
                    949: }
                    950: #define print_lstat     print_stat
                    951: #define print_stat64   print_stat
                    952: #define print_lstat64   print_stat
                    953: #endif
                    954: 
                    955: #if defined(TARGET_NR_fstat) || defined(TARGET_NR_fstat64)
                    956: static void
                    957: print_fstat(const struct syscallname *name,
                    958:     abi_long arg0, abi_long arg1, abi_long arg2,
                    959:     abi_long arg3, abi_long arg4, abi_long arg5)
                    960: {
                    961:     print_syscall_prologue(name);
1.1.1.5   root      962:     print_raw_param("%d", arg0, 0);
1.1.1.3   root      963:     print_pointer(arg1, 1);
                    964:     print_syscall_epilogue(name);
                    965: }
                    966: #define print_fstat64     print_fstat
                    967: #endif
                    968: 
                    969: #ifdef TARGET_NR_mkdir
                    970: static void
                    971: print_mkdir(const struct syscallname *name,
                    972:     abi_long arg0, abi_long arg1, abi_long arg2,
                    973:     abi_long arg3, abi_long arg4, abi_long arg5)
                    974: {
                    975:     print_syscall_prologue(name);
                    976:     print_string(arg0, 0);
                    977:     print_file_mode(arg1, 1);
                    978:     print_syscall_epilogue(name);
                    979: }
                    980: #endif
                    981: 
                    982: #ifdef TARGET_NR_mkdirat
                    983: static void
                    984: print_mkdirat(const struct syscallname *name,
                    985:     abi_long arg0, abi_long arg1, abi_long arg2,
                    986:     abi_long arg3, abi_long arg4, abi_long arg5)
                    987: {
                    988:     print_syscall_prologue(name);
                    989:     print_at_dirfd(arg0, 0);
                    990:     print_string(arg1, 0);
                    991:     print_file_mode(arg2, 1);
                    992:     print_syscall_epilogue(name);
                    993: }
                    994: #endif
                    995: 
1.1.1.5   root      996: #ifdef TARGET_NR_rmdir
                    997: static void
                    998: print_rmdir(const struct syscallname *name,
                    999:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1000:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1001: {
                   1002:     print_syscall_prologue(name);
                   1003:     print_string(arg0, 0);
                   1004:     print_syscall_epilogue(name);
                   1005: }
                   1006: #endif
                   1007: 
                   1008: #ifdef TARGET_NR_rt_sigaction
                   1009: static void
                   1010: print_rt_sigaction(const struct syscallname *name,
                   1011:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1012:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1013: {
                   1014:     print_syscall_prologue(name);
                   1015:     print_signal(arg0, 0);
                   1016:     print_pointer(arg1, 0);
                   1017:     print_pointer(arg2, 1);
                   1018:     print_syscall_epilogue(name);
                   1019: }
                   1020: #endif
                   1021: 
                   1022: #ifdef TARGET_NR_rt_sigprocmask
                   1023: static void
                   1024: print_rt_sigprocmask(const struct syscallname *name,
                   1025:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1026:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1027: {
                   1028:     const char *how = "UNKNOWN";
                   1029:     print_syscall_prologue(name);
                   1030:     switch(arg0) {
                   1031:     case TARGET_SIG_BLOCK: how = "SIG_BLOCK"; break;
                   1032:     case TARGET_SIG_UNBLOCK: how = "SIG_UNBLOCK"; break;
                   1033:     case TARGET_SIG_SETMASK: how = "SIG_SETMASK"; break;
                   1034:     }
                   1035:     gemu_log("%s,",how);
                   1036:     print_pointer(arg1, 0);
                   1037:     print_pointer(arg2, 1);
                   1038:     print_syscall_epilogue(name);
                   1039: }
                   1040: #endif
                   1041: 
1.1.1.3   root     1042: #ifdef TARGET_NR_mknod
                   1043: static void
                   1044: print_mknod(const struct syscallname *name,
                   1045:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1046:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1047: {
1.1.1.5   root     1048:     int hasdev = (arg1 & (S_IFCHR|S_IFBLK));
1.1.1.3   root     1049: 
                   1050:     print_syscall_prologue(name);
                   1051:     print_string(arg0, 0);
                   1052:     print_file_mode(arg1, (hasdev == 0));
                   1053:     if (hasdev) {
1.1.1.5   root     1054:         print_raw_param("makedev(%d", major(arg2), 0);
                   1055:         print_raw_param("%d)", minor(arg2), 1);
1.1.1.3   root     1056:     }
                   1057:     print_syscall_epilogue(name);
                   1058: }
                   1059: #endif
                   1060: 
                   1061: #ifdef TARGET_NR_mknodat
                   1062: static void
                   1063: print_mknodat(const struct syscallname *name,
                   1064:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1065:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1066: {
1.1.1.5   root     1067:     int hasdev = (arg2 & (S_IFCHR|S_IFBLK));
1.1.1.3   root     1068: 
                   1069:     print_syscall_prologue(name);
                   1070:     print_at_dirfd(arg0, 0);
                   1071:     print_string(arg1, 0);
                   1072:     print_file_mode(arg2, (hasdev == 0));
                   1073:     if (hasdev) {
1.1.1.5   root     1074:         print_raw_param("makedev(%d", major(arg3), 0);
                   1075:         print_raw_param("%d)", minor(arg3), 1);
1.1.1.3   root     1076:     }
                   1077:     print_syscall_epilogue(name);
                   1078: }
                   1079: #endif
                   1080: 
                   1081: #ifdef TARGET_NR_mq_open
                   1082: static void
                   1083: print_mq_open(const struct syscallname *name,
                   1084:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1085:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1086: {
1.1.1.5   root     1087:     int is_creat = (arg1 & TARGET_O_CREAT);
1.1.1.3   root     1088: 
                   1089:     print_syscall_prologue(name);
                   1090:     print_string(arg0, 0);
                   1091:     print_open_flags(arg1, (is_creat == 0));
                   1092:     if (is_creat) {
                   1093:         print_file_mode(arg2, 0);
                   1094:         print_pointer(arg3, 1);
                   1095:     }
                   1096:     print_syscall_epilogue(name);
                   1097: }
                   1098: #endif
                   1099: 
                   1100: #ifdef TARGET_NR_open
                   1101: static void
                   1102: print_open(const struct syscallname *name,
                   1103:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1104:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1105: {
1.1.1.5   root     1106:     int is_creat = (arg1 & TARGET_O_CREAT);
1.1.1.3   root     1107: 
                   1108:     print_syscall_prologue(name);
                   1109:     print_string(arg0, 0);
                   1110:     print_open_flags(arg1, (is_creat == 0));
                   1111:     if (is_creat)
                   1112:         print_file_mode(arg2, 1);
                   1113:     print_syscall_epilogue(name);
                   1114: }
                   1115: #endif
                   1116: 
                   1117: #ifdef TARGET_NR_openat
                   1118: static void
                   1119: print_openat(const struct syscallname *name,
                   1120:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1121:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1122: {
1.1.1.5   root     1123:     int is_creat = (arg2 & TARGET_O_CREAT);
1.1.1.3   root     1124: 
                   1125:     print_syscall_prologue(name);
                   1126:     print_at_dirfd(arg0, 0);
                   1127:     print_string(arg1, 0);
                   1128:     print_open_flags(arg2, (is_creat == 0));
                   1129:     if (is_creat)
                   1130:         print_file_mode(arg3, 1);
                   1131:     print_syscall_epilogue(name);
                   1132: }
                   1133: #endif
                   1134: 
                   1135: #ifdef TARGET_NR_mq_unlink
                   1136: static void
                   1137: print_mq_unlink(const struct syscallname *name,
                   1138:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1139:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1140: {
                   1141:     print_syscall_prologue(name);
                   1142:     print_string(arg0, 1);
                   1143:     print_syscall_epilogue(name);
                   1144: }
                   1145: #endif
                   1146: 
                   1147: #if defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat)
                   1148: static void
                   1149: print_fstatat64(const struct syscallname *name,
                   1150:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1151:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1152: {
                   1153:     print_syscall_prologue(name);
                   1154:     print_at_dirfd(arg0, 0);
                   1155:     print_string(arg1, 0);
                   1156:     print_pointer(arg2, 0);
                   1157:     print_flags(at_file_flags, arg3, 1);
                   1158:     print_syscall_epilogue(name);
                   1159: }
                   1160: #define print_newfstatat    print_fstatat64
                   1161: #endif
                   1162: 
                   1163: #ifdef TARGET_NR_readlink
                   1164: static void
                   1165: print_readlink(const struct syscallname *name,
                   1166:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1167:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1168: {
                   1169:     print_syscall_prologue(name);
                   1170:     print_string(arg0, 0);
                   1171:     print_pointer(arg1, 0);
1.1.1.5   root     1172:     print_raw_param("%u", arg2, 1);
1.1.1.3   root     1173:     print_syscall_epilogue(name);
                   1174: }
                   1175: #endif
                   1176: 
                   1177: #ifdef TARGET_NR_readlinkat
                   1178: static void
                   1179: print_readlinkat(const struct syscallname *name,
                   1180:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1181:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1182: {
                   1183:     print_syscall_prologue(name);
                   1184:     print_at_dirfd(arg0, 0);
                   1185:     print_string(arg1, 0);
                   1186:     print_pointer(arg2, 0);
1.1.1.5   root     1187:     print_raw_param("%u", arg3, 1);
1.1.1.3   root     1188:     print_syscall_epilogue(name);
                   1189: }
                   1190: #endif
                   1191: 
                   1192: #ifdef TARGET_NR_rename
                   1193: static void
                   1194: print_rename(const struct syscallname *name,
                   1195:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1196:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1197: {
                   1198:     print_syscall_prologue(name);
                   1199:     print_string(arg0, 0);
                   1200:     print_string(arg1, 1);
                   1201:     print_syscall_epilogue(name);
                   1202: }
                   1203: #endif
                   1204: 
                   1205: #ifdef TARGET_NR_renameat
                   1206: static void
                   1207: print_renameat(const struct syscallname *name,
                   1208:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1209:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1210: {
                   1211:     print_syscall_prologue(name);
                   1212:     print_at_dirfd(arg0, 0);
                   1213:     print_string(arg1, 0);
                   1214:     print_at_dirfd(arg2, 0);
                   1215:     print_string(arg3, 1);
                   1216:     print_syscall_epilogue(name);
                   1217: }
                   1218: #endif
                   1219: 
                   1220: #ifdef TARGET_NR_statfs
                   1221: static void
                   1222: print_statfs(const struct syscallname *name,
                   1223:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1224:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1225: {
                   1226:     print_syscall_prologue(name);
                   1227:     print_string(arg0, 0);
                   1228:     print_pointer(arg1, 1);
                   1229:     print_syscall_epilogue(name);
                   1230: }
                   1231: #define print_statfs64  print_statfs
                   1232: #endif
                   1233: 
                   1234: #ifdef TARGET_NR_symlink
                   1235: static void
                   1236: print_symlink(const struct syscallname *name,
                   1237:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1238:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1239: {
                   1240:     print_syscall_prologue(name);
                   1241:     print_string(arg0, 0);
                   1242:     print_string(arg1, 1);
                   1243:     print_syscall_epilogue(name);
                   1244: }
                   1245: #endif
                   1246: 
                   1247: #ifdef TARGET_NR_symlinkat
                   1248: static void
                   1249: print_symlinkat(const struct syscallname *name,
                   1250:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1251:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1252: {
                   1253:     print_syscall_prologue(name);
                   1254:     print_string(arg0, 0);
                   1255:     print_at_dirfd(arg1, 0);
                   1256:     print_string(arg2, 1);
                   1257:     print_syscall_epilogue(name);
                   1258: }
                   1259: #endif
                   1260: 
                   1261: #ifdef TARGET_NR_mount
                   1262: static void
                   1263: print_mount(const struct syscallname *name,
                   1264:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1265:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1266: {
                   1267:     print_syscall_prologue(name);
                   1268:     print_string(arg0, 0);
                   1269:     print_string(arg1, 0);
                   1270:     print_string(arg2, 0);
                   1271:     print_flags(mount_flags, arg3, 0);
                   1272:     print_pointer(arg4, 1);
                   1273:     print_syscall_epilogue(name);
                   1274: }
                   1275: #endif
                   1276: 
                   1277: #ifdef TARGET_NR_umount
                   1278: static void
                   1279: print_umount(const struct syscallname *name,
                   1280:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1281:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1282: {
                   1283:     print_syscall_prologue(name);
                   1284:     print_string(arg0, 1);
                   1285:     print_syscall_epilogue(name);
                   1286: }
                   1287: #endif
                   1288: 
                   1289: #ifdef TARGET_NR_umount2
                   1290: static void
                   1291: print_umount2(const struct syscallname *name,
                   1292:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1293:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1294: {
                   1295:     print_syscall_prologue(name);
                   1296:     print_string(arg0, 0);
                   1297:     print_flags(umount2_flags, arg1, 1);
                   1298:     print_syscall_epilogue(name);
                   1299: }
                   1300: #endif
                   1301: 
                   1302: #ifdef TARGET_NR_unlink
                   1303: static void
                   1304: print_unlink(const struct syscallname *name,
                   1305:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1306:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1307: {
                   1308:     print_syscall_prologue(name);
                   1309:     print_string(arg0, 1);
                   1310:     print_syscall_epilogue(name);
                   1311: }
                   1312: #endif
                   1313: 
                   1314: #ifdef TARGET_NR_unlinkat
                   1315: static void
                   1316: print_unlinkat(const struct syscallname *name,
                   1317:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1318:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1319: {
                   1320:     print_syscall_prologue(name);
                   1321:     print_at_dirfd(arg0, 0);
                   1322:     print_string(arg1, 0);
                   1323:     print_flags(unlinkat_flags, arg2, 1);
                   1324:     print_syscall_epilogue(name);
                   1325: }
                   1326: #endif
                   1327: 
                   1328: #ifdef TARGET_NR_utime
                   1329: static void
                   1330: print_utime(const struct syscallname *name,
                   1331:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1332:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1333: {
                   1334:     print_syscall_prologue(name);
                   1335:     print_string(arg0, 0);
                   1336:     print_pointer(arg1, 1);
                   1337:     print_syscall_epilogue(name);
                   1338: }
                   1339: #endif
                   1340: 
                   1341: #ifdef TARGET_NR_utimes
                   1342: static void
                   1343: print_utimes(const struct syscallname *name,
                   1344:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1345:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1346: {
                   1347:     print_syscall_prologue(name);
                   1348:     print_string(arg0, 0);
                   1349:     print_pointer(arg1, 1);
                   1350:     print_syscall_epilogue(name);
                   1351: }
                   1352: #endif
                   1353: 
                   1354: #ifdef TARGET_NR_utimensat
                   1355: static void
                   1356: print_utimensat(const struct syscallname *name,
                   1357:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1358:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1359: {
                   1360:     print_syscall_prologue(name);
                   1361:     print_at_dirfd(arg0, 0);
                   1362:     print_string(arg1, 0);
                   1363:     print_pointer(arg2, 0);
                   1364:     print_flags(at_file_flags, arg3, 1);
                   1365:     print_syscall_epilogue(name);
                   1366: }
                   1367: #endif
                   1368: 
1.1.1.5   root     1369: #if defined(TARGET_NR_mmap) || defined(TARGET_NR_mmap2)
1.1.1.3   root     1370: static void
                   1371: print_mmap(const struct syscallname *name,
                   1372:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1373:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1374: {
                   1375:     print_syscall_prologue(name);
                   1376:     print_pointer(arg0, 0);
1.1.1.5   root     1377:     print_raw_param("%d", arg1, 0);
1.1.1.3   root     1378:     print_flags(mmap_prot_flags, arg2, 0);
                   1379:     print_flags(mmap_flags, arg3, 0);
1.1.1.5   root     1380:     print_raw_param("%d", arg4, 0);
                   1381:     print_raw_param("%#x", arg5, 1);
1.1.1.3   root     1382:     print_syscall_epilogue(name);
                   1383: }
                   1384: #define print_mmap2     print_mmap
                   1385: #endif
                   1386: 
                   1387: #ifdef TARGET_NR_mprotect
                   1388: static void
                   1389: print_mprotect(const struct syscallname *name,
                   1390:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1391:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1392: {
                   1393:     print_syscall_prologue(name);
                   1394:     print_pointer(arg0, 0);
1.1.1.5   root     1395:     print_raw_param("%d", arg1, 0);
1.1.1.3   root     1396:     print_flags(mmap_prot_flags, arg2, 1);
                   1397:     print_syscall_epilogue(name);
                   1398: }
                   1399: #endif
                   1400: 
                   1401: #ifdef TARGET_NR_munmap
                   1402: static void
                   1403: print_munmap(const struct syscallname *name,
                   1404:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1405:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1406: {
                   1407:     print_syscall_prologue(name);
                   1408:     print_pointer(arg0, 0);
1.1.1.5   root     1409:     print_raw_param("%d", arg1, 1);
1.1.1.3   root     1410:     print_syscall_epilogue(name);
                   1411: }
                   1412: #endif
                   1413: 
                   1414: #ifdef TARGET_NR_futex
                   1415: static void print_futex_op(abi_long tflag, int last)
                   1416: {
                   1417: #define print_op(val) \
                   1418: if( cmd == val ) { \
                   1419:     gemu_log(#val); \
                   1420:     return; \
                   1421: }
                   1422: 
1.1.1.5   root     1423:     int cmd = (int)tflag;
1.1.1.3   root     1424: #ifdef FUTEX_PRIVATE_FLAG
1.1.1.4   root     1425:     if (cmd & FUTEX_PRIVATE_FLAG) {
1.1.1.3   root     1426:         gemu_log("FUTEX_PRIVATE_FLAG|");
1.1.1.4   root     1427:         cmd &= ~FUTEX_PRIVATE_FLAG;
                   1428:     }
1.1.1.3   root     1429: #endif
                   1430:     print_op(FUTEX_WAIT)
                   1431:     print_op(FUTEX_WAKE)
                   1432:     print_op(FUTEX_FD)
                   1433:     print_op(FUTEX_REQUEUE)
                   1434:     print_op(FUTEX_CMP_REQUEUE)
                   1435:     print_op(FUTEX_WAKE_OP)
                   1436:     print_op(FUTEX_LOCK_PI)
                   1437:     print_op(FUTEX_UNLOCK_PI)
                   1438:     print_op(FUTEX_TRYLOCK_PI)
                   1439: #ifdef FUTEX_WAIT_BITSET
                   1440:     print_op(FUTEX_WAIT_BITSET)
                   1441: #endif
                   1442: #ifdef FUTEX_WAKE_BITSET
                   1443:     print_op(FUTEX_WAKE_BITSET)
                   1444: #endif
                   1445:     /* unknown values */
                   1446:     gemu_log("%d",cmd);
                   1447: }
                   1448: 
                   1449: static void
                   1450: print_futex(const struct syscallname *name,
                   1451:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1452:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1453: {
                   1454:     print_syscall_prologue(name);
                   1455:     print_pointer(arg0, 0);
                   1456:     print_futex_op(arg1, 0);
1.1.1.5   root     1457:     print_raw_param(",%d", arg2, 0);
1.1.1.3   root     1458:     print_pointer(arg3, 0); /* struct timespec */
                   1459:     print_pointer(arg4, 0);
1.1.1.5   root     1460:     print_raw_param("%d", arg4, 1);
                   1461:     print_syscall_epilogue(name);
                   1462: }
                   1463: #endif
                   1464: 
                   1465: #ifdef TARGET_NR_kill
                   1466: static void
                   1467: print_kill(const struct syscallname *name,
                   1468:     abi_long arg0, abi_long arg1, abi_long arg2,
                   1469:     abi_long arg3, abi_long arg4, abi_long arg5)
                   1470: {
                   1471:     print_syscall_prologue(name);
                   1472:     print_raw_param("%d", arg0, 0);
                   1473:     print_signal(arg1, 1);
1.1.1.3   root     1474:     print_syscall_epilogue(name);
                   1475: }
                   1476: #endif
                   1477: 
1.1       root     1478: /*
                   1479:  * An array of all of the syscalls we know about
                   1480:  */
                   1481: 
1.1.1.2   root     1482: static const struct syscallname scnames[] = {
1.1       root     1483: #include "strace.list"
                   1484: };
                   1485: 
1.1.1.2   root     1486: static int nsyscalls = ARRAY_SIZE(scnames);
1.1       root     1487: 
                   1488: /*
                   1489:  * The public interface to this module.
                   1490:  */
                   1491: void
                   1492: print_syscall(int num,
                   1493:               abi_long arg1, abi_long arg2, abi_long arg3,
                   1494:               abi_long arg4, abi_long arg5, abi_long arg6)
                   1495: {
                   1496:     int i;
1.1.1.2   root     1497:     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 ")";
1.1       root     1498: 
                   1499:     gemu_log("%d ", getpid() );
                   1500: 
                   1501:     for(i=0;i<nsyscalls;i++)
                   1502:         if( scnames[i].nr == num ) {
                   1503:             if( scnames[i].call != NULL ) {
                   1504:                 scnames[i].call(&scnames[i],arg1,arg2,arg3,arg4,arg5,arg6);
                   1505:             } else {
                   1506:                 /* XXX: this format system is broken because it uses
                   1507:                    host types and host pointers for strings */
                   1508:                 if( scnames[i].format != NULL )
                   1509:                     format = scnames[i].format;
                   1510:                 gemu_log(format,scnames[i].name, arg1,arg2,arg3,arg4,arg5,arg6);
                   1511:             }
1.1.1.2   root     1512:             return;
1.1       root     1513:         }
1.1.1.2   root     1514:     gemu_log("Unknown syscall %d\n", num);
1.1       root     1515: }
                   1516: 
                   1517: 
                   1518: void
                   1519: print_syscall_ret(int num, abi_long ret)
                   1520: {
                   1521:     int i;
1.1.1.7 ! root     1522:     char *errstr = NULL;
1.1       root     1523: 
                   1524:     for(i=0;i<nsyscalls;i++)
                   1525:         if( scnames[i].nr == num ) {
                   1526:             if( scnames[i].result != NULL ) {
                   1527:                 scnames[i].result(&scnames[i],ret);
                   1528:             } else {
1.1.1.7 ! root     1529:                 if (ret < 0) {
        !          1530:                     errstr = target_strerror(-ret);
        !          1531:                 }
        !          1532:                 if (errstr) {
        !          1533:                     gemu_log(" = -1 errno=" TARGET_ABI_FMT_ld " (%s)\n",
        !          1534:                              -ret, errstr);
1.1       root     1535:                 } else {
                   1536:                     gemu_log(" = " TARGET_ABI_FMT_ld "\n", ret);
                   1537:                 }
                   1538:             }
                   1539:             break;
                   1540:         }
                   1541: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.