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