Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  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 "evlist.h"
 14#include "debug.h"
 15
 16enum bpf_loader_errno {
 17	__BPF_LOADER_ERRNO__START = __LIBBPF_ERRNO__START - 100,
 18	/* Invalid config string */
 19	BPF_LOADER_ERRNO__CONFIG = __BPF_LOADER_ERRNO__START,
 20	BPF_LOADER_ERRNO__GROUP,	/* Invalid group name */
 21	BPF_LOADER_ERRNO__EVENTNAME,	/* Event name is missing */
 22	BPF_LOADER_ERRNO__INTERNAL,	/* BPF loader internal error */
 23	BPF_LOADER_ERRNO__COMPILE,	/* Error when compiling BPF scriptlet */
 24	BPF_LOADER_ERRNO__PROGCONF_TERM,/* Invalid program config term in config string */
 25	BPF_LOADER_ERRNO__PROLOGUE,	/* Failed to generate prologue */
 26	BPF_LOADER_ERRNO__PROLOGUE2BIG,	/* Prologue too big for program */
 27	BPF_LOADER_ERRNO__PROLOGUEOOB,	/* Offset out of bound for prologue */
 28	BPF_LOADER_ERRNO__OBJCONF_OPT,	/* Invalid object config option */
 29	BPF_LOADER_ERRNO__OBJCONF_CONF,	/* Config value not set (lost '=')) */
 30	BPF_LOADER_ERRNO__OBJCONF_MAP_OPT,	/* Invalid object map config option */
 31	BPF_LOADER_ERRNO__OBJCONF_MAP_NOTEXIST,	/* Target map not exist */
 32	BPF_LOADER_ERRNO__OBJCONF_MAP_VALUE,	/* Incorrect value type for map */
 33	BPF_LOADER_ERRNO__OBJCONF_MAP_TYPE,	/* Incorrect map type */
 34	BPF_LOADER_ERRNO__OBJCONF_MAP_KEYSIZE,	/* Incorrect map key size */
 35	BPF_LOADER_ERRNO__OBJCONF_MAP_VALUESIZE,/* Incorrect map value size */
 36	BPF_LOADER_ERRNO__OBJCONF_MAP_NOEVT,	/* Event not found for map setting */
 37	BPF_LOADER_ERRNO__OBJCONF_MAP_MAPSIZE,	/* Invalid map size for event setting */
 38	BPF_LOADER_ERRNO__OBJCONF_MAP_EVTDIM,	/* Event dimension too large */
 39	BPF_LOADER_ERRNO__OBJCONF_MAP_EVTINH,	/* Doesn't support inherit event */
 40	BPF_LOADER_ERRNO__OBJCONF_MAP_EVTTYPE,	/* Wrong event type for map */
 41	BPF_LOADER_ERRNO__OBJCONF_MAP_IDX2BIG,	/* Index too large */
 42	__BPF_LOADER_ERRNO__END,
 43};
 44
 45struct bpf_object;
 46struct parse_events_term;
 47#define PERF_BPF_PROBE_GROUP "perf_bpf_probe"
 48
 49typedef int (*bpf_prog_iter_callback_t)(struct probe_trace_event *tev,
 50					int fd, void *arg);
 51
 52#ifdef HAVE_LIBBPF_SUPPORT
 53struct bpf_object *bpf__prepare_load(const char *filename, bool source);
 54int bpf__strerror_prepare_load(const char *filename, bool source,
 55			       int err, char *buf, size_t size);
 56
 57struct bpf_object *bpf__prepare_load_buffer(void *obj_buf, size_t obj_buf_sz,
 58					    const char *name);
 59
 60void bpf__clear(void);
 61
 62int bpf__probe(struct bpf_object *obj);
 63int bpf__unprobe(struct bpf_object *obj);
 64int bpf__strerror_probe(struct bpf_object *obj, int err,
 65			char *buf, size_t size);
 66
 67int bpf__load(struct bpf_object *obj);
 68int bpf__strerror_load(struct bpf_object *obj, int err,
 69		       char *buf, size_t size);
 70int bpf__foreach_tev(struct bpf_object *obj,
 71		     bpf_prog_iter_callback_t func, void *arg);
 72
 73int bpf__config_obj(struct bpf_object *obj, struct parse_events_term *term,
 74		    struct perf_evlist *evlist, int *error_pos);
 75int bpf__strerror_config_obj(struct bpf_object *obj,
 76			     struct parse_events_term *term,
 77			     struct perf_evlist *evlist,
 78			     int *error_pos, int err, char *buf,
 79			     size_t size);
 80int bpf__apply_obj_config(void);
 81int bpf__strerror_apply_obj_config(int err, char *buf, size_t size);
 82#else
 83static inline struct bpf_object *
 84bpf__prepare_load(const char *filename __maybe_unused,
 85		  bool source __maybe_unused)
 86{
 87	pr_debug("ERROR: eBPF object loading is disabled during compiling.\n");
 88	return ERR_PTR(-ENOTSUP);
 89}
 90
 91static inline struct bpf_object *
 92bpf__prepare_load_buffer(void *obj_buf __maybe_unused,
 93					   size_t obj_buf_sz __maybe_unused)
 94{
 95	return ERR_PTR(-ENOTSUP);
 96}
 97
 98static inline void bpf__clear(void) { }
 99
