blob: ee3d84a7c8957d4571cef223495b9a461419383a [file] [log] [blame]
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -04001/*
2 * builtin-probe.c
3 *
4 * Builtin probe command: Set up probe events by C expression
5 *
6 * Written by Masami Hiramatsu <mhiramat@redhat.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 *
22 */
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040023#include <sys/utsname.h>
24#include <sys/types.h>
25#include <sys/stat.h>
26#include <fcntl.h>
27#include <errno.h>
28#include <stdio.h>
29#include <unistd.h>
30#include <stdlib.h>
31#include <string.h>
32
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040033#include "perf.h"
34#include "builtin.h"
35#include "util/util.h"
Masami Hiramatsufa282442009-12-08 17:03:23 -050036#include "util/strlist.h"
Masami Hiramatsubd09d7b2011-01-20 23:15:39 +090037#include "util/strfilter.h"
Masami Hiramatsue0faa8d2010-03-16 18:05:37 -040038#include "util/symbol.h"
Masami Hiramatsu89c69c02009-10-16 20:08:10 -040039#include "util/debug.h"
Masami Hiramatsu96c96612009-12-16 17:24:00 -050040#include "util/debugfs.h"
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040041#include "util/parse-options.h"
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040042#include "util/probe-finder.h"
Masami Hiramatsu50656ee2009-11-30 19:19:58 -050043#include "util/probe-event.h"
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040044
Masami Hiramatsubd09d7b2011-01-20 23:15:39 +090045#define DEFAULT_VAR_FILTER "!__k???tab_* & !__crc_*"
Masami Hiramatsu3c422582011-01-20 23:15:45 +090046#define DEFAULT_FUNC_FILTER "!_*"
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040047
48/* Session management structure */
49static struct {
Masami Hiramatsufac13fd2009-12-15 10:31:14 -050050 bool list_events;
Masami Hiramatsud761b082009-12-15 10:32:25 -050051 bool force_add;
Masami Hiramatsu631c9de2010-01-06 09:45:34 -050052 bool show_lines;
Masami Hiramatsucf6eb482010-10-21 19:13:23 +090053 bool show_vars;
Masami Hiramatsufb8c5a52010-10-21 19:13:35 +090054 bool show_ext_vars;
Masami Hiramatsue80711c2011-01-13 21:46:11 +090055 bool show_funcs;
Masami Hiramatsucf6eb482010-10-21 19:13:23 +090056 bool mod_events;
Srikar Dronamraju225466f2012-04-16 17:39:09 +053057 bool uprobes;
Masami Hiramatsu4235b042010-03-16 18:06:12 -040058 int nevents;
59 struct perf_probe_event events[MAX_PROBES];
Masami Hiramatsufa282442009-12-08 17:03:23 -050060 struct strlist *dellist;
Masami Hiramatsu631c9de2010-01-06 09:45:34 -050061 struct line_range line_range;
Srikar Dronamraju4eced232012-02-02 19:50:40 +053062 const char *target;
Masami Hiramatsuef4a3562010-04-21 15:56:40 -040063 int max_probe_points;
Masami Hiramatsubd09d7b2011-01-20 23:15:39 +090064 struct strfilter *filter;
Masami Hiramatsu12a1fad2010-03-16 18:05:44 -040065} params;
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040066
Masami Hiramatsu253977b2009-10-27 16:43:10 -040067/* Parse an event definition. Note that any error must die. */
Masami Hiramatsu146a1432010-04-12 13:17:42 -040068static int parse_probe_event(const char *str)
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040069{
Masami Hiramatsu4235b042010-03-16 18:06:12 -040070 struct perf_probe_event *pev = &params.events[params.nevents];
Masami Hiramatsu146a1432010-04-12 13:17:42 -040071 int ret;
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040072
Masami Hiramatsu4235b042010-03-16 18:06:12 -040073 pr_debug("probe-definition(%d): %s\n", params.nevents, str);
Arnaldo Carvalho de Melo8a7ddad2010-05-18 22:57:27 -030074 if (++params.nevents == MAX_PROBES) {
75 pr_err("Too many probes (> %d) were specified.", MAX_PROBES);
76 return -1;
77 }
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -040078
Srikar Dronamraju225466f2012-04-16 17:39:09 +053079 pev->uprobes = params.uprobes;
80
Masami Hiramatsu4235b042010-03-16 18:06:12 -040081 /* Parse a perf-probe command into event */
Masami Hiramatsu146a1432010-04-12 13:17:42 -040082 ret = parse_perf_probe_command(str, pev);
Masami Hiramatsu4235b042010-03-16 18:06:12 -040083 pr_debug("%d arguments\n", pev->nargs);
Masami Hiramatsu146a1432010-04-12 13:17:42 -040084
85 return ret;
Masami Hiramatsu46ab4922009-10-27 16:43:02 -040086}
87
Masami Hiramatsu146a1432010-04-12 13:17:42 -040088static int parse_probe_event_argv(int argc, const char **argv)
Masami Hiramatsud1bde3f2009-12-08 17:02:54 -050089{
Masami Hiramatsu146a1432010-04-12 13:17:42 -040090 int i, len, ret;
Masami Hiramatsud1bde3f2009-12-08 17:02:54 -050091 char *buf;
92
93 /* Bind up rest arguments */
94 len = 0;
95 for (i = 0; i < argc; i++)
96 len += strlen(argv[i]) + 1;
Arnaldo Carvalho de Melo8a7ddad2010-05-18 22:57:27 -030097 buf = zalloc(len + 1);
98 if (buf == NULL)
99 return -ENOMEM;
Masami Hiramatsud1bde3f2009-12-08 17:02:54 -0500100 len = 0;
101 for (i = 0; i < argc; i++)
102 len += sprintf(&buf[len], "%s ", argv[i]);
Masami Hiramatsucf6eb482010-10-21 19:13:23 +0900103 params.mod_events = true;
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400104 ret = parse_probe_event(buf);
Masami Hiramatsud1bde3f2009-12-08 17:02:54 -0500105 free(buf);
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400106 return ret;
Masami Hiramatsud1bde3f2009-12-08 17:02:54 -0500107}
108
Masami Hiramatsu253977b2009-10-27 16:43:10 -0400109static int opt_add_probe_event(const struct option *opt __used,
Masami Hiramatsu46ab4922009-10-27 16:43:02 -0400110 const char *str, int unset __used)
111{
Masami Hiramatsucf6eb482010-10-21 19:13:23 +0900112 if (str) {
113 params.mod_events = true;
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400114 return parse_probe_event(str);
Masami Hiramatsucf6eb482010-10-21 19:13:23 +0900115 } else
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400116 return 0;
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400117}
118
Masami Hiramatsufa282442009-12-08 17:03:23 -0500119static int opt_del_probe_event(const struct option *opt __used,
120 const char *str, int unset __used)
121{
122 if (str) {
Masami Hiramatsucf6eb482010-10-21 19:13:23 +0900123 params.mod_events = true;
Masami Hiramatsu12a1fad2010-03-16 18:05:44 -0400124 if (!params.dellist)
125 params.dellist = strlist__new(true, NULL);
126 strlist__add(params.dellist, str);
Masami Hiramatsufa282442009-12-08 17:03:23 -0500127 }
128 return 0;
129}
130
Srikar Dronamraju225466f2012-04-16 17:39:09 +0530131static int opt_set_target(const struct option *opt, const char *str,
132 int unset __used)
133{
134 int ret = -ENOENT;
135
136 if (str && !params.target) {
137 if (!strcmp(opt->long_name, "exec"))
138 params.uprobes = true;
139#ifdef DWARF_SUPPORT
140 else if (!strcmp(opt->long_name, "module"))
141 params.uprobes = false;
142#endif
143 else
144 return ret;
145
146 params.target = str;
147 ret = 0;
148 }
149
150 return ret;
151}
152
Masami Hiramatsu4b4da7f2010-03-22 13:10:26 -0300153#ifdef DWARF_SUPPORT
Hitoshi Mitake0eda7382010-01-16 21:31:16 +0900154static int opt_show_lines(const struct option *opt __used,
155 const char *str, int unset __used)
156{
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400157 int ret = 0;
158
Masami Hiramatsu13e27d72011-08-11 20:02:53 +0900159 if (!str)
160 return 0;
161
162 if (params.show_lines) {
163 pr_warning("Warning: more than one --line options are"
164 " detected. Only the first one is valid.\n");
165 return 0;
166 }
167
Masami Hiramatsu12a1fad2010-03-16 18:05:44 -0400168 params.show_lines = true;
Masami Hiramatsu13e27d72011-08-11 20:02:53 +0900169 ret = parse_line_range_desc(str, &params.line_range);
170 INIT_LIST_HEAD(&params.line_range.line_list);
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400171
172 return ret;
Hitoshi Mitake0eda7382010-01-16 21:31:16 +0900173}
Masami Hiramatsucf6eb482010-10-21 19:13:23 +0900174
175static int opt_show_vars(const struct option *opt __used,
176 const char *str, int unset __used)
177{
178 struct perf_probe_event *pev = &params.events[params.nevents];
179 int ret;
180
181 if (!str)
182 return 0;
183
184 ret = parse_probe_event(str);
185 if (!ret && pev->nargs != 0) {
186 pr_err(" Error: '--vars' doesn't accept arguments.\n");
187 return -EINVAL;
188 }
189 params.show_vars = true;
190
191 return ret;
192}
Masami Hiramatsu3c422582011-01-20 23:15:45 +0900193#endif
Masami Hiramatsubd09d7b2011-01-20 23:15:39 +0900194
195static int opt_set_filter(const struct option *opt __used,
196 const char *str, int unset __used)
197{
198 const char *err;
199
200 if (str) {
201 pr_debug2("Set filter: %s\n", str);
202 if (params.filter)
203 strfilter__delete(params.filter);
204 params.filter = strfilter__new(str, &err);
205 if (!params.filter) {
Arnaldo Carvalho de Melo823c7162011-01-31 19:45:38 -0200206 pr_err("Filter parse error at %td.\n", err - str + 1);
Masami Hiramatsubd09d7b2011-01-20 23:15:39 +0900207 pr_err("Source: \"%s\"\n", str);
208 pr_err(" %*c\n", (int)(err - str + 1), '^');
209 return -EINVAL;
210 }
211 }
212
213 return 0;
214}
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400215
216static const char * const probe_usage[] = {
Masami Hiramatsu46ab4922009-10-27 16:43:02 -0400217 "perf probe [<options>] 'PROBEDEF' ['PROBEDEF' ...]",
218 "perf probe [<options>] --add 'PROBEDEF' [--add 'PROBEDEF' ...]",
Masami Hiramatsufa282442009-12-08 17:03:23 -0500219 "perf probe [<options>] --del '[GROUP:]EVENT' ...",
Masami Hiramatsu4de189f2009-11-30 19:20:17 -0500220 "perf probe --list",
Masami Hiramatsu4b4da7f2010-03-22 13:10:26 -0300221#ifdef DWARF_SUPPORT
Masami Hiramatsu469b9b82010-10-21 19:13:41 +0900222 "perf probe [<options>] --line 'LINEDESC'",
223 "perf probe [<options>] --vars 'PROBEPOINT'",
Masami Hiramatsuf3ab4812010-02-25 08:35:12 -0500224#endif
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400225 NULL
226};
227
228static const struct option options[] = {
Ian Munsiec0555642010-04-13 18:37:33 +1000229 OPT_INCR('v', "verbose", &verbose,
Masami Hiramatsu89c69c02009-10-16 20:08:10 -0400230 "be more verbose (show parsed arguments, etc)"),
Masami Hiramatsu12a1fad2010-03-16 18:05:44 -0400231 OPT_BOOLEAN('l', "list", &params.list_events,
Masami Hiramatsufac13fd2009-12-15 10:31:14 -0500232 "list up current probe events"),
Masami Hiramatsufa282442009-12-08 17:03:23 -0500233 OPT_CALLBACK('d', "del", NULL, "[GROUP:]EVENT", "delete a probe event.",
234 opt_del_probe_event),
Masami Hiramatsu46ab4922009-10-27 16:43:02 -0400235 OPT_CALLBACK('a', "add", NULL,
Masami Hiramatsu4b4da7f2010-03-22 13:10:26 -0300236#ifdef DWARF_SUPPORT
Masami Hiramatsu32cb0dd2010-03-03 22:38:43 -0500237 "[EVENT=]FUNC[@SRC][+OFF|%return|:RL|;PT]|SRC:AL|SRC;PT"
Masami Hiramatsu48481932010-04-12 13:16:53 -0400238 " [[NAME=]ARG ...]",
Masami Hiramatsu4b4da7f2010-03-22 13:10:26 -0300239#else
Masami Hiramatsu48481932010-04-12 13:16:53 -0400240 "[EVENT=]FUNC[+OFF|%return] [[NAME=]ARG ...]",
Masami Hiramatsu23e8ec02009-10-07 18:28:30 -0400241#endif
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400242 "probe point definition, where\n"
Masami Hiramatsuaf663d72009-12-15 10:32:18 -0500243 "\t\tGROUP:\tGroup name (optional)\n"
244 "\t\tEVENT:\tEvent name\n"
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400245 "\t\tFUNC:\tFunction name\n"
Masami Hiramatsu2a9c8c32010-02-25 08:36:12 -0500246 "\t\tOFF:\tOffset from function entry (in byte)\n"
Masami Hiramatsu253977b2009-10-27 16:43:10 -0400247 "\t\t%return:\tPut the probe at function return\n"
Masami Hiramatsu4b4da7f2010-03-22 13:10:26 -0300248#ifdef DWARF_SUPPORT
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400249 "\t\tSRC:\tSource code path\n"
Masami Hiramatsu2a9c8c32010-02-25 08:36:12 -0500250 "\t\tRL:\tRelative line number from function entry.\n"
251 "\t\tAL:\tAbsolute line number in file.\n"
252 "\t\tPT:\tLazy expression of line code.\n"
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400253 "\t\tARG:\tProbe argument (local variable name or\n"
Masami Hiramatsu50656ee2009-11-30 19:19:58 -0500254 "\t\t\tkprobe-tracer argument format.)\n",
Masami Hiramatsu4b4da7f2010-03-22 13:10:26 -0300255#else
256 "\t\tARG:\tProbe argument (kprobe-tracer argument format.)\n",
257#endif
Masami Hiramatsu253977b2009-10-27 16:43:10 -0400258 opt_add_probe_event),
Masami Hiramatsu12a1fad2010-03-16 18:05:44 -0400259 OPT_BOOLEAN('f', "force", &params.force_add, "forcibly add events"
Masami Hiramatsud761b082009-12-15 10:32:25 -0500260 " with existing name"),
Masami Hiramatsu4b4da7f2010-03-22 13:10:26 -0300261#ifdef DWARF_SUPPORT
Masami Hiramatsu631c9de2010-01-06 09:45:34 -0500262 OPT_CALLBACK('L', "line", NULL,
Masami Hiramatsu085ea732010-04-02 12:50:39 -0400263 "FUNC[:RLN[+NUM|-RLN2]]|SRC:ALN[+NUM|-ALN2]",
Masami Hiramatsu631c9de2010-01-06 09:45:34 -0500264 "Show source code lines.", opt_show_lines),
Masami Hiramatsucf6eb482010-10-21 19:13:23 +0900265 OPT_CALLBACK('V', "vars", NULL,
266 "FUNC[@SRC][+OFF|%return|:RL|;PT]|SRC:AL|SRC;PT",
267 "Show accessible variables on PROBEDEF", opt_show_vars),
Masami Hiramatsufb8c5a52010-10-21 19:13:35 +0900268 OPT_BOOLEAN('\0', "externs", &params.show_ext_vars,
269 "Show external variables too (with --vars only)"),
Masami Hiramatsu4b4da7f2010-03-22 13:10:26 -0300270 OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
271 "file", "vmlinux pathname"),
Chase Douglas9ed7e1b2010-06-14 15:26:30 -0400272 OPT_STRING('s', "source", &symbol_conf.source_prefix,
273 "directory", "path to kernel source"),
Srikar Dronamraju225466f2012-04-16 17:39:09 +0530274 OPT_CALLBACK('m', "module", NULL, "modname|path",
275 "target module name (for online) or path (for offline)",
276 opt_set_target),
Masami Hiramatsu631c9de2010-01-06 09:45:34 -0500277#endif
Masami Hiramatsuf4d7da42010-03-16 18:06:05 -0400278 OPT__DRY_RUN(&probe_event_dry_run),
Masami Hiramatsuef4a3562010-04-21 15:56:40 -0400279 OPT_INTEGER('\0', "max-probes", &params.max_probe_points,
280 "Set how many probe points can be found for a probe."),
Masami Hiramatsue80711c2011-01-13 21:46:11 +0900281 OPT_BOOLEAN('F', "funcs", &params.show_funcs,
282 "Show potential probe-able functions."),
Masami Hiramatsu3c422582011-01-20 23:15:45 +0900283 OPT_CALLBACK('\0', "filter", NULL,
284 "[!]FILTER", "Set a filter (with --vars/funcs only)\n"
285 "\t\t\t(default: \"" DEFAULT_VAR_FILTER "\" for --vars,\n"
286 "\t\t\t \"" DEFAULT_FUNC_FILTER "\" for --funcs)",
287 opt_set_filter),
Srikar Dronamraju225466f2012-04-16 17:39:09 +0530288 OPT_CALLBACK('x', "exec", NULL, "executable|path",
289 "target executable name or path", opt_set_target),
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400290 OPT_END()
291};
292
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400293int cmd_probe(int argc, const char **argv, const char *prefix __used)
294{
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400295 int ret;
296
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400297 argc = parse_options(argc, argv, options, probe_usage,
Masami Hiramatsu46ab4922009-10-27 16:43:02 -0400298 PARSE_OPT_STOP_AT_NON_OPTION);
Masami Hiramatsuce11a602009-12-15 10:31:28 -0500299 if (argc > 0) {
300 if (strcmp(argv[0], "-") == 0) {
301 pr_warning(" Error: '-' is not supported.\n");
302 usage_with_options(probe_usage, options);
303 }
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400304 ret = parse_probe_event_argv(argc, argv);
305 if (ret < 0) {
306 pr_err(" Error: Parse Error. (%d)\n", ret);
307 return ret;
308 }
Masami Hiramatsuce11a602009-12-15 10:31:28 -0500309 }
Masami Hiramatsu46ab4922009-10-27 16:43:02 -0400310
Masami Hiramatsuef4a3562010-04-21 15:56:40 -0400311 if (params.max_probe_points == 0)
312 params.max_probe_points = MAX_PROBES;
313
Masami Hiramatsu4235b042010-03-16 18:06:12 -0400314 if ((!params.nevents && !params.dellist && !params.list_events &&
Masami Hiramatsue80711c2011-01-13 21:46:11 +0900315 !params.show_lines && !params.show_funcs))
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400316 usage_with_options(probe_usage, options);
317
Franck Bui-Huufd930ff2010-12-10 14:06:03 +0100318 /*
319 * Only consider the user's kernel image path if given.
320 */
321 symbol_conf.try_vmlinux_path = (symbol_conf.vmlinux_name == NULL);
322
Masami Hiramatsu12a1fad2010-03-16 18:05:44 -0400323 if (params.list_events) {
Masami Hiramatsucf6eb482010-10-21 19:13:23 +0900324 if (params.mod_events) {
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400325 pr_err(" Error: Don't use --list with --add/--del.\n");
Masami Hiramatsufa282442009-12-08 17:03:23 -0500326 usage_with_options(probe_usage, options);
327 }
Masami Hiramatsu12a1fad2010-03-16 18:05:44 -0400328 if (params.show_lines) {
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400329 pr_err(" Error: Don't use --list with --line.\n");
Masami Hiramatsu631c9de2010-01-06 09:45:34 -0500330 usage_with_options(probe_usage, options);
331 }
Masami Hiramatsucf6eb482010-10-21 19:13:23 +0900332 if (params.show_vars) {
333 pr_err(" Error: Don't use --list with --vars.\n");
334 usage_with_options(probe_usage, options);
335 }
Masami Hiramatsue80711c2011-01-13 21:46:11 +0900336 if (params.show_funcs) {
337 pr_err(" Error: Don't use --list with --funcs.\n");
338 usage_with_options(probe_usage, options);
339 }
Srikar Dronamraju225466f2012-04-16 17:39:09 +0530340 if (params.uprobes) {
341 pr_warning(" Error: Don't use --list with --exec.\n");
342 usage_with_options(probe_usage, options);
343 }
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400344 ret = show_perf_probe_events();
345 if (ret < 0)
346 pr_err(" Error: Failed to show event list. (%d)\n",
347 ret);
348 return ret;
Masami Hiramatsu4de189f2009-11-30 19:20:17 -0500349 }
Masami Hiramatsue80711c2011-01-13 21:46:11 +0900350 if (params.show_funcs) {
351 if (params.nevents != 0 || params.dellist) {
352 pr_err(" Error: Don't use --funcs with"
353 " --add/--del.\n");
354 usage_with_options(probe_usage, options);
355 }
356 if (params.show_lines) {
357 pr_err(" Error: Don't use --funcs with --line.\n");
358 usage_with_options(probe_usage, options);
359 }
360 if (params.show_vars) {
361 pr_err(" Error: Don't use --funcs with --vars.\n");
362 usage_with_options(probe_usage, options);
363 }
Masami Hiramatsu3c422582011-01-20 23:15:45 +0900364 if (!params.filter)
365 params.filter = strfilter__new(DEFAULT_FUNC_FILTER,
366 NULL);
Srikar Dronamraju225466f2012-04-16 17:39:09 +0530367 ret = show_available_funcs(params.target, params.filter,
368 params.uprobes);
Masami Hiramatsu3c422582011-01-20 23:15:45 +0900369 strfilter__delete(params.filter);
Masami Hiramatsue80711c2011-01-13 21:46:11 +0900370 if (ret < 0)
371 pr_err(" Error: Failed to show functions."
372 " (%d)\n", ret);
373 return ret;
374 }
Masami Hiramatsu4de189f2009-11-30 19:20:17 -0500375
Masami Hiramatsu4b4da7f2010-03-22 13:10:26 -0300376#ifdef DWARF_SUPPORT
Srikar Dronamraju225466f2012-04-16 17:39:09 +0530377 if (params.show_lines && !params.uprobes) {
Masami Hiramatsucf6eb482010-10-21 19:13:23 +0900378 if (params.mod_events) {
379 pr_err(" Error: Don't use --line with"
380 " --add/--del.\n");
381 usage_with_options(probe_usage, options);
382 }
383 if (params.show_vars) {
384 pr_err(" Error: Don't use --line with --vars.\n");
Masami Hiramatsu631c9de2010-01-06 09:45:34 -0500385 usage_with_options(probe_usage, options);
386 }
Masami Hiramatsue0faa8d2010-03-16 18:05:37 -0400387
Srikar Dronamraju4eced232012-02-02 19:50:40 +0530388 ret = show_line_range(&params.line_range, params.target);
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400389 if (ret < 0)
390 pr_err(" Error: Failed to show lines. (%d)\n", ret);
391 return ret;
Masami Hiramatsu631c9de2010-01-06 09:45:34 -0500392 }
Masami Hiramatsucf6eb482010-10-21 19:13:23 +0900393 if (params.show_vars) {
394 if (params.mod_events) {
395 pr_err(" Error: Don't use --vars with"
396 " --add/--del.\n");
397 usage_with_options(probe_usage, options);
398 }
Masami Hiramatsubd09d7b2011-01-20 23:15:39 +0900399 if (!params.filter)
400 params.filter = strfilter__new(DEFAULT_VAR_FILTER,
401 NULL);
402
Masami Hiramatsucf6eb482010-10-21 19:13:23 +0900403 ret = show_available_vars(params.events, params.nevents,
Masami Hiramatsufb8c5a52010-10-21 19:13:35 +0900404 params.max_probe_points,
Srikar Dronamraju4eced232012-02-02 19:50:40 +0530405 params.target,
Masami Hiramatsubd09d7b2011-01-20 23:15:39 +0900406 params.filter,
Masami Hiramatsufb8c5a52010-10-21 19:13:35 +0900407 params.show_ext_vars);
Masami Hiramatsubd09d7b2011-01-20 23:15:39 +0900408 strfilter__delete(params.filter);
Masami Hiramatsucf6eb482010-10-21 19:13:23 +0900409 if (ret < 0)
410 pr_err(" Error: Failed to show vars. (%d)\n", ret);
411 return ret;
412 }
Masami Hiramatsu631c9de2010-01-06 09:45:34 -0500413#endif
414
Masami Hiramatsu12a1fad2010-03-16 18:05:44 -0400415 if (params.dellist) {
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400416 ret = del_perf_probe_events(params.dellist);
Masami Hiramatsu12a1fad2010-03-16 18:05:44 -0400417 strlist__delete(params.dellist);
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400418 if (ret < 0) {
419 pr_err(" Error: Failed to delete events. (%d)\n", ret);
420 return ret;
421 }
Masami Hiramatsufa282442009-12-08 17:03:23 -0500422 }
423
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400424 if (params.nevents) {
425 ret = add_perf_probe_events(params.events, params.nevents,
Masami Hiramatsuc82ec0a2010-10-21 19:13:29 +0900426 params.max_probe_points,
Srikar Dronamraju4eced232012-02-02 19:50:40 +0530427 params.target,
Masami Hiramatsuc82ec0a2010-10-21 19:13:29 +0900428 params.force_add);
Masami Hiramatsu146a1432010-04-12 13:17:42 -0400429 if (ret < 0) {
430 pr_err(" Error: Failed to add events. (%d)\n", ret);
431 return ret;
432 }
433 }
Masami Hiramatsu4ea42b12009-10-08 17:17:38 -0400434 return 0;
435}