4 * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com>
5 * Copyright (C) 2015 Huawei Inc.
8 #include <bpf/libbpf.h>
10 #include <linux/string.h>
13 #include "bpf-loader.h"
14 #include "probe-event.h"
15 #include "probe-finder.h" // for MAX_PROBES
16 #include "llvm-utils.h"
18 #define DEFINE_PRINT_FN(name, level) \
19 static int libbpf_##name(const char *fmt, ...) \
24 va_start(args, fmt); \
25 ret = veprintf(level, verbose, pr_fmt(fmt), args);\
30 DEFINE_PRINT_FN(warning
, 1)
31 DEFINE_PRINT_FN(info
, 1)
32 DEFINE_PRINT_FN(debug
, 1)
34 struct bpf_prog_priv
{
35 struct perf_probe_event pev
;
38 static bool libbpf_initialized
;
41 bpf__prepare_load_buffer(void *obj_buf
, size_t obj_buf_sz
, const char *name
)
43 struct bpf_object
*obj
;
45 if (!libbpf_initialized
) {
46 libbpf_set_print(libbpf_warning
,
49 libbpf_initialized
= true;
52 obj
= bpf_object__open_buffer(obj_buf
, obj_buf_sz
, name
);
54 pr_debug("bpf: failed to load buffer\n");
55 return ERR_PTR(-EINVAL
);
61 struct bpf_object
*bpf__prepare_load(const char *filename
, bool source
)
63 struct bpf_object
*obj
;
65 if (!libbpf_initialized
) {
66 libbpf_set_print(libbpf_warning
,
69 libbpf_initialized
= true;
77 err
= llvm__compile_bpf(filename
, &obj_buf
, &obj_buf_sz
);
79 return ERR_PTR(-BPF_LOADER_ERRNO__COMPILE
);
80 obj
= bpf_object__open_buffer(obj_buf
, obj_buf_sz
, filename
);
83 obj
= bpf_object__open(filename
);
86 pr_debug("bpf: failed to load %s\n", filename
);
95 struct bpf_object
*obj
, *tmp
;
97 bpf_object__for_each_safe(obj
, tmp
) {
99 bpf_object__close(obj
);
104 bpf_prog_priv__clear(struct bpf_program
*prog __maybe_unused
,
107 struct bpf_prog_priv
*priv
= _priv
;
109 cleanup_perf_probe_events(&priv
->pev
, 1);
114 config__exec(const char *value
, struct perf_probe_event
*pev
)
117 pev
->target
= strdup(value
);
124 config__module(const char *value
, struct perf_probe_event
*pev
)
126 pev
->uprobes
= false;
127 pev
->target
= strdup(value
);
134 config__bool(const char *value
,
135 bool *pbool
, bool invert
)
143 err
= strtobool(value
, &bool_value
);
147 *pbool
= invert
? !bool_value
: bool_value
;
152 config__inlines(const char *value
,
153 struct perf_probe_event
*pev __maybe_unused
)
155 return config__bool(value
, &probe_conf
.no_inlines
, true);
159 config__force(const char *value
,
160 struct perf_probe_event
*pev __maybe_unused
)
162 return config__bool(value
, &probe_conf
.force_add
, false);
169 int (*func
)(const char *, struct perf_probe_event
*);
170 } bpf_config_terms
[] = {
173 .usage
= "exec=<full path of file>",
174 .desc
= "Set uprobe target",
175 .func
= config__exec
,
179 .usage
= "module=<module name> ",
180 .desc
= "Set kprobe module",
181 .func
= config__module
,
185 .usage
= "inlines=[yes|no] ",
186 .desc
= "Probe at inline symbol",
187 .func
= config__inlines
,
191 .usage
= "force=[yes|no] ",
192 .desc
= "Forcibly add events with existing name",
193 .func
= config__force
,
198 do_config(const char *key
, const char *value
,
199 struct perf_probe_event
*pev
)
203 pr_debug("config bpf program: %s=%s\n", key
, value
);
204 for (i
= 0; i
< ARRAY_SIZE(bpf_config_terms
); i
++)
205 if (strcmp(key
, bpf_config_terms
[i
].key
) == 0)
206 return bpf_config_terms
[i
].func(value
, pev
);
208 pr_debug("BPF: ERROR: invalid config option in object: %s=%s\n",
211 pr_debug("\nHint: Currently valid options are:\n");
212 for (i
= 0; i
< ARRAY_SIZE(bpf_config_terms
); i
++)
213 pr_debug("\t%s:\t%s\n", bpf_config_terms
[i
].usage
,
214 bpf_config_terms
[i
].desc
);
217 return -BPF_LOADER_ERRNO__CONFIG_TERM
;
221 parse_config_kvpair(const char *config_str
, struct perf_probe_event
*pev
)
223 char *text
= strdup(config_str
);
225 const char *main_str
= NULL
;
229 pr_debug("No enough memory: dup config_str failed\n");
230 return ERR_PTR(-ENOMEM
);
234 while ((sep
= strchr(line
, ';'))) {
238 equ
= strchr(line
, '=');
240 pr_warning("WARNING: invalid config in BPF object: %s\n",
242 pr_warning("\tShould be 'key=value'.\n");
247 err
= do_config(line
, equ
+ 1, pev
);
255 main_str
= config_str
+ (line
- text
);
258 return err
? ERR_PTR(err
) : main_str
;
262 parse_config(const char *config_str
, struct perf_probe_event
*pev
)
265 const char *main_str
= parse_config_kvpair(config_str
, pev
);
267 if (IS_ERR(main_str
))
268 return PTR_ERR(main_str
);
270 err
= parse_perf_probe_command(main_str
, pev
);
272 pr_debug("bpf: '%s' is not a valid config string\n",
274 /* parse failed, don't need clear pev. */
275 return -BPF_LOADER_ERRNO__CONFIG
;
281 config_bpf_program(struct bpf_program
*prog
)
283 struct perf_probe_event
*pev
= NULL
;
284 struct bpf_prog_priv
*priv
= NULL
;
285 const char *config_str
;
288 /* Initialize per-program probing setting */
289 probe_conf
.no_inlines
= false;
290 probe_conf
.force_add
= false;
292 config_str
= bpf_program__title(prog
, false);
293 if (IS_ERR(config_str
)) {
294 pr_debug("bpf: unable to get title for program\n");
295 return PTR_ERR(config_str
);
298 priv
= calloc(sizeof(*priv
), 1);
300 pr_debug("bpf: failed to alloc priv\n");
305 pr_debug("bpf: config program '%s'\n", config_str
);
306 err
= parse_config(config_str
, pev
);
310 if (pev
->group
&& strcmp(pev
->group
, PERF_BPF_PROBE_GROUP
)) {
311 pr_debug("bpf: '%s': group for event is set and not '%s'.\n",
312 config_str
, PERF_BPF_PROBE_GROUP
);
313 err
= -BPF_LOADER_ERRNO__GROUP
;
315 } else if (!pev
->group
)
316 pev
->group
= strdup(PERF_BPF_PROBE_GROUP
);
319 pr_debug("bpf: strdup failed\n");
325 pr_debug("bpf: '%s': event name is missing. Section name should be 'key=value'\n",
327 err
= -BPF_LOADER_ERRNO__EVENTNAME
;
330 pr_debug("bpf: config '%s' is ok\n", config_str
);
332 err
= bpf_program__set_private(prog
, priv
, bpf_prog_priv__clear
);
334 pr_debug("Failed to set priv for program '%s'\n", config_str
);
342 clear_perf_probe_event(pev
);
347 static int bpf__prepare_probe(void)
350 static bool initialized
= false;
353 * Make err static, so if init failed the first, bpf__prepare_probe()
354 * fails each time without calling init_probe_symbol_maps multiple
361 err
= init_probe_symbol_maps(false);
363 pr_debug("Failed to init_probe_symbol_maps\n");
364 probe_conf
.max_probes
= MAX_PROBES
;
368 int bpf__probe(struct bpf_object
*obj
)
371 struct bpf_program
*prog
;
372 struct bpf_prog_priv
*priv
;
373 struct perf_probe_event
*pev
;
375 err
= bpf__prepare_probe();
377 pr_debug("bpf__prepare_probe failed\n");
381 bpf_object__for_each_program(prog
, obj
) {
382 err
= config_bpf_program(prog
);
386 err
= bpf_program__get_private(prog
, (void **)&priv
);
391 err
= convert_perf_probe_events(pev
, 1);
393 pr_debug("bpf_probe: failed to convert perf probe events");
397 err
= apply_perf_probe_events(pev
, 1);
399 pr_debug("bpf_probe: failed to apply perf probe events");
404 return err
< 0 ? err
: 0;
407 #define EVENTS_WRITE_BUFSIZE 4096
408 int bpf__unprobe(struct bpf_object
*obj
)
411 struct bpf_program
*prog
;
412 struct bpf_prog_priv
*priv
;
414 bpf_object__for_each_program(prog
, obj
) {
417 err
= bpf_program__get_private(prog
, (void **)&priv
);
421 for (i
= 0; i
< priv
->pev
.ntevs
; i
++) {
422 struct probe_trace_event
*tev
= &priv
->pev
.tevs
[i
];
423 char name_buf
[EVENTS_WRITE_BUFSIZE
];
424 struct strfilter
*delfilter
;
426 snprintf(name_buf
, EVENTS_WRITE_BUFSIZE
,
427 "%s:%s", tev
->group
, tev
->event
);
428 name_buf
[EVENTS_WRITE_BUFSIZE
- 1] = '\0';
430 delfilter
= strfilter__new(name_buf
, NULL
);
432 pr_debug("Failed to create filter for unprobing\n");
437 err
= del_perf_probe_events(delfilter
);
438 strfilter__delete(delfilter
);
440 pr_debug("Failed to delete %s\n", name_buf
);
449 int bpf__load(struct bpf_object
*obj
)
453 err
= bpf_object__load(obj
);
455 pr_debug("bpf: load objects failed\n");
461 int bpf__foreach_tev(struct bpf_object
*obj
,
462 bpf_prog_iter_callback_t func
,
465 struct bpf_program
*prog
;
468 bpf_object__for_each_program(prog
, obj
) {
469 struct probe_trace_event
*tev
;
470 struct perf_probe_event
*pev
;
471 struct bpf_prog_priv
*priv
;
474 err
= bpf_program__get_private(prog
,
477 pr_debug("bpf: failed to get private field\n");
478 return -BPF_LOADER_ERRNO__INTERNAL
;
482 for (i
= 0; i
< pev
->ntevs
; i
++) {
485 fd
= bpf_program__fd(prog
);
487 pr_debug("bpf: failed to get file descriptor\n");
491 err
= (*func
)(tev
, fd
, arg
);
493 pr_debug("bpf: call back failed, stop iterate\n");
501 #define ERRNO_OFFSET(e) ((e) - __BPF_LOADER_ERRNO__START)
502 #define ERRCODE_OFFSET(c) ERRNO_OFFSET(BPF_LOADER_ERRNO__##c)
503 #define NR_ERRNO (__BPF_LOADER_ERRNO__END - __BPF_LOADER_ERRNO__START)
505 static const char *bpf_loader_strerror_table
[NR_ERRNO
] = {
506 [ERRCODE_OFFSET(CONFIG
)] = "Invalid config string",
507 [ERRCODE_OFFSET(GROUP
)] = "Invalid group name",
508 [ERRCODE_OFFSET(EVENTNAME
)] = "No event name found in config string",
509 [ERRCODE_OFFSET(INTERNAL
)] = "BPF loader internal error",
510 [ERRCODE_OFFSET(COMPILE
)] = "Error when compiling BPF scriptlet",
511 [ERRCODE_OFFSET(CONFIG_TERM
)] = "Invalid config term in config string",
512 [ERRCODE_OFFSET(PROLOGUE
)] = "Failed to generate prologue",
513 [ERRCODE_OFFSET(PROLOGUE2BIG
)] = "Prologue too big for program",
514 [ERRCODE_OFFSET(PROLOGUEOOB
)] = "Offset out of bound for prologue",
518 bpf_loader_strerror(int err
, char *buf
, size_t size
)
520 char sbuf
[STRERR_BUFSIZE
];
526 err
= err
> 0 ? err
: -err
;
528 if (err
>= __LIBBPF_ERRNO__START
)
529 return libbpf_strerror(err
, buf
, size
);
531 if (err
>= __BPF_LOADER_ERRNO__START
&& err
< __BPF_LOADER_ERRNO__END
) {
532 msg
= bpf_loader_strerror_table
[ERRNO_OFFSET(err
)];
533 snprintf(buf
, size
, "%s", msg
);
534 buf
[size
- 1] = '\0';
538 if (err
>= __BPF_LOADER_ERRNO__END
)
539 snprintf(buf
, size
, "Unknown bpf loader error %d", err
);
541 snprintf(buf
, size
, "%s",
542 strerror_r(err
, sbuf
, sizeof(sbuf
)));
544 buf
[size
- 1] = '\0';
548 #define bpf__strerror_head(err, buf, size) \
549 char sbuf[STRERR_BUFSIZE], *emsg;\
554 bpf_loader_strerror(err, sbuf, sizeof(sbuf));\
558 scnprintf(buf, size, "%s", emsg);\
561 #define bpf__strerror_entry(val, fmt...)\
563 scnprintf(buf, size, fmt);\
567 #define bpf__strerror_end(buf, size)\
569 buf[size - 1] = '\0';
571 int bpf__strerror_prepare_load(const char *filename
, bool source
,
572 int err
, char *buf
, size_t size
)
577 n
= snprintf(buf
, size
, "Failed to load %s%s: ",
578 filename
, source
? " from source" : "");
580 buf
[size
- 1] = '\0';
586 ret
= bpf_loader_strerror(err
, buf
, size
);
587 buf
[size
- 1] = '\0';
591 int bpf__strerror_probe(struct bpf_object
*obj __maybe_unused
,
592 int err
, char *buf
, size_t size
)
594 bpf__strerror_head(err
, buf
, size
);
595 case BPF_LOADER_ERRNO__CONFIG_TERM
: {
596 scnprintf(buf
, size
, "%s (add -v to see detail)", emsg
);
599 bpf__strerror_entry(EEXIST
, "Probe point exist. Try 'perf probe -d \"*\"' and set 'force=yes'");
600 bpf__strerror_entry(EACCES
, "You need to be root");
601 bpf__strerror_entry(EPERM
, "You need to be root, and /proc/sys/kernel/kptr_restrict should be 0");
602 bpf__strerror_entry(ENOENT
, "You need to check probing points in BPF file");
603 bpf__strerror_end(buf
, size
);
607 int bpf__strerror_load(struct bpf_object
*obj
,
608 int err
, char *buf
, size_t size
)
610 bpf__strerror_head(err
, buf
, size
);
611 case LIBBPF_ERRNO__KVER
: {
612 unsigned int obj_kver
= bpf_object__get_kversion(obj
);
613 unsigned int real_kver
;
615 if (fetch_kernel_version(&real_kver
, NULL
, 0)) {
616 scnprintf(buf
, size
, "Unable to fetch kernel version");
620 if (obj_kver
!= real_kver
) {
622 "'version' ("KVER_FMT
") doesn't match running kernel ("KVER_FMT
")",
623 KVER_PARAM(obj_kver
),
624 KVER_PARAM(real_kver
));
628 scnprintf(buf
, size
, "Failed to load program for unknown reason");
631 bpf__strerror_end(buf
, size
);