2008-10-23 Dmitry V. Levin <[EMAIL PROTECTED]> Implement parsers for new linux syscalls. * desc.c (do_dup2, sys_dup3): New functions. (sys_dup2): Use do_dup2. (sys_epoll_create1): New function. (do_eventfd, sys_eventfd2): New functions. (sys_eventfd): Use do_eventfd. * net.c (do_pipe, sys_pipe2): New functions. (sys_pipe): Use do_pipe. * signal.c (do_signalfd, sys_signalfd4): New functions. (sys_signalfd): Use do_signalfd. * linux/syscall.h: Declare new sys_* functions. * linux/syscallent.h: Hook up signalfd4, eventfd2, epoll_create1, dup3, pipe2, inotify_init1. * linux/x86_64/syscallent.h: Hook up paccept, signalfd4, eventfd2, epoll_create1, dup3, pipe2, inotify_init1.
--- desc.c | 61 +++++++++++++++++++++++++++++++------ linux/syscall.h | 1 + linux/syscallent.h | 12 ++++---- linux/x86_64/syscallent.h | 7 ++++ net.c | 51 +++++++++++++++++++++---------- signal.c | 23 ++++++++++++-- 6 files changed, 120 insertions(+), 35 deletions(-) --- desc.c +++ desc.c @@ -242,6 +242,8 @@ int getlk; } #endif +extern const struct xlat open_mode_flags[]; + /* * low bits of the open(2) flags define access mode, * other bits are real flags. @@ -250,7 +252,6 @@ static const char * sprint_open_modes(mode_t flags) { extern const struct xlat open_access_modes[]; - extern const struct xlat open_mode_flags[]; static char outstr[1024]; const char *str = xlookup(open_access_modes, flags & 3); const char *sep = ""; @@ -396,16 +397,33 @@ struct tcb *tcp; return 0; } -int -sys_dup2(tcp) -struct tcb *tcp; +static int +do_dup2(struct tcb *tcp, int flags_arg) { if (entering(tcp)) { tprintf("%ld, %ld", tcp->u_arg[0], tcp->u_arg[1]); + if (flags_arg >= 0) { + tprintf(", "); + printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???"); + } } return 0; } +int +sys_dup2(struct tcb *tcp) +{ + return do_dup2(tcp, -1); +} + +#ifdef LINUX +int +sys_dup3(struct tcb *tcp) +{ + return do_dup2(tcp, 2); +} +#endif + #if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4) int sys_getdtablesize(tcp) @@ -605,14 +623,21 @@ static struct xlat epollevents[] = { }; int -sys_epoll_create(tcp) -struct tcb *tcp; +sys_epoll_create(struct tcb *tcp) { if (entering(tcp)) tprintf("%ld", tcp->u_arg[0]); return 0; } +int +sys_epoll_create1(struct tcb *tcp) +{ + if (entering(tcp)) + printflags(open_mode_flags, tcp->u_arg[0], "O_???"); + return 0; +} + #ifdef HAVE_SYS_EPOLL_H static void print_epoll_event(ev) @@ -889,12 +914,28 @@ sys_pselect6(struct tcb *tcp) return rc; } -int -sys_eventfd(tcp) -struct tcb *tcp; +static int +do_eventfd(struct tcb *tcp, int flags_arg) { - if (entering(tcp)) + if (entering(tcp)) { tprintf("%lu", tcp->u_arg[0]); + if (flags_arg >= 0) { + tprintf(", "); + printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???"); + } + } return 0; } + +int +sys_eventfd(struct tcb *tcp) +{ + return do_eventfd(tcp, -1); +} + +int +sys_eventfd2(struct tcb *tcp) +{ + return do_eventfd(tcp, 1); +} #endif --- linux/syscall.h +++ linux/syscall.h @@ -105,6 +105,7 @@ int sys_io_setup(), sys_io_submit(), sys_io_cancel(), sys_io_getevents(), sys_io int sys_utimensat(), sys_epoll_pwait(), sys_signalfd(), sys_timerfd(), sys_eventfd(); int sys_getcpu(); int sys_fallocate(), sys_timerfd_create(), sys_timerfd_settime(), sys_timerfd_gettime(); +int sys_signalfd4(), sys_eventfd2(), sys_epoll_create1(), sys_dup3(), sys_pipe2(); /* sys_socketcall subcalls */ --- linux/syscallent.h +++ linux/syscallent.h @@ -357,12 +357,12 @@ { 6, TF, sys_fallocate, "fallocate" }, /* 324 */ { 4, TD, sys_timerfd_settime, "timerfd_settime"}, /* 325 */ { 2, TD, sys_timerfd_gettime, "timerfd_gettime"}, /* 326 */ - { 5, 0, printargs, "SYS_327" }, /* 327 */ - { 5, 0, printargs, "SYS_328" }, /* 328 */ - { 5, 0, printargs, "SYS_329" }, /* 329 */ - { 5, 0, printargs, "SYS_330" }, /* 330 */ - { 5, 0, printargs, "SYS_331" }, /* 331 */ - { 5, 0, printargs, "SYS_332" }, /* 332 */ + { 4, TD|TS, sys_signalfd4, "signalfd4" }, /* 327 */ + { 2, TD, sys_eventfd2, "eventfd2" }, /* 328 */ + { 1, 0, sys_epoll_create1, "epoll_create1" }, /* 329 */ + { 3, TD, sys_dup3, "dup3" }, /* 330 */ + { 2, TD, sys_pipe2, "pipe2" }, /* 331 */ + { 1, TD, printargs, "inotify_init1" }, /* 332 */ { 5, 0, printargs, "SYS_333" }, /* 333 */ { 5, 0, printargs, "SYS_334" }, /* 334 */ { 5, 0, printargs, "SYS_335" }, /* 335 */ --- linux/x86_64/syscallent.h +++ linux/x86_64/syscallent.h @@ -286,3 +286,10 @@ { 6, TF, sys_fallocate, "fallocate" }, /* 285 */ { 4, TD, sys_timerfd_settime, "timerfd_settime"}, /* 286 */ { 2, TD, sys_timerfd_gettime, "timerfd_gettime"}, /* 287 */ + { 6, TN, printargs, "paccept" }, /* 288 */ + { 4, TD|TS, sys_signalfd4, "signalfd4" }, /* 289 */ + { 2, TD, sys_eventfd2, "eventfd2" }, /* 290 */ + { 1, 0, sys_epoll_create1, "epoll_create1" }, /* 291 */ + { 3, TD, sys_dup3, "dup3" }, /* 292 */ + { 2, TD, sys_pipe2, "pipe2" }, /* 293 */ + { 1, TD, printargs, "inotify_init1" }, /* 294 */ --- net.c +++ net.c @@ -1497,32 +1497,51 @@ struct tcb *tcp; return sys_accept(tcp); } -int -sys_pipe(tcp) -struct tcb *tcp; -{ - -#if defined(LINUX) && !defined(SPARC) && !defined(SPARC64) && !defined(SH) && !defined(IA64) - int fds[2]; +extern const struct xlat open_mode_flags[]; +static int +do_pipe(struct tcb *tcp, int flags_arg) +{ if (exiting(tcp)) { if (syserror(tcp)) { tprintf("%#lx", tcp->u_arg[0]); - return 0; - } - if (umoven(tcp, tcp->u_arg[0], sizeof fds, (char *) fds) < 0) - tprintf("[...]"); - else - tprintf("[%u, %u]", fds[0], fds[1]); - } + } else { +#if defined(LINUX) && !defined(SPARC) && !defined(SPARC64) && !defined(SH) && !defined(IA64) + int fds[2]; + + if (umoven(tcp, tcp->u_arg[0], sizeof fds, (char *) fds) < 0) + tprintf("[...]"); + else + tprintf("[%u, %u]", fds[0], fds[1]); #elif defined(SPARC) || defined(SPARC64) || defined(SH) || defined(SVR4) || defined(FREEBSD) || defined(IA64) - if (exiting(tcp)) - tprintf("[%lu, %lu]", tcp->u_rval, getrval2(tcp)); + tprintf("[%lu, %lu]", tcp->u_rval, getrval2(tcp)); +#else + tprintf("%#lx", tcp->u_arg[0]); #endif + } + if (flags_arg >= 0) { + tprintf(", "); + printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???"); + } + } return 0; } int +sys_pipe(struct tcb *tcp) +{ + return do_pipe(tcp, -1); +} + +#ifdef LINUX +int +sys_pipe2(struct tcb *tcp) +{ + return do_pipe(tcp, 1); +} +#endif + +int sys_socketpair(struct tcb *tcp) { #ifdef LINUX --- signal.c +++ signal.c @@ -2011,15 +2011,32 @@ struct tcb *tcp; return 0; } -int -sys_signalfd(tcp) -struct tcb *tcp; +extern const struct xlat open_mode_flags[]; + +static int +do_signalfd(struct tcb *tcp, int flags_arg) { if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); print_sigset(tcp, tcp->u_arg[1], 1); tprintf("%lu", tcp->u_arg[2]); + if (flags_arg >= 0) { + tprintf(", "); + printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???"); + } } return 0; } + +int +sys_signalfd(struct tcb *tcp) +{ + return do_signalfd(tcp, -1); +} + +int +sys_signalfd4(struct tcb *tcp) +{ + return do_signalfd(tcp, 3); +} #endif /* LINUX */ -- ldv
pgpRNqfJqIEry.pgp
Description: PGP signature
------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel