root/tools/lib/bpf/btf.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. btf_kind
  2. btf_vlen
  3. btf_kflag
  4. btf_is_int
  5. btf_is_ptr
  6. btf_is_array
  7. btf_is_struct
  8. btf_is_union
  9. btf_is_composite
  10. btf_is_enum
  11. btf_is_fwd
  12. btf_is_typedef
  13. btf_is_volatile
  14. btf_is_const
  15. btf_is_restrict
  16. btf_is_mod
  17. btf_is_func
  18. btf_is_func_proto
  19. btf_is_var
  20. btf_is_datasec
  21. btf_int_encoding
  22. btf_int_offset
  23. btf_int_bits
  24. btf_members
  25. btf_member_bit_offset
  26. btf_member_bitfield_size
  27. btf_params
  28. btf_var_secinfos

   1 /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
   2 /* Copyright (c) 2018 Facebook */
   3 
   4 #ifndef __LIBBPF_BTF_H
   5 #define __LIBBPF_BTF_H
   6 
   7 #include <stdarg.h>
   8 #include <linux/btf.h>
   9 #include <linux/types.h>
  10 
  11 #ifdef __cplusplus
  12 extern "C" {
  13 #endif
  14 
  15 #ifndef LIBBPF_API
  16 #define LIBBPF_API __attribute__((visibility("default")))
  17 #endif
  18 
  19 #define BTF_ELF_SEC ".BTF"
  20 #define BTF_EXT_ELF_SEC ".BTF.ext"
  21 #define MAPS_ELF_SEC ".maps"
  22 
  23 struct btf;
  24 struct btf_ext;
  25 struct btf_type;
  26 
  27 struct bpf_object;
  28 
  29 /*
  30  * The .BTF.ext ELF section layout defined as
  31  *   struct btf_ext_header
  32  *   func_info subsection
  33  *
  34  * The func_info subsection layout:
  35  *   record size for struct bpf_func_info in the func_info subsection
  36  *   struct btf_sec_func_info for section #1
  37  *   a list of bpf_func_info records for section #1
  38  *     where struct bpf_func_info mimics one in include/uapi/linux/bpf.h
  39  *     but may not be identical
  40  *   struct btf_sec_func_info for section #2
  41  *   a list of bpf_func_info records for section #2
  42  *   ......
  43  *
  44  * Note that the bpf_func_info record size in .BTF.ext may not
  45  * be the same as the one defined in include/uapi/linux/bpf.h.
  46  * The loader should ensure that record_size meets minimum
  47  * requirement and pass the record as is to the kernel. The
  48  * kernel will handle the func_info properly based on its contents.
  49  */
  50 struct btf_ext_header {
  51         __u16   magic;
  52         __u8    version;
  53         __u8    flags;
  54         __u32   hdr_len;
  55 
  56         /* All offsets are in bytes relative to the end of this header */
  57         __u32   func_info_off;
  58         __u32   func_info_len;
  59         __u32   line_info_off;
  60         __u32   line_info_len;
  61 
  62         /* optional part of .BTF.ext header */
  63         __u32   offset_reloc_off;
  64         __u32   offset_reloc_len;
  65 };
  66 
  67 LIBBPF_API void btf__free(struct btf *btf);
  68 LIBBPF_API struct btf *btf__new(__u8 *data, __u32 size);
  69 LIBBPF_API struct btf *btf__parse_elf(const char *path,
  70                                       struct btf_ext **btf_ext);
  71 LIBBPF_API int btf__finalize_data(struct bpf_object *obj, struct btf *btf);
  72 LIBBPF_API int btf__load(struct btf *btf);
  73 LIBBPF_API __s32 btf__find_by_name(const struct btf *btf,
  74                                    const char *type_name);
  75 LIBBPF_API __u32 btf__get_nr_types(const struct btf *btf);
  76 LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf,
  77                                                   __u32 id);
  78 LIBBPF_API __s64 btf__resolve_size(const struct btf *btf, __u32 type_id);
  79 LIBBPF_API int btf__resolve_type(const struct btf *btf, __u32 type_id);
  80 LIBBPF_API int btf__fd(const struct btf *btf);
  81 LIBBPF_API const void *btf__get_raw_data(const struct btf *btf, __u32 *size);
  82 LIBBPF_API const char *btf__name_by_offset(const struct btf *btf, __u32 offset);
  83 LIBBPF_API int btf__get_from_id(__u32 id, struct btf **btf);
  84 LIBBPF_API int btf__get_map_kv_tids(const struct btf *btf, const char *map_name,
  85                                     __u32 expected_key_size,
  86                                     __u32 expected_value_size,
  87                                     __u32 *key_type_id, __u32 *value_type_id);
  88 
  89 LIBBPF_API struct btf_ext *btf_ext__new(__u8 *data, __u32 size);
  90 LIBBPF_API void btf_ext__free(struct btf_ext *btf_ext);
  91 LIBBPF_API const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext,
  92                                              __u32 *size);
  93 LIBBPF_API int btf_ext__reloc_func_info(const struct btf *btf,
  94                                         const struct btf_ext *btf_ext,
  95                                         const char *sec_name, __u32 insns_cnt,
  96                                         void **func_info, __u32 *cnt);
  97 LIBBPF_API int btf_ext__reloc_line_info(const struct btf *btf,
  98                                         const struct btf_ext *btf_ext,
  99                                         const char *sec_name, __u32 insns_cnt,
 100                                         void **line_info, __u32 *cnt);
 101 LIBBPF_API __u32 btf_ext__func_info_rec_size(const struct btf_ext *btf_ext);
 102 LIBBPF_API __u32 btf_ext__line_info_rec_size(const struct btf_ext *btf_ext);
 103 
 104 struct btf_dedup_opts {
 105         unsigned int dedup_table_size;
 106         bool dont_resolve_fwds;
 107 };
 108 
 109 LIBBPF_API int btf__dedup(struct btf *btf, struct btf_ext *btf_ext,
 110                           const struct btf_dedup_opts *opts);
 111 
 112 struct btf_dump;
 113 
 114 struct btf_dump_opts {
 115         void *ctx;
 116 };
 117 
 118 typedef void (*btf_dump_printf_fn_t)(void *ctx, const char *fmt, va_list args);
 119 
 120 LIBBPF_API struct btf_dump *btf_dump__new(const struct btf *btf,
 121                                           const struct btf_ext *btf_ext,
 122                                           const struct btf_dump_opts *opts,
 123                                           btf_dump_printf_fn_t printf_fn);
 124 LIBBPF_API void btf_dump__free(struct btf_dump *d);
 125 
 126 LIBBPF_API int btf_dump__dump_type(struct btf_dump *d, __u32 id);
 127 
 128 /*
 129  * A set of helpers for easier BTF types handling
 130  */
 131 static inline __u16 btf_kind(const struct btf_type *t)
 132 {
 133         return BTF_INFO_KIND(t->info);
 134 }
 135 
 136 static inline __u16 btf_vlen(const struct btf_type *t)
 137 {
 138         return BTF_INFO_VLEN(t->info);
 139 }
 140 
 141 static inline bool btf_kflag(const struct btf_type *t)
 142 {
 143         return BTF_INFO_KFLAG(t->info);
 144 }
 145 
 146 static inline bool btf_is_int(const struct btf_type *t)
 147 {
 148         return btf_kind(t) == BTF_KIND_INT;
 149 }
 150 
 151 static inline bool btf_is_ptr(const struct btf_type *t)
 152 {
 153         return btf_kind(t) == BTF_KIND_PTR;
 154 }
 155 
 156 static inline bool btf_is_array(const struct btf_type *t)
 157 {
 158         return btf_kind(t) == BTF_KIND_ARRAY;
 159 }
 160 
 161 static inline bool btf_is_struct(const struct btf_type *t)
 162 {
 163         return btf_kind(t) == BTF_KIND_STRUCT;
 164 }
 165 
 166 static inline bool btf_is_union(const struct btf_type *t)
 167 {
 168         return btf_kind(t) == BTF_KIND_UNION;
 169 }
 170 
 171 static inline bool btf_is_composite(const struct btf_type *t)
 172 {
 173         __u16 kind = btf_kind(t);
 174 
 175         return kind == BTF_KIND_STRUCT || kind == BTF_KIND_UNION;
 176 }
 177 
 178 static inline bool btf_is_enum(const struct btf_type *t)
 179 {
 180         return btf_kind(t) == BTF_KIND_ENUM;
 181 }
 182 
 183 static inline bool btf_is_fwd(const struct btf_type *t)
 184 {
 185         return btf_kind(t) == BTF_KIND_FWD;
 186 }
 187 
 188 static inline bool btf_is_typedef(const struct btf_type *t)
 189 {
 190         return btf_kind(t) == BTF_KIND_TYPEDEF;
 191 }
 192 
 193 static inline bool btf_is_volatile(const struct btf_type *t)
 194 {
 195         return btf_kind(t) == BTF_KIND_VOLATILE;
 196 }
 197 
 198 static inline bool btf_is_const(const struct btf_type *t)
 199 {
 200         return btf_kind(t) == BTF_KIND_CONST;
 201 }
 202 
 203 static inline bool btf_is_restrict(const struct btf_type *t)
 204 {
 205         return btf_kind(t) == BTF_KIND_RESTRICT;
 206 }
 207 
 208 static inline bool btf_is_mod(const struct btf_type *t)
 209 {
 210         __u16 kind = btf_kind(t);
 211 
 212         return kind == BTF_KIND_VOLATILE ||
 213                kind == BTF_KIND_CONST ||
 214                kind == BTF_KIND_RESTRICT;
 215 }
 216 
 217 static inline bool btf_is_func(const struct btf_type *t)
 218 {
 219         return btf_kind(t) == BTF_KIND_FUNC;
 220 }
 221 
 222 static inline bool btf_is_func_proto(const struct btf_type *t)
 223 {
 224         return btf_kind(t) == BTF_KIND_FUNC_PROTO;
 225 }
 226 
 227 static inline bool btf_is_var(const struct btf_type *t)
 228 {
 229         return btf_kind(t) == BTF_KIND_VAR;
 230 }
 231 
 232 static inline bool btf_is_datasec(const struct btf_type *t)
 233 {
 234         return btf_kind(t) == BTF_KIND_DATASEC;
 235 }
 236 
 237 static inline __u8 btf_int_encoding(const struct btf_type *t)
 238 {
 239         return BTF_INT_ENCODING(*(__u32 *)(t + 1));
 240 }
 241 
 242 static inline __u8 btf_int_offset(const struct btf_type *t)
 243 {
 244         return BTF_INT_OFFSET(*(__u32 *)(t + 1));
 245 }
 246 
 247 static inline __u8 btf_int_bits(const struct btf_type *t)
 248 {
 249         return BTF_INT_BITS(*(__u32 *)(t + 1));
 250 }
 251 
 252 static inline struct btf_array *btf_array(const struct btf_type *t)
 253 {
 254         return (struct btf_array *)(t + 1);
 255 }
 256 
 257 static inline struct btf_enum *btf_enum(const struct btf_type *t)
 258 {
 259         return (struct btf_enum *)(t + 1);
 260 }
 261 
 262 static inline struct btf_member *btf_members(const struct btf_type *t)
 263 {
 264         return (struct btf_member *)(t + 1);
 265 }
 266 
 267 /* Get bit offset of a member with specified index. */
 268 static inline __u32 btf_member_bit_offset(const struct btf_type *t,
 269                                           __u32 member_idx)
 270 {
 271         const struct btf_member *m = btf_members(t) + member_idx;
 272         bool kflag = btf_kflag(t);
 273 
 274         return kflag ? BTF_MEMBER_BIT_OFFSET(m->offset) : m->offset;
 275 }
 276 /*
 277  * Get bitfield size of a member, assuming t is BTF_KIND_STRUCT or
 278  * BTF_KIND_UNION. If member is not a bitfield, zero is returned.
 279  */
 280 static inline __u32 btf_member_bitfield_size(const struct btf_type *t,
 281                                              __u32 member_idx)
 282 {
 283         const struct btf_member *m = btf_members(t) + member_idx;
 284         bool kflag = btf_kflag(t);
 285 
 286         return kflag ? BTF_MEMBER_BITFIELD_SIZE(m->offset) : 0;
 287 }
 288 
 289 static inline struct btf_param *btf_params(const struct btf_type *t)
 290 {
 291         return (struct btf_param *)(t + 1);
 292 }
 293 
 294 static inline struct btf_var *btf_var(const struct btf_type *t)
 295 {
 296         return (struct btf_var *)(t + 1);
 297 }
 298 
 299 static inline struct btf_var_secinfo *
 300 btf_var_secinfos(const struct btf_type *t)
 301 {
 302         return (struct btf_var_secinfo *)(t + 1);
 303 }
 304 
 305 #ifdef __cplusplus
 306 } /* extern "C" */
 307 #endif
 308 
 309 #endif /* __LIBBPF_BTF_H */

/* [<][>][^][v][top][bottom][index][help] */