diff options
Diffstat (limited to 'kcmp.c')
-rw-r--r-- | kcmp.c | 48 |
1 files changed, 47 insertions, 1 deletions
@@ -27,8 +27,31 @@ */ #include "defs.h" +#include "print_fields.h" #include "xlat/kcmp_types.h" +struct strace_kcmp_epoll_slot { + uint32_t efd; + uint32_t tfd; + uint32_t toff; +}; + +static void +printpidfd(struct tcb *tcp, pid_t pid, int fd) +{ + /* + * XXX We want to use printfd here, but we should figure out which + * process in strace's PID NS is referred to first. + */ + tprintf("%d", fd); +} + +#define PRINT_FIELD_PIDFD(prefix_, where_, field_, tcp_, pid_) \ + do { \ + STRACE_PRINTF("%s%s=", (prefix_), #field_); \ + printpidfd((tcp_), (pid_), (where_).field_); \ + } while (0) + SYS_FUNC(kcmp) { pid_t pid1 = tcp->u_arg[0]; @@ -42,8 +65,31 @@ SYS_FUNC(kcmp) switch (type) { case KCMP_FILE: - tprintf(", %u, %u", (unsigned) idx1, (unsigned) idx2); + tprints(", "); + printpidfd(tcp, pid1, idx1); + tprints(", "); + printpidfd(tcp, pid1, idx2); + break; + + case KCMP_EPOLL_TFD: { + struct strace_kcmp_epoll_slot slot; + + tprints(", "); + printpidfd(tcp, pid1, idx1); + tprints(", "); + + if (umove_or_printaddr(tcp, idx2, &slot)) + break; + + PRINT_FIELD_PIDFD("{", slot, efd, tcp, pid2); + PRINT_FIELD_PIDFD(", ", slot, tfd, tcp, pid2); + PRINT_FIELD_U(", ", slot, toff); + tprints("}"); + + break; + } + case KCMP_FILES: case KCMP_FS: case KCMP_IO: |