xref: /OK3568_Linux_fs/kernel/tools/perf/util/bpf-loader.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2015, Wang Nan <wangnan0@huawei.com>
4*4882a593Smuzhiyun  * Copyright (C) 2015, Huawei Inc.
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun #ifndef __BPF_LOADER_H
7*4882a593Smuzhiyun #define __BPF_LOADER_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/compiler.h>
10*4882a593Smuzhiyun #include <linux/err.h>
11*4882a593Smuzhiyun #include <bpf/libbpf.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun enum bpf_loader_errno {
14*4882a593Smuzhiyun 	__BPF_LOADER_ERRNO__START = __LIBBPF_ERRNO__START - 100,
15*4882a593Smuzhiyun 	/* Invalid config string */
16*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__CONFIG = __BPF_LOADER_ERRNO__START,
17*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__GROUP,	/* Invalid group name */
18*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__EVENTNAME,	/* Event name is missing */
19*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__INTERNAL,	/* BPF loader internal error */
20*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__COMPILE,	/* Error when compiling BPF scriptlet */
21*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__PROGCONF_TERM,/* Invalid program config term in config string */
22*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__PROLOGUE,	/* Failed to generate prologue */
23*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__PROLOGUE2BIG,	/* Prologue too big for program */
24*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__PROLOGUEOOB,	/* Offset out of bound for prologue */
25*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_OPT,	/* Invalid object config option */
26*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_CONF,	/* Config value not set (lost '=')) */
27*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_MAP_OPT,	/* Invalid object map config option */
28*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_MAP_NOTEXIST,	/* Target map not exist */
29*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_MAP_VALUE,	/* Incorrect value type for map */
30*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_MAP_TYPE,	/* Incorrect map type */
31*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_MAP_KEYSIZE,	/* Incorrect map key size */
32*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_MAP_VALUESIZE,/* Incorrect map value size */
33*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_MAP_NOEVT,	/* Event not found for map setting */
34*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_MAP_MAPSIZE,	/* Invalid map size for event setting */
35*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_MAP_EVTDIM,	/* Event dimension too large */
36*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_MAP_EVTINH,	/* Doesn't support inherit event */
37*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_MAP_EVTTYPE,	/* Wrong event type for map */
38*4882a593Smuzhiyun 	BPF_LOADER_ERRNO__OBJCONF_MAP_IDX2BIG,	/* Index too large */
39*4882a593Smuzhiyun 	__BPF_LOADER_ERRNO__END,
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun struct evsel;
43*4882a593Smuzhiyun struct evlist;
44*4882a593Smuzhiyun struct bpf_object;
45*4882a593Smuzhiyun struct parse_events_term;
46*4882a593Smuzhiyun #define PERF_BPF_PROBE_GROUP "perf_bpf_probe"
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun typedef int (*bpf_prog_iter_callback_t)(const char *group, const char *event,
49*4882a593Smuzhiyun 					int fd, struct bpf_object *obj, void *arg);
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #ifdef HAVE_LIBBPF_SUPPORT
52*4882a593Smuzhiyun struct bpf_object *bpf__prepare_load(const char *filename, bool source);
53*4882a593Smuzhiyun int bpf__strerror_prepare_load(const char *filename, bool source,
54*4882a593Smuzhiyun 			       int err, char *buf, size_t size);
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun struct bpf_object *bpf__prepare_load_buffer(void *obj_buf, size_t obj_buf_sz,
57*4882a593Smuzhiyun 					    const char *name);
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun void bpf__clear(void);
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun int bpf__probe(struct bpf_object *obj);
62*4882a593Smuzhiyun int bpf__unprobe(struct bpf_object *obj);
63*4882a593Smuzhiyun int bpf__strerror_probe(struct bpf_object *obj, int err,
64*4882a593Smuzhiyun 			char *buf, size_t size);
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun int bpf__load(struct bpf_object *obj);
67*4882a593Smuzhiyun int bpf__strerror_load(struct bpf_object *obj, int err,
68*4882a593Smuzhiyun 		       char *buf, size_t size);
69*4882a593Smuzhiyun int bpf__foreach_event(struct bpf_object *obj,
70*4882a593Smuzhiyun 		       bpf_prog_iter_callback_t func, void *arg);
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun int bpf__config_obj(struct bpf_object *obj, struct parse_events_term *term,
73*4882a593Smuzhiyun 		    struct evlist *evlist, int *error_pos);
74*4882a593Smuzhiyun int bpf__strerror_config_obj(struct bpf_object *obj,
75*4882a593Smuzhiyun 			     struct parse_events_term *term,
76*4882a593Smuzhiyun 			     struct evlist *evlist,
77*4882a593Smuzhiyun 			     int *error_pos, int err, char *buf,
78*4882a593Smuzhiyun 			     size_t size);
79*4882a593Smuzhiyun int bpf__apply_obj_config(void);
80*4882a593Smuzhiyun int bpf__strerror_apply_obj_config(int err, char *buf, size_t size);
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun int bpf__setup_stdout(struct evlist *evlist);
83*4882a593Smuzhiyun struct evsel *bpf__setup_output_event(struct evlist *evlist, const char *name);
84*4882a593Smuzhiyun int bpf__strerror_setup_output_event(struct evlist *evlist, int err, char *buf, size_t size);
85*4882a593Smuzhiyun #else
86*4882a593Smuzhiyun #include <errno.h>
87*4882a593Smuzhiyun #include <string.h>
88*4882a593Smuzhiyun #include "debug.h"
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun static inline struct bpf_object *
bpf__prepare_load(const char * filename __maybe_unused,bool source __maybe_unused)91*4882a593Smuzhiyun bpf__prepare_load(const char *filename __maybe_unused,
92*4882a593Smuzhiyun 		  bool source __maybe_unused)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	pr_debug("ERROR: eBPF object loading is disabled during compiling.\n");
95*4882a593Smuzhiyun 	return ERR_PTR(-ENOTSUP);
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun static inline struct bpf_object *
bpf__prepare_load_buffer(void * obj_buf __maybe_unused,size_t obj_buf_sz __maybe_unused)99*4882a593Smuzhiyun bpf__prepare_load_buffer(void *obj_buf __maybe_unused,
100*4882a593Smuzhiyun 					   size_t obj_buf_sz __maybe_unused)
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun 	return ERR_PTR(-ENOTSUP);
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun 
bpf__clear(void)105*4882a593Smuzhiyun static inline void bpf__clear(void) { }
106*4882a593Smuzhiyun 
bpf__probe(struct bpf_object * obj __maybe_unused)107*4882a593Smuzhiyun static inline int bpf__probe(struct bpf_object *obj __maybe_unused) { return 0;}
bpf__unprobe(struct bpf_object * obj __maybe_unused)108*4882a593Smuzhiyun static inline int bpf__unprobe(struct bpf_object *obj __maybe_unused) { return 0;}
bpf__load(struct bpf_object * obj __maybe_unused)109*4882a593Smuzhiyun static inline int bpf__load(struct bpf_object *obj __maybe_unused) { return 0; }
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun static inline int
bpf__foreach_event(struct bpf_object * obj __maybe_unused,bpf_prog_iter_callback_t func __maybe_unused,void * arg __maybe_unused)112*4882a593Smuzhiyun bpf__foreach_event(struct bpf_object *obj __maybe_unused,
113*4882a593Smuzhiyun 		   bpf_prog_iter_callback_t func __maybe_unused,
114*4882a593Smuzhiyun 		   void *arg __maybe_unused)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun 	return 0;
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun static inline int
bpf__config_obj(struct bpf_object * obj __maybe_unused,struct parse_events_term * term __maybe_unused,struct evlist * evlist __maybe_unused,int * error_pos __maybe_unused)120*4882a593Smuzhiyun bpf__config_obj(struct bpf_object *obj __maybe_unused,
121*4882a593Smuzhiyun 		struct parse_events_term *term __maybe_unused,
122*4882a593Smuzhiyun 		struct evlist *evlist __maybe_unused,
123*4882a593Smuzhiyun 		int *error_pos __maybe_unused)
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun 	return 0;
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun static inline int
bpf__apply_obj_config(void)129*4882a593Smuzhiyun bpf__apply_obj_config(void)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun 	return 0;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun static inline int
bpf__setup_stdout(struct evlist * evlist __maybe_unused)135*4882a593Smuzhiyun bpf__setup_stdout(struct evlist *evlist __maybe_unused)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun 	return 0;
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun static inline struct evsel *
bpf__setup_output_event(struct evlist * evlist __maybe_unused,const char * name __maybe_unused)141*4882a593Smuzhiyun bpf__setup_output_event(struct evlist *evlist __maybe_unused, const char *name __maybe_unused)
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun 	return NULL;
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun static inline int
__bpf_strerror(char * buf,size_t size)147*4882a593Smuzhiyun __bpf_strerror(char *buf, size_t size)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun 	if (!size)
150*4882a593Smuzhiyun 		return 0;
151*4882a593Smuzhiyun 	strncpy(buf,
152*4882a593Smuzhiyun 		"ERROR: eBPF object loading is disabled during compiling.\n",
153*4882a593Smuzhiyun 		size);
154*4882a593Smuzhiyun 	buf[size - 1] = '\0';
155*4882a593Smuzhiyun 	return 0;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun static inline
bpf__strerror_prepare_load(const char * filename __maybe_unused,bool source __maybe_unused,int err __maybe_unused,char * buf,size_t size)159*4882a593Smuzhiyun int bpf__strerror_prepare_load(const char *filename __maybe_unused,
160*4882a593Smuzhiyun 			       bool source __maybe_unused,
161*4882a593Smuzhiyun 			       int err __maybe_unused,
162*4882a593Smuzhiyun 			       char *buf, size_t size)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun 	return __bpf_strerror(buf, size);
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun static inline int
bpf__strerror_probe(struct bpf_object * obj __maybe_unused,int err __maybe_unused,char * buf,size_t size)168*4882a593Smuzhiyun bpf__strerror_probe(struct bpf_object *obj __maybe_unused,
169*4882a593Smuzhiyun 		    int err __maybe_unused,
170*4882a593Smuzhiyun 		    char *buf, size_t size)
171*4882a593Smuzhiyun {
172*4882a593Smuzhiyun 	return __bpf_strerror(buf, size);
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun 
bpf__strerror_load(struct bpf_object * obj __maybe_unused,int err __maybe_unused,char * buf,size_t size)175*4882a593Smuzhiyun static inline int bpf__strerror_load(struct bpf_object *obj __maybe_unused,
176*4882a593Smuzhiyun 				     int err __maybe_unused,
177*4882a593Smuzhiyun 				     char *buf, size_t size)
178*4882a593Smuzhiyun {
179*4882a593Smuzhiyun 	return __bpf_strerror(buf, size);
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun static inline int
bpf__strerror_config_obj(struct bpf_object * obj __maybe_unused,struct parse_events_term * term __maybe_unused,struct evlist * evlist __maybe_unused,int * error_pos __maybe_unused,int err __maybe_unused,char * buf,size_t size)183*4882a593Smuzhiyun bpf__strerror_config_obj(struct bpf_object *obj __maybe_unused,
184*4882a593Smuzhiyun 			 struct parse_events_term *term __maybe_unused,
185*4882a593Smuzhiyun 			 struct evlist *evlist __maybe_unused,
186*4882a593Smuzhiyun 			 int *error_pos __maybe_unused,
187*4882a593Smuzhiyun 			 int err __maybe_unused,
188*4882a593Smuzhiyun 			 char *buf, size_t size)
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun 	return __bpf_strerror(buf, size);
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun static inline int
bpf__strerror_apply_obj_config(int err __maybe_unused,char * buf,size_t size)194*4882a593Smuzhiyun bpf__strerror_apply_obj_config(int err __maybe_unused,
195*4882a593Smuzhiyun 			       char *buf, size_t size)
196*4882a593Smuzhiyun {
197*4882a593Smuzhiyun 	return __bpf_strerror(buf, size);
198*4882a593Smuzhiyun }
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun static inline int
bpf__strerror_setup_output_event(struct evlist * evlist __maybe_unused,int err __maybe_unused,char * buf,size_t size)201*4882a593Smuzhiyun bpf__strerror_setup_output_event(struct evlist *evlist __maybe_unused,
202*4882a593Smuzhiyun 				 int err __maybe_unused, char *buf, size_t size)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun 	return __bpf_strerror(buf, size);
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun #endif
208*4882a593Smuzhiyun 
bpf__strerror_setup_stdout(struct evlist * evlist,int err,char * buf,size_t size)209*4882a593Smuzhiyun static inline int bpf__strerror_setup_stdout(struct evlist *evlist, int err, char *buf, size_t size)
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun 	return bpf__strerror_setup_output_event(evlist, err, buf, size);
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun #endif
214