perf parse-regs: Split parse_regs
authorKan Liang <kan.liang@linux.intel.com>
Tue, 14 May 2019 20:19:32 +0000 (13:19 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 15 May 2019 19:36:49 +0000 (16:36 -0300)
The available registers for --int-regs and --user-regs may be different,
e.g. XMM registers.

Split parse_regs into two dedicated functions for --int-regs and
--user-regs respectively.

Modify the warning message. "--user-regs=?" should be applied to show
the available registers for --user-regs.

Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Tested-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/1557865174-56264-1-git-send-email-kan.liang@linux.intel.com
[ Changed docs as suggested by Ravi and agreed by Kan ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-record.txt
tools/perf/builtin-record.c
tools/perf/util/parse-regs-options.c
tools/perf/util/parse-regs-options.h

index 27b37624c3761990117699ef6da5055b607021e1..de269430720a4111e7c30ae7871d05fa6c01a2b5 100644 (file)
@@ -406,7 +406,8 @@ symbolic names, e.g. on x86, ax, si. To list the available registers use
 --intr-regs=ax,bx. The list of register is architecture dependent.
 
 --user-regs::
-Capture user registers at sample time. Same arguments as -I.
+Similar to -I, but capture user registers at sample time. To list the available
+user registers use --user-regs=\?.
 
 --running-time::
 Record running and enabled time for read events (:S)
index 861395753c25ba207a720714731188d52064e69f..e2c3a585a61eb6acc48f55dd8c6ab2757a1216ff 100644 (file)
@@ -2168,10 +2168,10 @@ static struct option __record_options[] = {
                    "use per-thread mmaps"),
        OPT_CALLBACK_OPTARG('I', "intr-regs", &record.opts.sample_intr_regs, NULL, "any register",
                    "sample selected machine registers on interrupt,"
-                   " use '-I?' to list register names", parse_regs),
+                   " use '-I?' to list register names", parse_intr_regs),
        OPT_CALLBACK_OPTARG(0, "user-regs", &record.opts.sample_user_regs, NULL, "any register",
                    "sample selected machine registers on interrupt,"
-                   " use '-I?' to list register names", parse_regs),
+                   " use '--user-regs=?' to list register names", parse_user_regs),
        OPT_BOOLEAN(0, "running-time", &record.opts.running_time,
                    "Record running/enabled time of read (:S) events"),
        OPT_CALLBACK('k', "clockid", &record.opts,
index 9cb187a20fe22c49ddd556eaab64b31ef3d6c832..b21617f2bec1158d37425459c58a84ceacaf0005 100644 (file)
@@ -5,8 +5,8 @@
 #include <subcmd/parse-options.h>
 #include "util/parse-regs-options.h"
 
-int
-parse_regs(const struct option *opt, const char *str, int unset)
+static int
+__parse_regs(const struct option *opt, const char *str, int unset, bool intr)
 {
        uint64_t *mode = (uint64_t *)opt->value;
        const struct sample_reg *r;
@@ -48,7 +48,8 @@ parse_regs(const struct option *opt, const char *str, int unset)
                                        break;
                        }
                        if (!r->name) {
-                               ui__warning("Unknown register \"%s\", check man page or run \"perf record -I?\"\n", s);
+                               ui__warning("Unknown register \"%s\", check man page or run \"perf record %s?\"\n",
+                                           s, intr ? "-I" : "--user-regs=");
                                goto error;
                        }
 
@@ -69,3 +70,15 @@ error:
        free(os);
        return ret;
 }
+
+int
+parse_user_regs(const struct option *opt, const char *str, int unset)
+{
+       return __parse_regs(opt, str, unset, false);
+}
+
+int
+parse_intr_regs(const struct option *opt, const char *str, int unset)
+{
+       return __parse_regs(opt, str, unset, true);
+}
index cdefb1acf6be18a78b649cf89afc2b5cf7c0a580..2b23d25c6394d5fc3a40ae609f9345e0a3ce0c05 100644 (file)
@@ -2,5 +2,6 @@
 #ifndef _PERF_PARSE_REGS_OPTIONS_H
 #define _PERF_PARSE_REGS_OPTIONS_H 1
 struct option;
-int parse_regs(const struct option *opt, const char *str, int unset);
+int parse_user_regs(const struct option *opt, const char *str, int unset);
+int parse_intr_regs(const struct option *opt, const char *str, int unset);
 #endif /* _PERF_PARSE_REGS_OPTIONS_H */