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