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