Merge branch 'linux-4.7' of git://github.com/skeggsb/linux into drm-fixes
[cascardo/linux.git] / tools / perf / builtin-trace.c
index 6e5c325..5c50fe7 100644 (file)
@@ -576,84 +576,54 @@ static struct syscall_fmt {
        bool       hexret;
 } syscall_fmts[] = {
        { .name     = "access",     .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* filename */
-                            [1] = SCA_ACCMODE,  /* mode */ }, },
+         .arg_scnprintf = { [1] = SCA_ACCMODE,  /* mode */ }, },
        { .name     = "arch_prctl", .errmsg = true, .alias = "prctl", },
        { .name     = "bpf",        .errmsg = true, STRARRAY(0, cmd, bpf_cmd), },
        { .name     = "brk",        .hexret = true,
          .arg_scnprintf = { [0] = SCA_HEX, /* brk */ }, },
-       { .name     = "chdir",      .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* filename */ }, },
-       { .name     = "chmod",      .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* filename */ }, },
-       { .name     = "chroot",     .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* filename */ }, },
+       { .name     = "chdir",      .errmsg = true, },
+       { .name     = "chmod",      .errmsg = true, },
+       { .name     = "chroot",     .errmsg = true, },
        { .name     = "clock_gettime",  .errmsg = true, STRARRAY(0, clk_id, clockid), },
        { .name     = "clone",      .errpid = true, },
        { .name     = "close",      .errmsg = true,
          .arg_scnprintf = { [0] = SCA_CLOSE_FD, /* fd */ }, },
        { .name     = "connect",    .errmsg = true, },
-       { .name     = "creat",      .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
-       { .name     = "dup",        .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "dup2",       .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "dup3",       .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
+       { .name     = "creat",      .errmsg = true, },
+       { .name     = "dup",        .errmsg = true, },
+       { .name     = "dup2",       .errmsg = true, },
+       { .name     = "dup3",       .errmsg = true, },
        { .name     = "epoll_ctl",  .errmsg = true, STRARRAY(1, op, epoll_ctl_ops), },
        { .name     = "eventfd2",   .errmsg = true,
          .arg_scnprintf = { [1] = SCA_EFD_FLAGS, /* flags */ }, },
-       { .name     = "faccessat",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */
-                            [1] = SCA_FILENAME, /* filename */ }, },
-       { .name     = "fadvise64",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "fallocate",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "fchdir",     .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "fchmod",     .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
+       { .name     = "faccessat",  .errmsg = true, },
+       { .name     = "fadvise64",  .errmsg = true, },
+       { .name     = "fallocate",  .errmsg = true, },
+       { .name     = "fchdir",     .errmsg = true, },
+       { .name     = "fchmod",     .errmsg = true, },
        { .name     = "fchmodat",   .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FDAT, /* fd */
-                            [1] = SCA_FILENAME, /* filename */ }, },
-       { .name     = "fchown",     .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
+         .arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
+       { .name     = "fchown",     .errmsg = true, },
        { .name     = "fchownat",   .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FDAT, /* fd */
-                            [1] = SCA_FILENAME, /* filename */ }, },
+         .arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
        { .name     = "fcntl",      .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */
-                            [1] = SCA_STRARRAY, /* cmd */ },
+         .arg_scnprintf = { [1] = SCA_STRARRAY, /* cmd */ },
          .arg_parm      = { [1] = &strarray__fcntl_cmds, /* cmd */ }, },
