Statistics
| Branch: | Revision:

root / linux-user / strace.c @ 93148aa5

History | View | Annotate | Download (39 kB)

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>
8
#include <sys/mount.h>
9
#include <sys/mman.h>
10
#include <unistd.h>
11
#include <sched.h>
12
#include "qemu.h"
13

    
14
int do_strace=0;
15

    
16
struct syscallname {
17
    int nr;
18
    const char *name;
19
    const char *format;
20
    void (*call)(const struct syscallname *,
21
                 abi_long, abi_long, abi_long,
22
                 abi_long, abi_long, abi_long);
23
    void (*result)(const struct syscallname *, abi_long);
24
};
25

    
26
#ifdef __GNUC__
27
/*
28
 * It is possible that target doesn't have syscall that uses
29
 * following flags but we don't want the compiler to warn
30
 * us about them being unused.  Same applies to utility print
31
 * functions.  It is ok to keep them while not used.
32
 */
33
#define UNUSED __attribute__ ((unused))
34
#else
35
#define UNUSED
36
#endif
37

    
38
/*
39
 * Structure used to translate flag values into strings.  This is
40
 * similar that is in the actual strace tool.
41
 */
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);
66
UNUSED static void print_signal(abi_ulong, int);
67

    
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

    
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

    
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--) {
171
            if ((tswapal(target_fds[i / TARGET_ABI_BITS]) >> (i & (TARGET_ABI_BITS - 1))) & 1)
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
193
print_newselect(const struct syscallname *name,
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(",");
204
    print_timeval(arg5, 1);
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

    
216
#ifdef TARGET_NR_semctl
217
static void
218
print_semctl(const struct syscallname *name,
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
}
226
#endif
227

    
228
static void
229
print_execve(const struct syscallname *name,
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)) {
242
        abi_ulong *arg_ptr, arg_addr;
243

    
244
        arg_ptr = lock_user(VERIFY_READ, arg_ptr_addr, sizeof(abi_ulong), 1);
245
        if (!arg_ptr)
246
            return;
247
    arg_addr = tswapal(*arg_ptr);
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);
253
            unlock_user(s, arg_addr, 0);
254
        }
255
    }
256

    
257
    gemu_log("NULL})");
258
}
259

    
260
#ifdef TARGET_NR_ipc
261
static void
262
print_ipc(const struct syscallname *name,
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:
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);
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
284
print_syscall_ret_addr(const struct syscallname *name, abi_long ret)
285
{
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);
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
308
print_syscall_ret_newselect(const struct syscallname *name, abi_long ret)
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(",");
317
    print_timeval(newselect_arg5, 1);
318
    gemu_log(")\n");
319
}
320
#endif
321

    
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),
425
    FLAG_TARGET(PROT_SEM),
426
    FLAG_GENERIC(PROT_GROWSDOWN),
427
    FLAG_GENERIC(PROT_GROWSUP),
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),
438
    FLAG_TARGET(MAP_EXECUTABLE),
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
449
#ifdef TARGET_MAP_UNINITIALIZED
450
    FLAG_TARGET(MAP_UNINITIALIZED),
451
#endif
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

    
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

    
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
519
print_flags(const struct flags *f, abi_long flags, int last)
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) {
540
            gemu_log("%s%#x%s", sep, (unsigned int)flags, get_comma(last));
541
        } else {
542
            gemu_log("%s", get_comma(last));
543
        }
544
    } else {
545
        /* no string version of flags found, print them in hex then */
546
        gemu_log("%#x%s", (unsigned int)flags, get_comma(last));
547
    }
548
}
549

    
550
static void
551
print_at_dirfd(abi_long dirfd, int last)
552
{
553
#ifdef AT_FDCWD
554
    if (dirfd == AT_FDCWD) {
555
        gemu_log("AT_FDCWD%s", get_comma(last));
556
        return;
557
    }
558
#endif
559
    gemu_log("%d%s", (int)dirfd, get_comma(last));
560
}
561

    
562
static void
563
print_file_mode(abi_long mode, int last)
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)
580
        gemu_log("%s%#o", sep, (unsigned int)mode);
581

    
582
    gemu_log("%s", get_comma(last));
583
}
584

    
585
static void
586
print_open_flags(abi_long flags, int last)
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);
690
    print_raw_param("%d", arg0, 0);
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

    
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

    
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);
801
    print_raw_param("0x" TARGET_ABI_FMT_lx, arg1, 1);
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);
845
    print_raw_param("%d", arg2, 0);
846
    print_raw_param("%d", arg3, 0);
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);
859
    print_raw_param("%d", arg0, 0);
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

    
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

    
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);
962
    print_raw_param("%d", arg0, 0);
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

    
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

    
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
{
1048
    int hasdev = (arg1 & (S_IFCHR|S_IFBLK));
1049

    
1050
    print_syscall_prologue(name);
1051
    print_string(arg0, 0);
1052
    print_file_mode(arg1, (hasdev == 0));
1053
    if (hasdev) {
1054
        print_raw_param("makedev(%d", major(arg2), 0);
1055
        print_raw_param("%d)", minor(arg2), 1);
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
{
1067
    int hasdev = (arg2 & (S_IFCHR|S_IFBLK));
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) {
1074
        print_raw_param("makedev(%d", major(arg3), 0);
1075
        print_raw_param("%d)", minor(arg3), 1);
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
{
1087
    int is_creat = (arg1 & TARGET_O_CREAT);
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
{
1106
    int is_creat = (arg1 & TARGET_O_CREAT);
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
{
1123
    int is_creat = (arg2 & TARGET_O_CREAT);
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);
1172
    print_raw_param("%u", arg2, 1);
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);
1187
    print_raw_param("%u", arg3, 1);
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

    
1369
#if defined(TARGET_NR_mmap) || defined(TARGET_NR_mmap2)
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);
1377
    print_raw_param("%d", arg1, 0);
1378
    print_flags(mmap_prot_flags, arg2, 0);
1379
    print_flags(mmap_flags, arg3, 0);
1380
    print_raw_param("%d", arg4, 0);
1381
    print_raw_param("%#x", arg5, 1);
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);
1395
    print_raw_param("%d", arg1, 0);
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);
1409
    print_raw_param("%d", arg1, 1);
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

    
1423
    int cmd = (int)tflag;
1424
#ifdef FUTEX_PRIVATE_FLAG
1425
    if (cmd & FUTEX_PRIVATE_FLAG) {
1426
        gemu_log("FUTEX_PRIVATE_FLAG|");
1427
        cmd &= ~FUTEX_PRIVATE_FLAG;
1428
    }
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);
1457
    print_raw_param(",%d", arg2, 0);
1458
    print_pointer(arg3, 0); /* struct timespec */
1459
    print_pointer(arg4, 0);
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);
1474
    print_syscall_epilogue(name);
1475
}
1476
#endif
1477

    
1478
/*
1479
 * An array of all of the syscalls we know about
1480
 */
1481

    
1482
static const struct syscallname scnames[] = {
1483
#include "strace.list"
1484
};
1485

    
1486
static int nsyscalls = ARRAY_SIZE(scnames);
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;
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 ")";
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
            }
1512
            return;
1513
        }
1514
    gemu_log("Unknown syscall %d\n", num);
1515
}
1516

    
1517

    
1518
void
1519
print_syscall_ret(int num, abi_long ret)
1520
{
1521
    int i;
1522
    char *errstr = NULL;
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 {
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);
1535
                } else {
1536
                    gemu_log(" = " TARGET_ABI_FMT_ld "\n", ret);
1537
                }
1538
            }
1539
            break;
1540
        }
1541
}