Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.17 203 lines 6.3 kB view raw
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 17enum bpf_loader_errno { 18 __BPF_LOADER_ERRNO__START = __LIBBPF_ERRNO__START - 100, 19 /* Invalid config string */ 20 BPF_LOADER_ERRNO__CONFIG = __BPF_LOADER_ERRNO__START, 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 */ 42 BPF_LOADER_ERRNO__OBJCONF_MAP_IDX2BIG, /* Index too large */ 43 __BPF_LOADER_ERRNO__END, 44}; 45 46struct bpf_object; 47struct parse_events_term; 48#define PERF_BPF_PROBE_GROUP "perf_bpf_probe" 49 50typedef int (*bpf_prog_iter_callback_t)(const char *group, const char *event, 51 int fd, void *arg); 52 53#ifdef HAVE_LIBBPF_SUPPORT 54struct bpf_object *bpf__prepare_load(const char *filename, bool source); 55int bpf__strerror_prepare_load(const char *filename, bool source, 56 int err, char *buf, size_t size); 57 58struct bpf_object *bpf__prepare_load_buffer(void *obj_buf, size_t obj_buf_sz, 59 const char *name); 60 61void bpf__clear(void); 62 63int bpf__probe(struct bpf_object *obj); 64int bpf__unprobe(struct bpf_object *obj); 65int bpf__strerror_probe(struct bpf_object *obj, int err, 66 char *buf, size_t size); 67 68int bpf__load(struct bpf_object *obj); 69int bpf__strerror_load(struct bpf_object *obj, int err, 70 char *buf, size_t size); 71int bpf__foreach_event(struct bpf_object *obj, 72 bpf_prog_iter_callback_t func, void *arg); 73 74int bpf__config_obj(struct bpf_object *obj, struct parse_events_term *term, 75 struct perf_evlist *evlist, int *error_pos); 76int 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); 81int bpf__apply_obj_config(void); 82int bpf__strerror_apply_obj_config(int err, char *buf, size_t size); 83 84int bpf__setup_stdout(struct perf_evlist *evlist); 85int bpf__strerror_setup_stdout(struct perf_evlist *evlist, int err, 86 char *buf, size_t size); 87 88#else 89#include <errno.h> 90 91static inline struct bpf_object * 92bpf__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 99static inline struct bpf_object * 100bpf__prepare_load_buffer(void *obj_buf __maybe_unused, 101 size_t obj_buf_sz __maybe_unused) 102{ 103 return ERR_PTR(-ENOTSUP); 104} 105 106static inline void bpf__clear(void) { } 107 108static inline int bpf__probe(struct bpf_object *obj __maybe_unused) { return 0;} 109static inline int bpf__unprobe(struct bpf_object *obj __maybe_unused) { return 0;} 110static inline int bpf__load(struct bpf_object *obj __maybe_unused) { return 0; } 111 112static inline int 113bpf__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 120static inline int 121bpf__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 129static inline int 130bpf__apply_obj_config(void) 131{ 132 return 0; 133} 134 135static inline int 136bpf__setup_stdout(struct perf_evlist *evlist __maybe_unused) 137{ 138 return 0; 139} 140 141static 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 153static inline 154int 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 162static inline int 163bpf__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 170static 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 177static inline int 178bpf__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 188static inline int 189bpf__strerror_apply_obj_config(int err __maybe_unused, 190 char *buf, size_t size) 191{ 192 return __bpf_strerror(buf, size); 193} 194 195static inline int 196bpf__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