-       { .name     = "fdatasync",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
+       { .name     = "fdatasync",  .errmsg = true, },
        { .name     = "flock",      .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */
-                            [1] = SCA_FLOCK, /* cmd */ }, },
-       { .name     = "fsetxattr",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "fstat",      .errmsg = true, .alias = "newfstat",
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "fstatat",    .errmsg = true, .alias = "newfstatat",
-         .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */
-                            [1] = SCA_FILENAME, /* filename */ }, },
-       { .name     = "fstatfs",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "fsync",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "ftruncate", .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
+         .arg_scnprintf = { [1] = SCA_FLOCK, /* cmd */ }, },
+       { .name     = "fsetxattr",  .errmsg = true, },
+       { .name     = "fstat",      .errmsg = true, .alias = "newfstat", },
+       { .name     = "fstatat",    .errmsg = true, .alias = "newfstatat", },
+       { .name     = "fstatfs",    .errmsg = true, },
+       { .name     = "fsync",    .errmsg = true, },
+       { .name     = "ftruncate", .errmsg = true, },
        { .name     = "futex",      .errmsg = true,
          .arg_scnprintf = { [1] = SCA_FUTEX_OP, /* op */ }, },
        { .name     = "futimesat", .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FDAT, /* fd */
-                            [1] = SCA_FILENAME, /* filename */ }, },
-       { .name     = "getdents",   .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "getdents64", .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
+         .arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
+       { .name     = "getdents",   .errmsg = true, },
+       { .name     = "getdents64", .errmsg = true, },
        { .name     = "getitimer",  .errmsg = true, STRARRAY(0, which, itimers), },
        { .name     = "getpid",     .errpid = true, },
        { .name     = "getpgid",    .errpid = true, },
@@ -661,12 +631,10 @@ static struct syscall_fmt {
        { .name     = "getrandom",  .errmsg = true,
          .arg_scnprintf = { [2] = SCA_GETRANDOM_FLAGS, /* flags */ }, },
        { .name     = "getrlimit",  .errmsg = true, STRARRAY(0, resource, rlimit_resources), },
-       { .name     = "getxattr",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
-       { .name     = "inotify_add_watch",          .errmsg = true,
-         .arg_scnprintf = { [1] = SCA_FILENAME, /* pathname */ }, },
+       { .name     = "getxattr",   .errmsg = true, },
+       { .name     = "inotify_add_watch",          .errmsg = true, },
        { .name     = "ioctl",      .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */
+         .arg_scnprintf = {
 #if defined(__i386__) || defined(__x86_64__)
 /*
  * FIXME: Make this available to all arches.
@@ -680,41 +648,28 @@ static struct syscall_fmt {
        { .name     = "keyctl",     .errmsg = true, STRARRAY(0, option, keyctl_options), },
        { .name     = "kill",       .errmsg = true,
          .arg_scnprintf = { [1] = SCA_SIGNUM, /* sig */ }, },
-       { .name     = "lchown",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* filename */ }, },
-       { .name     = "lgetxattr",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
+       { .name     = "lchown",    .errmsg = true, },
+       { .name     = "lgetxattr",  .errmsg = true, },
        { .name     = "linkat",     .errmsg = true,
          .arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
-       { .name     = "listxattr",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
-       { .name     = "llistxattr", .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
-       { .name     = "lremovexattr",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
+       { .name     = "listxattr",  .errmsg = true, },
+       { .name     = "llistxattr", .errmsg = true, },
+       { .name     = "lremovexattr",  .errmsg = true, },
        { .name     = "lseek",      .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */
-                            [2] = SCA_STRARRAY, /* whence */ },
+         .arg_scnprintf = { [2] = SCA_STRARRAY, /* whence */ },
          .arg_parm      = { [2] = &strarray__whences, /* whence */ }, },
-       { .name     = "lsetxattr",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
-       { .name     = "lstat",      .errmsg = true, .alias = "newlstat",
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* filename */ }, },
-       { .name     = "lsxattr",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
+       { .name     = "lsetxattr",  .errmsg = true, },
+       { .name     = "lstat",      .errmsg = true, .alias = "newlstat", },
+       { .name     = "lsxattr",    .errmsg = true, },
        { .name     = "madvise",    .errmsg = true,
          .arg_scnprintf = { [0] = SCA_HEX,      /* start */
                             [2] = SCA_MADV_BHV, /* behavior */ }, },
-       { .name     = "mkdir",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
+       { .name     = "mkdir",    .errmsg = true, },
        { .name     = "mkdirat",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FDAT, /* fd */
-                            [1] = SCA_FILENAME, /* pathname */ }, },
-       { .name     = "mknod",      .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* filename */ }, },
+         .arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
+       { .name     = "mknod",      .errmsg = true, },
        { .name     = "mknodat",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FDAT, /* fd */
-                            [1] = SCA_FILENAME, /* filename */ }, },
+         .arg_scnprintf = { [0] = SCA_FDAT, /* fd */ }, },
        { .name     = "mlock",      .errmsg = true,
          .arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, },
        { .name     = "mlockall",   .errmsg = true,
@@ -722,8 +677,7 @@ static struct syscall_fmt {
        { .name     = "mmap",       .hexret = true,
          .arg_scnprintf = { [0] = SCA_HEX,       /* addr */
                             [2] = SCA_MMAP_PROT, /* prot */
-                            [3] = SCA_MMAP_FLAGS, /* flags */
-                            [4] = SCA_FD,        /* fd */ }, },
+                            [3] = SCA_MMAP_FLAGS, /* flags */ }, },
        { .name     = "mprotect",   .errmsg = true,
          .arg_scnprintf = { [0] = SCA_HEX, /* start */
                             [2] = SCA_MMAP_PROT, /* prot */ }, },
@@ -740,17 +694,14 @@ static struct syscall_fmt {
        { .name     = "name_to_handle_at", .errmsg = true,
          .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
        { .name     = "newfstatat", .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */
-                            [1] = SCA_FILENAME, /* filename */ }, },
+         .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
        { .name     = "open",       .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME,   /* filename */
-                            [1] = SCA_OPEN_FLAGS, /* flags */ }, },
+         .arg_scnprintf = { [1] = SCA_OPEN_FLAGS, /* flags */ }, },
        { .name     = "open_by_handle_at", .errmsg = true,
          .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */
                             [2] = SCA_OPEN_FLAGS, /* flags */ }, },
        { .name     = "openat",     .errmsg = true,
          .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */
-                            [1] = SCA_FILENAME, /* filename */
                             [2] = SCA_OPEN_FLAGS, /* flags */ }, },
        { .name     = "perf_event_open", .errmsg = true,
          .arg_scnprintf = { [2] = SCA_INT, /* cpu */
@@ -760,39 +711,26 @@ static struct syscall_fmt {
          .arg_scnprintf = { [1] = SCA_PIPE_FLAGS, /* flags */ }, },
        { .name     = "poll",       .errmsg = true, .timeout = true, },
        { .name     = "ppoll",      .errmsg = true, .timeout = true, },
-       { .name     = "pread",      .errmsg = true, .alias = "pread64",
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "preadv",     .errmsg = true, .alias = "pread",
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
+       { .name     = "pread",      .errmsg = true, .alias = "pread64", },
+       { .name     = "preadv",     .errmsg = true, .alias = "pread", },
        { .name     = "prlimit64",  .errmsg = true, STRARRAY(1, resource, rlimit_resources), },
-       { .name     = "pwrite",     .errmsg = true, .alias = "pwrite64",
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "pwritev",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "read",       .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "readlink",   .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* path */ }, },
+       { .name     = "pwrite",     .errmsg = true, .alias = "pwrite64", },
+       { .name     = "pwritev",    .errmsg = true, },
+       { .name     = "read",       .errmsg = true, },
+       { .name     = "readlink",   .errmsg = true, },
        { .name     = "readlinkat", .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */
-                            [1] = SCA_FILENAME, /* pathname */ }, },
-       { .name     = "readv",      .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
+         .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
+       { .name     = "readv",      .errmsg = true, },
        { .name     = "recvfrom",   .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */
-                            [3] = SCA_MSG_FLAGS, /* flags */ }, },
+         .arg_scnprintf = { [3] = SCA_MSG_FLAGS, /* flags */ }, },
        { .name     = "recvmmsg",   .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */
-                            [3] = SCA_MSG_FLAGS, /* flags */ }, },
+         .arg_scnprintf = { [3] = SCA_MSG_FLAGS, /* flags */ }, },
        { .name     = "recvmsg",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */
-                            [2] = SCA_MSG_FLAGS, /* flags */ }, },
-       { .name     = "removexattr", .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
+         .arg_scnprintf = { [2] = SCA_MSG_FLAGS, /* flags */ }, },
+       { .name     = "removexattr", .errmsg = true, },
        { .name     = "renameat",   .errmsg = true,
          .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
-       { .name     = "rmdir",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
+       { .name     = "rmdir",    .errmsg = true, },
        { .name     = "rt_sigaction", .errmsg = true,
          .arg_scnprintf = { [0] = SCA_SIGNUM, /* sig */ }, },
        { .name     = "rt_sigprocmask",  .errmsg = true, STRARRAY(0, how, sighow), },
@@ -807,22 +745,17 @@ static struct syscall_fmt {
                             [1] = SCA_SECCOMP_FLAGS, /* flags */ }, },
        { .name     = "select",     .errmsg = true, .timeout = true, },
        { .name     = "sendmmsg",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */
-                            [3] = SCA_MSG_FLAGS, /* flags */ }, },
+         .arg_scnprintf = { [3] = SCA_MSG_FLAGS, /* flags */ }, },
        { .name     = "sendmsg",    .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */
-                            [2] = SCA_MSG_FLAGS, /* flags */ }, },
+         .arg_scnprintf = { [2] = SCA_MSG_FLAGS, /* flags */ }, },
        { .name     = "sendto",     .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */
-                            [3] = SCA_MSG_FLAGS, /* flags */ }, },
+         .arg_scnprintf = { [3] = SCA_MSG_FLAGS, /* flags */ }, },
        { .name     = "set_tid_address", .errpid = true, },
        { .name     = "setitimer",  .errmsg = true, STRARRAY(0, which, itimers), },
        { .name     = "setpgid",    .errmsg = true, },
        { .name     = "setrlimit",  .errmsg = true, STRARRAY(0, resource, rlimit_resources), },
