Merge tag 'armsoc-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm...
[firefly-linux-kernel-4.4.55.git] / tools / perf / builtin-trace.c
index de5d277d1ad7cb97cac2c5da67032fc8a12ffdf6..39ad4d0ca88427cb222fa3ce7c0a35c7b77ed243 100644 (file)
@@ -1617,6 +1617,34 @@ static int trace__read_syscall_info(struct trace *trace, int id)
        return syscall__set_arg_fmts(sc);
 }
 
+static int trace__validate_ev_qualifier(struct trace *trace)
+{
+       int err = 0;
+       struct str_node *pos;
+
+       strlist__for_each(pos, trace->ev_qualifier) {
+               const char *sc = pos->s;
+
+               if (audit_name_to_syscall(sc, trace->audit.machine) < 0) {
+                       if (err == 0) {
+                               fputs("Error:\tInvalid syscall ", trace->output);
+                               err = -EINVAL;
+                       } else {
+                               fputs(", ", trace->output);
+                       }
+
+                       fputs(sc, trace->output);
+               }
+       }
+
+       if (err < 0) {
+               fputs("\nHint:\ttry 'perf list syscalls:sys_enter_*'"
+                     "\nHint:\tand: 'man syscalls'\n", trace->output);
+       }
+
+       return err;
+}
+
 /*
  * args is to be interpreted as a series of longs but we need to handle
  * 8-byte unaligned accesses. args points to raw_data within the event
@@ -2325,7 +2353,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
         */
        if (trace->filter_pids.nr > 0)
                err = perf_evlist__set_filter_pids(evlist, trace->filter_pids.nr, trace->filter_pids.entries);
-       else if (evlist->threads->map[0] == -1)
+       else if (thread_map__pid(evlist->threads, 0) == -1)
                err = perf_evlist__set_filter_pid(evlist, getpid());
 
        if (err < 0) {
@@ -2343,7 +2371,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
        if (forks)
                perf_evlist__start_workload(evlist);
 
-       trace->multiple_threads = evlist->threads->map[0] == -1 ||
+       trace->multiple_threads = thread_map__pid(evlist->threads, 0) == -1 ||
                                  evlist->threads->nr > 1 ||
                                  perf_evlist__first(evlist)->attr.inherit;
 again:
@@ -2862,6 +2890,10 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
                        err = -ENOMEM;
                        goto out_close;
                }
+
+               err = trace__validate_ev_qualifier(&trace);
+               if (err)
+                       goto out_close;
        }
 
        err = target__validate(&trace.opts.target);