100static inline int bpf__probe(struct bpf_object *obj __maybe_unused) { return 0;}
101static inline int bpf__unprobe(struct bpf_object *obj __maybe_unused) { return 0;}
102static inline int bpf__load(struct bpf_object *obj __maybe_unused) { return 0; }
103
104static inline int
105bpf__foreach_tev(struct bpf_object *obj __maybe_unused,
106		 bpf_prog_iter_callback_t func __maybe_unused,
107		 void *arg __maybe_unused)
108{
109	return 0;
110}
111
112static inline int
113bpf__config_obj(struct bpf_object *obj __maybe_unused,
114		struct parse_events_term *term __maybe_unused,
115		struct perf_evlist *evlist __maybe_unused,
116		int *error_pos __maybe_unused)
117{
118	return 0;
119}
120
121static inline int
122bpf__apply_obj_config(void)
123{
124	return 0;
125}
126
127static inline int
128__bpf_strerror(char *buf, size_t size)
129{
130	if (!size)
131		return 0;
132	strncpy(buf,
133		"ERROR: eBPF object loading is disabled during compiling.\n",
134		size);
135	buf[size - 1] = '\0';
136	return 0;
137}
138
139static inline
140int bpf__strerror_prepare_load(const char *filename __maybe_unused,
141			       bool source __maybe_unused,
142			       int err __maybe_unused,
143			       char *buf, size_t size)
144{
145	return __bpf_strerror(buf, size);
146}
147
148static inline int
149bpf__strerror_probe(struct bpf_object *obj __maybe_unused,
150		    int err __maybe_unused,
151		    char *buf, size_t size)
152{
153	return __bpf_strerror(buf, size);
154}
155
156static inline int bpf__strerror_load(struct bpf_object *obj __maybe_unused,
157				     int err __maybe_unused,
158				     char *buf, size_t size)
159{
160	return __bpf_strerror(buf, size);
161}
162
163static inline int
164bpf__strerror_config_obj(struct bpf_object *obj __maybe_unused,
165			 struct parse_events_term *term __maybe_unused,
166			 struct perf_evlist *evlist __maybe_unused,
167			 int *error_pos __maybe_unused,
168			 int err __maybe_unused,
169			 char *buf, size_t size)
170{
171	return __bpf_strerror(buf, size);
172}
173
174static inline int
175bpf__strerror_apply_obj_config(int err __maybe_unused,
176			       char *buf, size_t size)
177{
178	return __bpf_strerror(buf, size);
179}
180#endif
181#endif