blob: 84169d6f25859e33ba893d0abd379239876308ec [file] [log] [blame]
Wang Nan69d262a2015-10-14 12:41:13 +00001/*
2 * bpf-loader.c
3 *
4 * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com>
5 * Copyright (C) 2015 Huawei Inc.
6 */
7
8#include <bpf/libbpf.h>
9#include <linux/err.h>
10#include "perf.h"
11#include "debug.h"
12#include "bpf-loader.h"
Wang Nanaa3abf32015-10-14 12:41:15 +000013#include "probe-event.h"
14#include "probe-finder.h" // for MAX_PROBES
Wang Nand509db02015-10-14 12:41:20 +000015#include "llvm-utils.h"
Wang Nan69d262a2015-10-14 12:41:13 +000016
17#define DEFINE_PRINT_FN(name, level) \
18static int libbpf_##name(const char *fmt, ...) \
19{ \
20 va_list args; \
21 int ret; \
22 \
23 va_start(args, fmt); \
24 ret = veprintf(level, verbose, pr_fmt(fmt), args);\
25 va_end(args); \
26 return ret; \
27}
28
Wang Nan7a011942015-11-03 10:44:43 +000029DEFINE_PRINT_FN(warning, 1)
30DEFINE_PRINT_FN(info, 1)
Wang Nan69d262a2015-10-14 12:41:13 +000031DEFINE_PRINT_FN(debug, 1)
32
Wang Nanaa3abf32015-10-14 12:41:15 +000033struct bpf_prog_priv {
34 struct perf_probe_event pev;
35};
36
Wang Nanba1fae42015-11-06 13:49:43 +000037static bool libbpf_initialized;
38
39struct bpf_object *
40bpf__prepare_load_buffer(void *obj_buf, size_t obj_buf_sz, const char *name)
41{
42 struct bpf_object *obj;
43
44 if (!libbpf_initialized) {
45 libbpf_set_print(libbpf_warning,
46 libbpf_info,
47 libbpf_debug);
48 libbpf_initialized = true;
49 }
50
51 obj = bpf_object__open_buffer(obj_buf, obj_buf_sz, name);
52 if (IS_ERR(obj)) {
53 pr_debug("bpf: failed to load buffer\n");
54 return ERR_PTR(-EINVAL);
55 }
56
57 return obj;
58}
59
Wang Nand509db02015-10-14 12:41:20 +000060struct bpf_object *bpf__prepare_load(const char *filename, bool source)
Wang Nan69d262a2015-10-14 12:41:13 +000061{
62 struct bpf_object *obj;
Wang Nan69d262a2015-10-14 12:41:13 +000063
64 if (!libbpf_initialized) {
65 libbpf_set_print(libbpf_warning,
66 libbpf_info,
67 libbpf_debug);
68 libbpf_initialized = true;
69 }
70
Wang Nand509db02015-10-14 12:41:20 +000071 if (source) {
72 int err;
73 void *obj_buf;
74 size_t obj_buf_sz;
75
76 err = llvm__compile_bpf(filename, &obj_buf, &obj_buf_sz);
77 if (err)
Wang Nand3e0ce32015-11-06 13:58:09 +000078 return ERR_PTR(-BPF_LOADER_ERRNO__COMPILE);
Wang Nand509db02015-10-14 12:41:20 +000079 obj = bpf_object__open_buffer(obj_buf, obj_buf_sz, filename);
80 free(obj_buf);
81 } else
82 obj = bpf_object__open(filename);
83
Wang Nan6371ca3b2015-11-06 13:49:37 +000084 if (IS_ERR(obj)) {
Wang Nan69d262a2015-10-14 12:41:13 +000085 pr_debug("bpf: failed to load %s\n", filename);
Wang Nan6371ca3b2015-11-06 13:49:37 +000086 return obj;
Wang Nan69d262a2015-10-14 12:41:13 +000087 }
88
89 return obj;
90}
91
92void bpf__clear(void)
93{
94 struct bpf_object *obj, *tmp;
95
Wang Nanaa3abf32015-10-14 12:41:15 +000096 bpf_object__for_each_safe(obj, tmp) {
97 bpf__unprobe(obj);
Wang Nan69d262a2015-10-14 12:41:13 +000098 bpf_object__close(obj);
Wang Nanaa3abf32015-10-14 12:41:15 +000099 }
100}
101
102static void
103bpf_prog_priv__clear(struct bpf_program *prog __maybe_unused,
104 void *_priv)
105{
106 struct bpf_prog_priv *priv = _priv;
107
108 cleanup_perf_probe_events(&priv->pev, 1);
109 free(priv);
110}
111
112static int
Wang Nan361f2b12015-11-16 12:10:05 +0000113config__exec(const char *value, struct perf_probe_event *pev)
114{
115 pev->uprobes = true;
116 pev->target = strdup(value);
117 if (!pev->target)
118 return -ENOMEM;
119 return 0;
120}
121
122static struct {
123 const char *key;
124 const char *usage;
125 const char *desc;
126 int (*func)(const char *, struct perf_probe_event *);
127} bpf_config_terms[] = {
128 {
129 .key = "exec",
130 .usage = "exec=<full path of file>",
131 .desc = "Set uprobe target",
132 .func = config__exec,
133 },
134};
135
136static int
137do_config(const char *key, const char *value,
138 struct perf_probe_event *pev)
139{
140 unsigned int i;
141
142 pr_debug("config bpf program: %s=%s\n", key, value);
143 for (i = 0; i < ARRAY_SIZE(bpf_config_terms); i++)
144 if (strcmp(key, bpf_config_terms[i].key) == 0)
145 return bpf_config_terms[i].func(value, pev);
146
147 pr_debug("BPF: ERROR: invalid config option in object: %s=%s\n",
148 key, value);
149
150 pr_debug("\nHint: Currently valid options are:\n");
151 for (i = 0; i < ARRAY_SIZE(bpf_config_terms); i++)
152 pr_debug("\t%s:\t%s\n", bpf_config_terms[i].usage,
153 bpf_config_terms[i].desc);
154 pr_debug("\n");
155
156 return -BPF_LOADER_ERRNO__CONFIG_TERM;
157}
158
159static const char *
160parse_config_kvpair(const char *config_str, struct perf_probe_event *pev)
161{
162 char *text = strdup(config_str);
163 char *sep, *line;
164 const char *main_str = NULL;
165 int err = 0;
166
167 if (!text) {
168 pr_debug("No enough memory: dup config_str failed\n");
169 return ERR_PTR(-ENOMEM);
170 }
171
172 line = text;
173 while ((sep = strchr(line, ';'))) {
174 char *equ;
175
176 *sep = '\0';
177 equ = strchr(line, '=');
178 if (!equ) {
179 pr_warning("WARNING: invalid config in BPF object: %s\n",
180 line);
181 pr_warning("\tShould be 'key=value'.\n");
182 goto nextline;
183 }
184 *equ = '\0';
185
186 err = do_config(line, equ + 1, pev);
187 if (err)
188 break;
189nextline:
190 line = sep + 1;
191 }
192
193 if (!err)
194 main_str = config_str + (line - text);
195 free(text);
196
197 return err ? ERR_PTR(err) : main_str;
198}
199
200static int
201parse_config(const char *config_str, struct perf_probe_event *pev)
202{
203 int err;
204 const char *main_str = parse_config_kvpair(config_str, pev);
205
206 if (IS_ERR(main_str))
207 return PTR_ERR(main_str);
208
209 err = parse_perf_probe_command(main_str, pev);
210 if (err < 0) {
211 pr_debug("bpf: '%s' is not a valid config string\n",
212 config_str);
213 /* parse failed, don't need clear pev. */
214 return -BPF_LOADER_ERRNO__CONFIG;
215 }
216 return 0;
217}
218
219static int
Wang Nanaa3abf32015-10-14 12:41:15 +0000220config_bpf_program(struct bpf_program *prog)
221{
222 struct perf_probe_event *pev = NULL;
223 struct bpf_prog_priv *priv = NULL;
224 const char *config_str;
225 int err;
226
227 config_str = bpf_program__title(prog, false);
Wang Nan6371ca3b2015-11-06 13:49:37 +0000228 if (IS_ERR(config_str)) {
Wang Nanaa3abf32015-10-14 12:41:15 +0000229 pr_debug("bpf: unable to get title for program\n");
Wang Nan6371ca3b2015-11-06 13:49:37 +0000230 return PTR_ERR(config_str);
Wang Nanaa3abf32015-10-14 12:41:15 +0000231 }
232
233 priv = calloc(sizeof(*priv), 1);
234 if (!priv) {
235 pr_debug("bpf: failed to alloc priv\n");
236 return -ENOMEM;
237 }
238 pev = &priv->pev;
239
240 pr_debug("bpf: config program '%s'\n", config_str);
Wang Nan361f2b12015-11-16 12:10:05 +0000241 err = parse_config(config_str, pev);
242 if (err)
Wang Nanaa3abf32015-10-14 12:41:15 +0000243 goto errout;
Wang Nanaa3abf32015-10-14 12:41:15 +0000244
245 if (pev->group && strcmp(pev->group, PERF_BPF_PROBE_GROUP)) {
246 pr_debug("bpf: '%s': group for event is set and not '%s'.\n",
247 config_str, PERF_BPF_PROBE_GROUP);
Wang Nand3e0ce32015-11-06 13:58:09 +0000248 err = -BPF_LOADER_ERRNO__GROUP;
Wang Nanaa3abf32015-10-14 12:41:15 +0000249 goto errout;
250 } else if (!pev->group)
251 pev->group = strdup(PERF_BPF_PROBE_GROUP);
252
253 if (!pev->group) {
254 pr_debug("bpf: strdup failed\n");
255 err = -ENOMEM;
256 goto errout;
257 }
258
259 if (!pev->event) {
Wang Nand3e0ce32015-11-06 13:58:09 +0000260 pr_debug("bpf: '%s': event name is missing. Section name should be 'key=value'\n",
Wang Nanaa3abf32015-10-14 12:41:15 +0000261 config_str);
Wang Nand3e0ce32015-11-06 13:58:09 +0000262 err = -BPF_LOADER_ERRNO__EVENTNAME;
Wang Nanaa3abf32015-10-14 12:41:15 +0000263 goto errout;
264 }
265 pr_debug("bpf: config '%s' is ok\n", config_str);
266
267 err = bpf_program__set_private(prog, priv, bpf_prog_priv__clear);
268 if (err) {
269 pr_debug("Failed to set priv for program '%s'\n", config_str);
270 goto errout;
271 }
272
273 return 0;
274
275errout:
276 if (pev)
277 clear_perf_probe_event(pev);
278 free(priv);
279 return err;
280}
281
282static int bpf__prepare_probe(void)
283{
284 static int err = 0;
285 static bool initialized = false;
286
287 /*
288 * Make err static, so if init failed the first, bpf__prepare_probe()
289 * fails each time without calling init_probe_symbol_maps multiple
290 * times.
291 */
292 if (initialized)
293 return err;
294
295 initialized = true;
296 err = init_probe_symbol_maps(false);
297 if (err < 0)
298 pr_debug("Failed to init_probe_symbol_maps\n");
299 probe_conf.max_probes = MAX_PROBES;
300 return err;
301}
302
303int bpf__probe(struct bpf_object *obj)
304{
305 int err = 0;
306 struct bpf_program *prog;
307 struct bpf_prog_priv *priv;
308 struct perf_probe_event *pev;
309
310 err = bpf__prepare_probe();
311 if (err) {
312 pr_debug("bpf__prepare_probe failed\n");
313 return err;
314 }
315
316 bpf_object__for_each_program(prog, obj) {
317 err = config_bpf_program(prog);
318 if (err)
319 goto out;
320
321 err = bpf_program__get_private(prog, (void **)&priv);
322 if (err || !priv)
323 goto out;
324 pev = &priv->pev;
325
326 err = convert_perf_probe_events(pev, 1);
327 if (err < 0) {
328 pr_debug("bpf_probe: failed to convert perf probe events");
329 goto out;
330 }
331
332 err = apply_perf_probe_events(pev, 1);
333 if (err < 0) {
334 pr_debug("bpf_probe: failed to apply perf probe events");
335 goto out;
336 }
337 }
338out:
339 return err < 0 ? err : 0;
340}
341
342#define EVENTS_WRITE_BUFSIZE 4096
343int bpf__unprobe(struct bpf_object *obj)
344{
345 int err, ret = 0;
346 struct bpf_program *prog;
347 struct bpf_prog_priv *priv;
348
349 bpf_object__for_each_program(prog, obj) {
350 int i;
351
352 err = bpf_program__get_private(prog, (void **)&priv);
353 if (err || !priv)
354 continue;
355
356 for (i = 0; i < priv->pev.ntevs; i++) {
357 struct probe_trace_event *tev = &priv->pev.tevs[i];
358 char name_buf[EVENTS_WRITE_BUFSIZE];
359 struct strfilter *delfilter;
360
361 snprintf(name_buf, EVENTS_WRITE_BUFSIZE,
362 "%s:%s", tev->group, tev->event);
363 name_buf[EVENTS_WRITE_BUFSIZE - 1] = '\0';
364
365 delfilter = strfilter__new(name_buf, NULL);
366 if (!delfilter) {
367 pr_debug("Failed to create filter for unprobing\n");
368 ret = -ENOMEM;
369 continue;
370 }
371
372 err = del_perf_probe_events(delfilter);
373 strfilter__delete(delfilter);
374 if (err) {
375 pr_debug("Failed to delete %s\n", name_buf);
376 ret = err;
377 continue;
378 }
379 }
380 }
381 return ret;
382}
383
Wang Nan1e5e3ee2015-10-14 12:41:16 +0000384int bpf__load(struct bpf_object *obj)
385{
386 int err;
387
388 err = bpf_object__load(obj);
389 if (err) {
390 pr_debug("bpf: load objects failed\n");
391 return err;
392 }
393 return 0;
394}
395
Wang Nan4edf30e2015-10-14 12:41:17 +0000396int bpf__foreach_tev(struct bpf_object *obj,
397 bpf_prog_iter_callback_t func,
398 void *arg)
399{
400 struct bpf_program *prog;
401 int err;
402
403 bpf_object__for_each_program(prog, obj) {
404 struct probe_trace_event *tev;
405 struct perf_probe_event *pev;
406 struct bpf_prog_priv *priv;
407 int i, fd;
408
409 err = bpf_program__get_private(prog,
410 (void **)&priv);
411 if (err || !priv) {
412 pr_debug("bpf: failed to get private field\n");
Wang Nand3e0ce32015-11-06 13:58:09 +0000413 return -BPF_LOADER_ERRNO__INTERNAL;
Wang Nan4edf30e2015-10-14 12:41:17 +0000414 }
415
416 pev = &priv->pev;
417 for (i = 0; i < pev->ntevs; i++) {
418 tev = &pev->tevs[i];
419
420 fd = bpf_program__fd(prog);
421 if (fd < 0) {
422 pr_debug("bpf: failed to get file descriptor\n");
423 return fd;
424 }
425
426 err = (*func)(tev, fd, arg);
427 if (err) {
428 pr_debug("bpf: call back failed, stop iterate\n");
429 return err;
430 }
431 }
432 }
433 return 0;
434}
435
Wang Nand3e0ce32015-11-06 13:58:09 +0000436#define ERRNO_OFFSET(e) ((e) - __BPF_LOADER_ERRNO__START)
437#define ERRCODE_OFFSET(c) ERRNO_OFFSET(BPF_LOADER_ERRNO__##c)
438#define NR_ERRNO (__BPF_LOADER_ERRNO__END - __BPF_LOADER_ERRNO__START)
439
440static const char *bpf_loader_strerror_table[NR_ERRNO] = {
441 [ERRCODE_OFFSET(CONFIG)] = "Invalid config string",
442 [ERRCODE_OFFSET(GROUP)] = "Invalid group name",
443 [ERRCODE_OFFSET(EVENTNAME)] = "No event name found in config string",
444 [ERRCODE_OFFSET(INTERNAL)] = "BPF loader internal error",
445 [ERRCODE_OFFSET(COMPILE)] = "Error when compiling BPF scriptlet",
Wang Nan361f2b12015-11-16 12:10:05 +0000446 [ERRCODE_OFFSET(CONFIG_TERM)] = "Invalid config term in config string",
Wang Nand3e0ce32015-11-06 13:58:09 +0000447};
448
Wang Nan6371ca3b2015-11-06 13:49:37 +0000449static int
450bpf_loader_strerror(int err, char *buf, size_t size)
451{
452 char sbuf[STRERR_BUFSIZE];
453 const char *msg;
454
455 if (!buf || !size)
456 return -1;
457
458 err = err > 0 ? err : -err;
459
460 if (err >= __LIBBPF_ERRNO__START)
461 return libbpf_strerror(err, buf, size);
462
Wang Nand3e0ce32015-11-06 13:58:09 +0000463 if (err >= __BPF_LOADER_ERRNO__START && err < __BPF_LOADER_ERRNO__END) {
464 msg = bpf_loader_strerror_table[ERRNO_OFFSET(err)];
465 snprintf(buf, size, "%s", msg);
466 buf[size - 1] = '\0';
467 return 0;
468 }
469
470 if (err >= __BPF_LOADER_ERRNO__END)
471 snprintf(buf, size, "Unknown bpf loader error %d", err);
472 else
473 snprintf(buf, size, "%s",
474 strerror_r(err, sbuf, sizeof(sbuf)));
475
Wang Nan6371ca3b2015-11-06 13:49:37 +0000476 buf[size - 1] = '\0';
Wang Nand3e0ce32015-11-06 13:58:09 +0000477 return -1;
Wang Nan6371ca3b2015-11-06 13:49:37 +0000478}
479
Wang Nanaa3abf32015-10-14 12:41:15 +0000480#define bpf__strerror_head(err, buf, size) \
481 char sbuf[STRERR_BUFSIZE], *emsg;\
482 if (!size)\
483 return 0;\
484 if (err < 0)\
485 err = -err;\
Wang Nan6371ca3b2015-11-06 13:49:37 +0000486 bpf_loader_strerror(err, sbuf, sizeof(sbuf));\
487 emsg = sbuf;\
Wang Nanaa3abf32015-10-14 12:41:15 +0000488 switch (err) {\
489 default:\
490 scnprintf(buf, size, "%s", emsg);\
491 break;
492
493#define bpf__strerror_entry(val, fmt...)\
494 case val: {\
495 scnprintf(buf, size, fmt);\
496 break;\
497 }
498
499#define bpf__strerror_end(buf, size)\
500 }\
501 buf[size - 1] = '\0';
502
Wang Nand3e0ce32015-11-06 13:58:09 +0000503int bpf__strerror_prepare_load(const char *filename, bool source,
504 int err, char *buf, size_t size)
505{
506 size_t n;
507 int ret;
508
509 n = snprintf(buf, size, "Failed to load %s%s: ",
510 filename, source ? " from source" : "");
511 if (n >= size) {
512 buf[size - 1] = '\0';
513 return 0;
514 }
515 buf += n;
516 size -= n;
517
518 ret = bpf_loader_strerror(err, buf, size);
519 buf[size - 1] = '\0';
520 return ret;
521}
522
Wang Nanaa3abf32015-10-14 12:41:15 +0000523int bpf__strerror_probe(struct bpf_object *obj __maybe_unused,
524 int err, char *buf, size_t size)
525{
526 bpf__strerror_head(err, buf, size);
Wang Nan361f2b12015-11-16 12:10:05 +0000527 case BPF_LOADER_ERRNO__CONFIG_TERM: {
528 scnprintf(buf, size, "%s (add -v to see detail)", emsg);
529 break;
530 }
Wang Nanaa3abf32015-10-14 12:41:15 +0000531 bpf__strerror_entry(EEXIST, "Probe point exist. Try use 'perf probe -d \"*\"'");
Wang Nand3e0ce32015-11-06 13:58:09 +0000532 bpf__strerror_entry(EACCES, "You need to be root");
533 bpf__strerror_entry(EPERM, "You need to be root, and /proc/sys/kernel/kptr_restrict should be 0");
534 bpf__strerror_entry(ENOENT, "You need to check probing points in BPF file");
Wang Nanaa3abf32015-10-14 12:41:15 +0000535 bpf__strerror_end(buf, size);
536 return 0;
Wang Nan69d262a2015-10-14 12:41:13 +0000537}
Wang Nan1e5e3ee2015-10-14 12:41:16 +0000538
Wang Nand3e0ce32015-11-06 13:58:09 +0000539int bpf__strerror_load(struct bpf_object *obj,
Wang Nan1e5e3ee2015-10-14 12:41:16 +0000540 int err, char *buf, size_t size)
541{
542 bpf__strerror_head(err, buf, size);
Wang Nand3e0ce32015-11-06 13:58:09 +0000543 case LIBBPF_ERRNO__KVER: {
544 unsigned int obj_kver = bpf_object__get_kversion(obj);
545 unsigned int real_kver;
546
547 if (fetch_kernel_version(&real_kver, NULL, 0)) {
548 scnprintf(buf, size, "Unable to fetch kernel version");
549 break;
550 }
551
552 if (obj_kver != real_kver) {
553 scnprintf(buf, size,
554 "'version' ("KVER_FMT") doesn't match running kernel ("KVER_FMT")",
555 KVER_PARAM(obj_kver),
556 KVER_PARAM(real_kver));
557 break;
558 }
559
560 scnprintf(buf, size, "Failed to load program for unknown reason");
561 break;
562 }
Wang Nan1e5e3ee2015-10-14 12:41:16 +0000563 bpf__strerror_end(buf, size);
564 return 0;
565}