]> git.proxmox.com Git - qemu.git/blob - linux-user/strace.c
update VERSION for 1.1.2
[qemu.git] / linux-user / strace.c
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 }