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