-       { .name     = "setxattr",   .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
-       { .name     = "shutdown",   .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
+       { .name     = "setxattr",   .errmsg = true, },
+       { .name     = "shutdown",   .errmsg = true, },
        { .name     = "socket",     .errmsg = true,
          .arg_scnprintf = { [0] = SCA_STRARRAY, /* family */
                             [1] = SCA_SK_TYPE, /* type */ },
@@ -831,10 +764,8 @@ static struct syscall_fmt {
          .arg_scnprintf = { [0] = SCA_STRARRAY, /* family */
                             [1] = SCA_SK_TYPE, /* type */ },
          .arg_parm      = { [0] = &strarray__socket_families, /* family */ }, },
-       { .name     = "stat",       .errmsg = true, .alias = "newstat",
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
-       { .name     = "statfs",     .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* pathname */ }, },
+       { .name     = "stat",       .errmsg = true, .alias = "newstat", },
+       { .name     = "statfs",     .errmsg = true, },
        { .name     = "swapoff",    .errmsg = true,
          .arg_scnprintf = { [0] = SCA_FILENAME, /* specialfile */ }, },
        { .name     = "swapon",     .errmsg = true,
@@ -845,29 +776,21 @@ static struct syscall_fmt {
          .arg_scnprintf = { [2] = SCA_SIGNUM, /* sig */ }, },
        { .name     = "tkill",      .errmsg = true,
          .arg_scnprintf = { [1] = SCA_SIGNUM, /* sig */ }, },
-       { .name     = "truncate",   .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* path */ }, },
+       { .name     = "truncate",   .errmsg = true, },
        { .name     = "uname",      .errmsg = true, .alias = "newuname", },
        { .name     = "unlinkat",   .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */
-                            [1] = SCA_FILENAME, /* pathname */ }, },
-       { .name     = "utime",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* filename */ }, },
+         .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */ }, },
+       { .name     = "utime",  .errmsg = true, },
        { .name     = "utimensat",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FDAT, /* dirfd */
-                            [1] = SCA_FILENAME, /* filename */ }, },
-       { .name     = "utimes",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FILENAME, /* filename */ }, },
-       { .name     = "vmsplice",  .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
+         .arg_scnprintf = { [0] = SCA_FDAT, /* dirfd */ }, },
+       { .name     = "utimes",  .errmsg = true, },
+       { .name     = "vmsplice",  .errmsg = true, },
        { .name     = "wait4",      .errpid = true,
          .arg_scnprintf = { [2] = SCA_WAITID_OPTIONS, /* options */ }, },
        { .name     = "waitid",     .errpid = true,
          .arg_scnprintf = { [3] = SCA_WAITID_OPTIONS, /* options */ }, },
