1 /*
2 * Copyright (C) 2015, Wang Nan <wangnan0@huawei.com>
3 * Copyright (C) 2015, Huawei Inc.
4 */
5 #ifndef __BPF_LOADER_H
6 #define __BPF_LOADER_H
7
8 #include <linux/compiler.h>
9 #include <linux/err.h>
10 #include <string.h>
11 #include <bpf/libbpf.h>
12 #include "probe-event.h"
13 #include "debug.h"
14
15 enum bpf_loader_errno {
16 __BPF_LOADER_ERRNO__START = __LIBBPF_ERRNO__START - 100,
17 /* Invalid config string */
18 BPF_LOADER_ERRNO__CONFIG = __BPF_LOADER_ERRNO__START,
19 BPF_LOADER_ERRNO__GROUP, /* Invalid group name */
20 BPF_LOADER_ERRNO__EVENTNAME, /* Event name is missing */
21 BPF_LOADER_ERRNO__INTERNAL, /* BPF loader internal error */
22 BPF_LOADER_ERRNO__COMPILE, /* Error when compiling BPF scriptlet */
23 __BPF_LOADER_ERRNO__END,
24 };
25
26 struct bpf_object;
27 #define PERF_BPF_PROBE_GROUP "perf_bpf_probe"
28
29 typedef int (*bpf_prog_iter_callback_t)(struct probe_trace_event *tev,
30 int fd, void *arg);
31
32 #ifdef HAVE_LIBBPF_SUPPORT
33 struct bpf_object *bpf__prepare_load(const char *filename, bool source);
34 int bpf__strerror_prepare_load(const char *filename, bool source,
35 int err, char *buf, size_t size);
36
37 struct bpf_object *bpf__prepare_load_buffer(void *obj_buf, size_t obj_buf_sz,
38 const char *name);
39
40 void bpf__clear(void);
41
42 int bpf__probe(struct bpf_object *obj);
43 int bpf__unprobe(struct bpf_object *obj);
44 int bpf__strerror_probe(struct bpf_object *obj, int err,
45 char *buf, size_t size);
46
47 int bpf__load(struct bpf_object *obj);
48 int bpf__strerror_load(struct bpf_object *obj, int err,
49 char *buf, size_t size);
50 int bpf__foreach_tev(struct bpf_object *obj,
51 bpf_prog_iter_callback_t func, void *arg);
52 #else
53 static inline struct bpf_object *
bpf__prepare_load(const char * filename __maybe_unused,bool source __maybe_unused)54 bpf__prepare_load(const char *filename __maybe_unused,
55 bool source __maybe_unused)
56 {
57 pr_debug("ERROR: eBPF object loading is disabled during compiling.\n");
58 return ERR_PTR(-ENOTSUP);
59 }
60
61 static inline struct bpf_object *
bpf__prepare_load_buffer(void * obj_buf __maybe_unused,size_t obj_buf_sz __maybe_unused)62 bpf__prepare_load_buffer(void *obj_buf __maybe_unused,
63 size_t obj_buf_sz __maybe_unused)
64 {
65 return ERR_PTR(-ENOTSUP);
66 }
67
bpf__clear(void)68 static inline void bpf__clear(void) { }
69
bpf__probe(struct bpf_object * obj __maybe_unused)70 static inline int bpf__probe(struct bpf_object *obj __maybe_unused) { return 0;}
bpf__unprobe(struct bpf_object * obj __maybe_unused)71 static inline int bpf__unprobe(struct bpf_object *obj __maybe_unused) { return 0;}
bpf__load(struct bpf_object * obj __maybe_unused)72 static inline int bpf__load(struct bpf_object *obj __maybe_unused) { return 0; }
73
74 static inline int
bpf__foreach_tev(struct bpf_object * obj __maybe_unused,bpf_prog_iter_callback_t func __maybe_unused,void * arg __maybe_unused)75 bpf__foreach_tev(struct bpf_object *obj __maybe_unused,
76 bpf_prog_iter_callback_t func __maybe_unused,
77 void *arg __maybe_unused)
78 {
79 return 0;
80 }
81
82 static inline int
__bpf_strerror(char * buf,size_t size)83 __bpf_strerror(char *buf, size_t size)
84 {
85 if (!size)
86 return 0;
87 strncpy(buf,
88 "ERROR: eBPF object loading is disabled during compiling.\n",
89 size);
90 buf[size - 1] = '\0';
91 return 0;
92 }
93
94 static inline
bpf__strerror_prepare_load(const char * filename __maybe_unused,bool source __maybe_unused,int err __maybe_unused,char * buf,size_t size)95 int bpf__strerror_prepare_load(const char *filename __maybe_unused,
96 bool source __maybe_unused,
97 int err __maybe_unused,
98 char *buf, size_t size)
99 {
100 return __bpf_strerror(buf, size);
101 }
102
103 static inline int
bpf__strerror_probe(struct bpf_object * obj __maybe_unused,int err __maybe_unused,char * buf,size_t size)104 bpf__strerror_probe(struct bpf_object *obj __maybe_unused,
105 int err __maybe_unused,
106 char *buf, size_t size)
107 {
108 return __bpf_strerror(buf, size);
109 }
110
bpf__strerror_load(struct bpf_object * obj __maybe_unused,int err __maybe_unused,char * buf,size_t size)111 static inline int bpf__strerror_load(struct bpf_object *obj __maybe_unused,
112 int err __maybe_unused,
113 char *buf, size_t size)
114 {
115 return __bpf_strerror(buf, size);
116 }
117 #endif
118 #endif
119