X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=desc.c;h=48824697fc090f48a4bab68177fa661c5440e86f;hb=3fb78d7305cd5b38bbed2d91b328c3181207b4e9;hp=0686bf4097077b8c95b20ec64ee147b93797f9eb;hpb=54cabefc753cc72417bb610cb9f7873f4389e9f5;p=strace diff --git a/desc.c b/desc.c index 0686bf40..48824697 100644 --- a/desc.c +++ b/desc.c @@ -29,463 +29,63 @@ */ #include "defs.h" -#include -#include -#ifdef HAVE_SYS_EPOLL_H -# include -#endif -#ifdef HAVE_LINUX_PERF_EVENT_H -# include -#endif - -static const struct xlat fcntlcmds[] = { - XLAT(F_DUPFD), - XLAT(F_GETFD), - XLAT(F_SETFD), - XLAT(F_GETFL), - XLAT(F_SETFL), - XLAT(F_GETLK), - XLAT(F_SETLK), - XLAT(F_SETLKW), - XLAT(F_GETOWN), - XLAT(F_SETOWN), -#ifdef F_RSETLK - XLAT(F_RSETLK), -#endif -#ifdef F_RSETLKW - XLAT(F_RSETLKW), -#endif -#ifdef F_RGETLK - XLAT(F_RGETLK), -#endif -#ifdef F_CNVT - XLAT(F_CNVT), -#endif -#ifdef F_SETSIG - XLAT(F_SETSIG), -#endif -#ifdef F_GETSIG - XLAT(F_GETSIG), -#endif -#ifdef F_CHKFL - XLAT(F_CHKFL), -#endif -#ifdef F_DUP2FD - XLAT(F_DUP2FD), -#endif -#ifdef F_ALLOCSP - XLAT(F_ALLOCSP), -#endif -#ifdef F_ISSTREAM - XLAT(F_ISSTREAM), -#endif -#ifdef F_PRIV - XLAT(F_PRIV), -#endif -#ifdef F_NPRIV - XLAT(F_NPRIV), -#endif -#ifdef F_QUOTACL - XLAT(F_QUOTACL), -#endif -#ifdef F_BLOCKS - XLAT(F_BLOCKS), -#endif -#ifdef F_BLKSIZE - XLAT(F_BLKSIZE), -#endif -#ifdef F_GETOWN - XLAT(F_GETOWN), -#endif -#ifdef F_SETOWN - XLAT(F_SETOWN), -#endif -#ifdef F_REVOKE - XLAT(F_REVOKE), -#endif -#ifdef F_SETLK - XLAT(F_SETLK), -#endif -#ifdef F_SETLKW - XLAT(F_SETLKW), -#endif -#ifdef F_GETLK - XLAT(F_GETLK), -#endif -#ifdef F_SETLK64 - XLAT(F_SETLK64), -#endif -#ifdef F_SETLKW64 - XLAT(F_SETLKW64), -#endif -#ifdef F_GETLK64 - XLAT(F_GETLK64), -#endif -#ifdef F_SHARE - XLAT(F_SHARE), -#endif -#ifdef F_UNSHARE - XLAT(F_UNSHARE), -#endif -#ifdef F_SETLEASE - XLAT(F_SETLEASE), -#endif -#ifdef F_GETLEASE - XLAT(F_GETLEASE), -#endif -#ifdef F_NOTIFY - XLAT(F_NOTIFY), -#endif -#ifdef F_DUPFD_CLOEXEC - XLAT(F_DUPFD_CLOEXEC), -#endif - XLAT_END -}; - -static const struct xlat fdflags[] = { -#ifdef FD_CLOEXEC - XLAT(FD_CLOEXEC), -#endif - XLAT_END -}; - -#ifdef LOCK_SH - -static const struct xlat flockcmds[] = { - XLAT(LOCK_SH), - XLAT(LOCK_EX), - XLAT(LOCK_NB), - XLAT(LOCK_UN), - XLAT_END -}; - -#endif /* LOCK_SH */ - -static const struct xlat lockfcmds[] = { - XLAT(F_RDLCK), - XLAT(F_WRLCK), - XLAT(F_UNLCK), -#ifdef F_EXLCK - XLAT(F_EXLCK), -#endif -#ifdef F_SHLCK - XLAT(F_SHLCK), -#endif - XLAT_END -}; - -#ifdef F_NOTIFY -static const struct xlat notifyflags[] = { -#ifdef DN_ACCESS - XLAT(DN_ACCESS), -#endif -#ifdef DN_MODIFY - XLAT(DN_MODIFY), -#endif -#ifdef DN_CREATE - XLAT(DN_CREATE), -#endif -#ifdef DN_DELETE - XLAT(DN_DELETE), -#endif -#ifdef DN_RENAME - XLAT(DN_RENAME), -#endif -#ifdef DN_ATTRIB - XLAT(DN_ATTRIB), -#endif -#ifdef DN_MULTISHOT - XLAT(DN_MULTISHOT), -#endif - XLAT_END -}; -#endif - -static const struct xlat perf_event_open_flags[] = { -#ifdef PERF_FLAG_FD_NO_GROUP - XLAT(PERF_FLAG_FD_NO_GROUP), -#endif -#ifdef PERF_FLAG_FD_OUTPUT - XLAT(PERF_FLAG_FD_OUTPUT), -#endif -#ifdef PERF_FLAG_PID_CGROUP - XLAT(PERF_FLAG_PID_CGROUP), -#endif - XLAT_END -}; - -/* - * Assume that F_SETLK64, F_SETLKW64, and F_GETLK64 are either defined - * or not defined altogether. - */ -#if defined(F_SETLK64) && F_SETLK64 + 0 != F_SETLK -# define USE_PRINTFLOCK64 1 -#else -# define USE_PRINTFLOCK64 0 -#endif -#if USE_PRINTFLOCK64 - -# ifndef HAVE_STRUCT_FLOCK64 -struct flock64 { - short int l_type, l_whence; - int64_t l_start, l_len; - int l_pid; -}; -# endif - -static void -printflock64(struct tcb *tcp, long addr, int getlk) -{ - struct flock64 fl; - - if (umove(tcp, addr, &fl) < 0) { - tprints("{...}"); - return; - } - tprints("{type="); - printxval(lockfcmds, fl.l_type, "F_???"); - tprints(", whence="); - printxval(whence_codes, fl.l_whence, "SEEK_???"); - tprintf(", start=%lld, len=%lld", (long long) fl.l_start, (long long) fl.l_len); - if (getlk) - tprintf(", pid=%lu}", (unsigned long) fl.l_pid); - else - tprints("}"); -} -#endif /* USE_PRINTFLOCK64 */ - -static void -printflock(struct tcb *tcp, long addr, int getlk) +SYS_FUNC(close) { - struct flock fl; - int r; + printfd(tcp, tcp->u_arg[0]); -#if SUPPORTED_PERSONALITIES > 1 - if ( -# if SIZEOF_OFF_T > SIZEOF_LONG - current_personality > 0 && -#endif - current_wordsize != sizeof(fl.l_start)) { - if (current_wordsize == 4) { - /* 32-bit x86 app on x86_64 and similar cases */ - struct { - short int l_type; - short int l_whence; - int32_t l_start; /* off_t */ - int32_t l_len; /* off_t */ - int32_t l_pid; /* pid_t */ - } fl32; - r = umove(tcp, addr, &fl32); - if (r >= 0) { - fl.l_type = fl32.l_type; - fl.l_whence = fl32.l_whence; - fl.l_start = fl32.l_start; - fl.l_len = fl32.l_len; - fl.l_pid = fl32.l_pid; - } - } else { - /* let people know we have a problem here */ - tprintf("", - current_wordsize); - return; - } - } else -#endif - { - r = umove(tcp, addr, &fl); - } - if (r < 0) { - tprints("{...}"); - return; - } - tprints("{type="); - printxval(lockfcmds, fl.l_type, "F_???"); - tprints(", whence="); - printxval(whence_codes, fl.l_whence, "SEEK_???"); -#if SIZEOF_OFF_T > SIZEOF_LONG - tprintf(", start=%lld, len=%lld", fl.l_start, fl.l_len); -#else - tprintf(", start=%ld, len=%ld", fl.l_start, fl.l_len); -#endif - if (getlk) - tprintf(", pid=%lu}", (unsigned long) fl.l_pid); - else - tprints("}"); -} - -int -sys_fcntl(struct tcb *tcp) -{ - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - printxval(fcntlcmds, tcp->u_arg[1], "F_???"); - switch (tcp->u_arg[1]) { - case F_SETFD: - tprints(", "); - printflags(fdflags, tcp->u_arg[2], "FD_???"); - break; - case F_SETOWN: case F_DUPFD: -#ifdef F_DUPFD_CLOEXEC - case F_DUPFD_CLOEXEC: -#endif - tprintf(", %ld", tcp->u_arg[2]); - break; - case F_SETFL: - tprints(", "); - tprint_open_modes(tcp->u_arg[2]); - break; - case F_SETLK: case F_SETLKW: - tprints(", "); - printflock(tcp, tcp->u_arg[2], 0); - break; -#if USE_PRINTFLOCK64 - case F_SETLK64: case F_SETLKW64: - tprints(", "); - printflock64(tcp, tcp->u_arg[2], 0); - break; -#endif /* USE_PRINTFLOCK64 */ -#ifdef F_NOTIFY - case F_NOTIFY: - tprints(", "); - printflags(notifyflags, tcp->u_arg[2], "DN_???"); - break; -#endif -#ifdef F_SETLEASE - case F_SETLEASE: - tprints(", "); - printxval(lockfcmds, tcp->u_arg[2], "F_???"); - break; -#endif - } - } - else { - switch (tcp->u_arg[1]) { - case F_DUPFD: -#ifdef F_DUPFD_CLOEXEC - case F_DUPFD_CLOEXEC: -#endif - case F_SETFD: case F_SETFL: - case F_SETLK: case F_SETLKW: - case F_SETOWN: case F_GETOWN: -#ifdef F_NOTIFY - case F_NOTIFY: -#endif -#ifdef F_SETLEASE - case F_SETLEASE: -#endif - break; - case F_GETFD: - if (syserror(tcp) || tcp->u_rval == 0) - return 0; - tcp->auxstr = sprintflags("flags ", fdflags, tcp->u_rval); - return RVAL_HEX|RVAL_STR; - case F_GETFL: - if (syserror(tcp)) - return 0; - tcp->auxstr = sprint_open_modes(tcp->u_rval); - return RVAL_HEX|RVAL_STR; - case F_GETLK: - tprints(", "); - printflock(tcp, tcp->u_arg[2], 1); - break; -#if USE_PRINTFLOCK64 - case F_GETLK64: - tprints(", "); - printflock64(tcp, tcp->u_arg[2], 1); - break; -#endif -#ifdef F_GETLEASE - case F_GETLEASE: - if (syserror(tcp)) - return 0; - tcp->auxstr = xlookup(lockfcmds, tcp->u_rval); - return RVAL_HEX|RVAL_STR; -#endif - default: - tprintf(", %#lx", tcp->u_arg[2]); - break; - } - } - return 0; + return RVAL_DECODED; } -#ifdef LOCK_SH - -int -sys_flock(struct tcb *tcp) +SYS_FUNC(dup) { - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - printflags(flockcmds, tcp->u_arg[1], "LOCK_???"); - } - return 0; -} -#endif /* LOCK_SH */ + printfd(tcp, tcp->u_arg[0]); -int -sys_close(struct tcb *tcp) -{ - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - } - return 0; + return RVAL_DECODED | RVAL_FD; } static int do_dup2(struct tcb *tcp, int flags_arg) { - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); + printfd(tcp, tcp->u_arg[0]); + tprints(", "); + printfd(tcp, tcp->u_arg[1]); + if (flags_arg >= 0) { tprints(", "); - printfd(tcp, tcp->u_arg[1]); - if (flags_arg >= 0) { - tprints(", "); - printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???"); - } + printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???"); } - return 0; + + return RVAL_DECODED | RVAL_FD; } -int -sys_dup2(struct tcb *tcp) +SYS_FUNC(dup2) { return do_dup2(tcp, -1); } -int -sys_dup3(struct tcb *tcp) +SYS_FUNC(dup3) { return do_dup2(tcp, 2); } -#if defined(ALPHA) -int -sys_getdtablesize(struct tcb *tcp) -{ - return 0; -} -#endif - static int -decode_select(struct tcb *tcp, long *args, enum bitness_t bitness) +decode_select(struct tcb *const tcp, const kernel_ulong_t *const args, + void (*const print_tv_ts) (struct tcb *, kernel_ulong_t), + const char * (*const sprint_tv_ts) (struct tcb *, kernel_ulong_t)) { int i, j; int nfds, fdsize; - fd_set *fds; + fd_set *fds = NULL; const char *sep; - long arg; + kernel_ulong_t addr; - /* Kernel truncates arg[0] to int, we do the same. */ + /* Kernel truncates args[0] to int, we do the same. */ nfds = (int) args[0]; /* Kernel rejects negative nfds, so we don't parse it either. */ - if (nfds < 0) { + if (nfds < 0) nfds = 0; - fds = NULL; - } + /* Beware of select(2^31-1, NULL, NULL, NULL) and similar... */ if (nfds > 1024*1024) nfds = 1024*1024; @@ -499,26 +99,18 @@ decode_select(struct tcb *tcp, long *args, enum bitness_t bitness) if (entering(tcp)) { tprintf("%d", (int) args[0]); - if (fdsize > 0) { + if (verbose(tcp) && fdsize > 0) fds = malloc(fdsize); - if (!fds) - die_out_of_memory(); - } for (i = 0; i < 3; i++) { - arg = args[i+1]; - if (arg == 0) { - tprints(", NULL"); - continue; - } - if (!verbose(tcp) || !fds) { - tprintf(", %#lx", arg); + addr = args[i+1]; + tprints(", "); + if (!fds) { + printaddr(addr); continue; } - if (umoven(tcp, arg, fdsize, (char *) fds) < 0) { - tprints(", [?]"); + if (umoven_or_printaddr(tcp, addr, fdsize, fds)) continue; - } - tprints(", ["); + tprints("["); for (j = 0, sep = "";; j++) { j = next_set_bit(fds, j, nfds); if (j < 0) @@ -531,9 +123,8 @@ decode_select(struct tcb *tcp, long *args, enum bitness_t bitness) } free(fds); tprints(", "); - printtv_bitness(tcp, args[4], bitness, 0); - } - else { + print_tv_ts(tcp, args[4]); + } else { static char outstr[1024]; char *outptr; #define end_outstr (outstr + sizeof(outstr)) @@ -549,16 +140,14 @@ decode_select(struct tcb *tcp, long *args, enum bitness_t bitness) } fds = malloc(fdsize); - if (!fds) - die_out_of_memory(); outptr = outstr; sep = ""; for (i = 0; i < 3 && ready_fds > 0; i++) { int first = 1; - arg = args[i+1]; - if (!arg || umoven(tcp, arg, fdsize, (char *) fds) < 0) + addr = args[i+1]; + if (!addr || !fds || umoven(tcp, addr, fdsize, fds) < 0) continue; for (j = 0;; j++) { j = next_set_bit(fds, j, nfds); @@ -588,9 +177,9 @@ decode_select(struct tcb *tcp, long *args, enum bitness_t bitness) free(fds); /* This contains no useful information on SunOS. */ if (args[4]) { - if (outptr < end_outstr - (10 + TIMEVAL_TEXT_BUFSIZE)) { - outptr += sprintf(outptr, "%sleft ", sep); - outptr = sprinttv(outptr, tcp, args[4], bitness, /*special:*/ 0); + const char *str = sprint_tv_ts(tcp, args[4]); + if (outptr + sizeof("left ") + strlen(sep) + strlen(str) < end_outstr) { + outptr += sprintf(outptr, "%sleft %s", sep, str); } } *outptr = '\0'; @@ -601,283 +190,77 @@ decode_select(struct tcb *tcp, long *args, enum bitness_t bitness) return 0; } -int -sys_oldselect(struct tcb *tcp) -{ - long args[5]; - - if (umoven(tcp, tcp->u_arg[0], sizeof args, (char *) args) < 0) { - tprints("[...]"); - return 0; - } - return decode_select(tcp, args, BITNESS_CURRENT); -} - -#ifdef ALPHA -int -sys_osf_select(struct tcb *tcp) -{ - long *args = tcp->u_arg; - return decode_select(tcp, args, BITNESS_32); -} -#endif - -static const struct xlat epollctls[] = { -#ifdef EPOLL_CTL_ADD - XLAT(EPOLL_CTL_ADD), -#endif -#ifdef EPOLL_CTL_MOD - XLAT(EPOLL_CTL_MOD), -#endif -#ifdef EPOLL_CTL_DEL - XLAT(EPOLL_CTL_DEL), -#endif - XLAT_END -}; - -static const struct xlat epollevents[] = { -#ifdef EPOLLIN - XLAT(EPOLLIN), -#endif -#ifdef EPOLLPRI - XLAT(EPOLLPRI), -#endif -#ifdef EPOLLOUT - XLAT(EPOLLOUT), -#endif -#ifdef EPOLLRDNORM - XLAT(EPOLLRDNORM), -#endif -#ifdef EPOLLRDBAND - XLAT(EPOLLRDBAND), -#endif -#ifdef EPOLLWRNORM - XLAT(EPOLLWRNORM), -#endif -#ifdef EPOLLWRBAND - XLAT(EPOLLWRBAND), -#endif -#ifdef EPOLLMSG - XLAT(EPOLLMSG), -#endif -#ifdef EPOLLERR - XLAT(EPOLLERR), -#endif -#ifdef EPOLLHUP - XLAT(EPOLLHUP), -#endif -#ifdef EPOLLRDHUP - XLAT(EPOLLRDHUP), -#endif -#ifdef EPOLLONESHOT - XLAT(EPOLLONESHOT), -#endif -#ifdef EPOLLET - XLAT(EPOLLET), -#endif - XLAT_END -}; - -/* Not aliased to printargs_ld: we want it to have a distinct address */ -int -sys_epoll_create(struct tcb *tcp) -{ - return printargs_ld(tcp); -} - -static const struct xlat epollflags[] = { -#ifdef EPOLL_CLOEXEC - XLAT(EPOLL_CLOEXEC), -#endif -#ifdef EPOLL_NONBLOCK - XLAT(EPOLL_NONBLOCK), -#endif - XLAT_END -}; - -int -sys_epoll_create1(struct tcb *tcp) -{ - if (entering(tcp)) - printflags(epollflags, tcp->u_arg[0], "EPOLL_???"); - return 0; -} - -#ifdef HAVE_SYS_EPOLL_H -static void -print_epoll_event(struct epoll_event *ev) +SYS_FUNC(oldselect) { - tprints("{"); - printflags(epollevents, ev->events, "EPOLL???"); - /* We cannot know what format the program uses, so print u32 and u64 - which will cover every value. */ - tprintf(", {u32=%" PRIu32 ", u64=%" PRIu64 "}}", - ev->data.u32, ev->data.u64); -} -#endif + kernel_ulong_t select_args[5]; + unsigned int oldselect_args[5]; -int -sys_epoll_ctl(struct tcb *tcp) -{ - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); - printxval(epollctls, tcp->u_arg[1], "EPOLL_CTL_???"); - tprints(", "); - printfd(tcp, tcp->u_arg[2]); - tprints(", "); - if (tcp->u_arg[3] == 0) - tprints("NULL"); - else { -#ifdef HAVE_SYS_EPOLL_H - struct epoll_event ev; - if (umove(tcp, tcp->u_arg[3], &ev) == 0) - print_epoll_event(&ev); - else -#endif - tprints("{...}"); + if (sizeof(*select_args) == sizeof(*oldselect_args)) { + if (umove_or_printaddr(tcp, tcp->u_arg[0], &select_args)) { + return 0; } - } - return 0; -} - -static void -epoll_wait_common(struct tcb *tcp) -{ - if (entering(tcp)) { - printfd(tcp, tcp->u_arg[0]); - tprints(", "); } else { - if (syserror(tcp)) - tprintf("%lx", tcp->u_arg[1]); - else if (tcp->u_rval == 0) - tprints("{}"); - else { -#ifdef HAVE_SYS_EPOLL_H - struct epoll_event ev, *start, *cur, *end; - int failed = 0; + unsigned int i; - tprints("{"); - start = (struct epoll_event *) tcp->u_arg[1]; - end = start + tcp->u_rval; - for (cur = start; cur < end; ++cur) { - if (cur > start) - tprints(", "); - if (umove(tcp, (long) cur, &ev) == 0) - print_epoll_event(&ev); - else { - tprints("?"); - failed = 1; - break; - } - } - tprints("}"); - if (failed) - tprintf(" %#lx", (long) start); -#else - tprints("{...}"); -#endif + if (umove_or_printaddr(tcp, tcp->u_arg[0], &oldselect_args)) { + return 0; + } + + for (i = 0; i < 5; ++i) { + select_args[i] = oldselect_args[i]; } - tprintf(", %d, %d", (int) tcp->u_arg[2], (int) tcp->u_arg[3]); } -} -int -sys_epoll_wait(struct tcb *tcp) -{ - epoll_wait_common(tcp); - return 0; + return decode_select(tcp, select_args, print_timeval, sprint_timeval); } -int -sys_epoll_pwait(struct tcb *tcp) +#ifdef ALPHA +SYS_FUNC(osf_select) { - epoll_wait_common(tcp); - if (exiting(tcp)) { - tprints(", "); - /* NB: kernel requires arg[5] == NSIG / 8 */ - print_sigset_addr_len(tcp, tcp->u_arg[4], tcp->u_arg[5]); - tprintf(", %lu", tcp->u_arg[5]); - } - return 0; + return decode_select(tcp, tcp->u_arg, print_timeval32, sprint_timeval32); } +#endif -int -sys_select(struct tcb *tcp) +SYS_FUNC(select) { - return decode_select(tcp, tcp->u_arg, BITNESS_CURRENT); + return decode_select(tcp, tcp->u_arg, print_timeval, sprint_timeval); } -int -sys_pselect6(struct tcb *tcp) +static int +umove_kulong_array_or_printaddr(struct tcb *const tcp, const kernel_ulong_t addr, + kernel_ulong_t *const ptr, const size_t n) { - int rc = decode_select(tcp, tcp->u_arg, BITNESS_CURRENT); - if (entering(tcp)) { - long r; - struct { - unsigned long ptr; - unsigned long len; - } data; -#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4 - if (current_wordsize == 4) { - struct { - uint32_t ptr; - uint32_t len; - } data32; - r = umove(tcp, tcp->u_arg[5], &data32); - data.ptr = data32.ptr; - data.len = data32.len; - } else -#endif - r = umove(tcp, tcp->u_arg[5], &data); - if (r < 0) - tprintf(", %#lx", tcp->u_arg[5]); - else { - tprints(", {"); - /* NB: kernel requires data.len == NSIG / 8 */ - print_sigset_addr_len(tcp, data.ptr, data.len); - tprintf(", %lu}", data.len); +#ifndef current_klongsize + if (current_klongsize < sizeof(*ptr)) { + uint32_t ptr32[n]; + int r = umove_or_printaddr(tcp, addr, &ptr32); + if (!r) { + size_t i; + + for (i = 0; i < n; ++i) + ptr[i] = ptr32[i]; } + return r; } - return rc; +#endif /* !current_klongsize */ + return umoven_or_printaddr(tcp, addr, n * sizeof(*ptr), ptr); } -static int -do_eventfd(struct tcb *tcp, int flags_arg) +SYS_FUNC(pselect6) { + int rc = decode_select(tcp, tcp->u_arg, print_timespec, sprint_timespec); if (entering(tcp)) { - tprintf("%lu", tcp->u_arg[0]); - if (flags_arg >= 0) { - tprints(", "); - printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???"); + kernel_ulong_t data[2]; + + tprints(", "); + if (!umove_kulong_array_or_printaddr(tcp, tcp->u_arg[5], + data, ARRAY_SIZE(data))) { + tprints("{"); + /* NB: kernel requires data[1] == NSIG_BYTES */ + print_sigset_addr_len(tcp, data[0], data[1]); + tprintf(", %" PRI_klu "}", data[1]); } } - return 0; -} -int -sys_eventfd(struct tcb *tcp) -{ - return do_eventfd(tcp, -1); -} - -int -sys_eventfd2(struct tcb *tcp) -{ - return do_eventfd(tcp, 1); -} - -int -sys_perf_event_open(struct tcb *tcp) -{ - if (entering(tcp)) { - tprintf("%#lx, %d, %d, %d, ", - tcp->u_arg[0], - (int) tcp->u_arg[1], - (int) tcp->u_arg[2], - (int) tcp->u_arg[3]); - printflags(perf_event_open_flags, tcp->u_arg[4], - "PERF_FLAG_???"); - } - return 0; + return rc; }