-       { .name     = "write",      .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
-       { .name     = "writev",     .errmsg = true,
-         .arg_scnprintf = { [0] = SCA_FD, /* fd */ }, },
+       { .name     = "write",      .errmsg = true, },
+       { .name     = "writev",     .errmsg = true, },
 };
 
 static int syscall_fmt__cmp(const void *name, const void *fmtp)
@@ -1160,6 +1083,24 @@ static int trace__tool_process(struct perf_tool *tool,
        return trace__process_event(trace, machine, event, sample);
 }
 
+static char *trace__machine__resolve_kernel_addr(void *vmachine, unsigned long long *addrp, char **modp)
+{
+       struct machine *machine = vmachine;
+
+       if (machine->kptr_restrict_warned)
+               return NULL;
+
+       if (symbol_conf.kptr_restrict) {
+               pr_warning("Kernel address maps (/proc/{kallsyms,modules}) are restricted.\n\n"
+                          "Check /proc/sys/kernel/kptr_restrict.\n\n"
+                          "Kernel samples will not be resolved.\n");
+               machine->kptr_restrict_warned = true;
+               return NULL;
+       }
+
+       return machine__resolve_kernel_addr(vmachine, addrp, modp);
+}
+
 static int trace__symbols_init(struct trace *trace, struct perf_evlist *evlist)
 {
        int err = symbol__init(NULL);
@@ -1171,7 +1112,7 @@ static int trace__symbols_init(struct trace *trace, struct perf_evlist *evlist)
        if (trace->host == NULL)
                return -ENOMEM;
 
-       if (trace_event__register_resolver(trace->host, machine__resolve_kernel_addr) < 0)
+       if (trace_event__register_resolver(trace->host, trace__machine__resolve_kernel_addr) < 0)
                return -errno;
 
        err = __machine__synthesize_threads(trace->host, &trace->tool, &trace->opts.target,
@@ -1186,7 +1127,7 @@ static int trace__symbols_init(struct trace *trace, struct perf_evlist *evlist)
 static int syscall__set_arg_fmts(struct syscall *sc)
 {
        struct format_field *field;
-       int idx = 0;
+       int idx = 0, len;
 
        sc->arg_scnprintf = calloc(sc->nr_args, sizeof(void *));
        if (sc->arg_scnprintf == NULL)
@@ -1198,12 +1139,31 @@ static int syscall__set_arg_fmts(struct syscall *sc)
        for (field = sc->args; field; field = field->next) {
                if (sc->fmt && sc->fmt->arg_scnprintf[idx])
                        sc->arg_scnprintf[idx] = sc->fmt->arg_scnprintf[idx];
+               else if (strcmp(field->type, "const char *") == 0 &&
+                        (strcmp(field->name, "filename") == 0 ||
+                         strcmp(field->name, "path") == 0 ||
+                         strcmp(field->name, "pathname") == 0))
+                       sc->arg_scnprintf[idx] = SCA_FILENAME;
                else if (field->flags & FIELD_IS_POINTER)
                        sc->arg_scnprintf[idx] = syscall_arg__scnprintf_hex;
                else if (strcmp(field->type, "pid_t") == 0)
                        sc->arg_scnprintf[idx] = SCA_PID;
                else if (strcmp(field->type, "umode_t") == 0)
                        sc->arg_scnprintf[idx] = SCA_MODE_T;
+               else if ((strcmp(field->type, "int") == 0 ||
+                         strcmp(field->type, "unsigned int") == 0 ||
+                         strcmp(field->type, "long") == 0) &&
+                        (len = strlen(field->name)) >= 2 &&
+                        strcmp(field->name + len - 2, "fd") == 0) {
+                       /*
+                        * /sys/kernel/tracing/events/syscalls/sys_enter*
+                        * egrep 'field:.*fd;' .../format|sed -r 's/.*field:([a-z ]+) [a-z_]*fd.+/\1/g'|sort|uniq -c
+                        * 65 int
+                        * 23 unsigned int
+                        * 7 unsigned long
+                        */
+                       sc->arg_scnprintf[idx] = SCA_FD;
+               }
                ++idx;
        }
 
@@ -1534,7 +1494,7 @@ static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
        if (sc->is_exit) {
                if (!(trace->duration_filter || trace->summary_only || trace->min_stack)) {
                        trace__fprintf_entry_head(trace, thread, 1, sample->time, trace->output);
-                       fprintf(trace->output, "%-70s\n", ttrace->entry_str);
+                       fprintf(trace->output, "%-70s)\n", ttrace->entry_str);
                }
        } else {
                ttrace->entry_pending = true;
@@ -2887,12 +2847,12 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
                mmap_pages_user_set = false;
 
        if (trace.max_stack == UINT_MAX) {
-               trace.max_stack = sysctl_perf_event_max_stack;
+               trace.max_stack = input_name ? PERF_MAX_STACK_DEPTH : sysctl_perf_event_max_stack;
                max_stack_user_set = false;
        }
 
 #ifdef HAVE_DWARF_UNWIND_SUPPORT
-       if ((trace.min_stack || max_stack_user_set) && !callchain_param.enabled)
+       if ((trace.min_stack || max_stack_user_set) && !callchain_param.enabled && trace.trace_syscalls)
                record_opts__parse_callchain(&trace.opts, &callchain_param, "dwarf", false);
 #endif