linux/tools/lib/bpf/bpf_helpers.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
   2#ifndef __BPF_HELPERS__
   3#define __BPF_HELPERS__
   4
   5/*
   6 * Note that bpf programs need to include either
   7 * vmlinux.h (auto-generated from BTF) or linux/types.h
   8 * in advance since bpf_helper_defs.h uses such types
   9 * as __u64.
  10 */
  11#include "bpf_helper_defs.h"
  12
  13#define __uint(name, val) int (*name)[val]
  14#define __type(name, val) typeof(val) *name
  15#define __array(name, val) typeof(val) *name[]
  16
  17/* Helper macro to print out debug messages */
  18#define bpf_printk(fmt, ...)                            \
  19({                                                      \
  20        char ____fmt[] = fmt;                           \
  21        bpf_trace_printk(____fmt, sizeof(____fmt),      \
  22                         ##__VA_ARGS__);                \
  23})
  24
  25/*
  26 * Helper macro to place programs, maps, license in
  27 * different sections in elf_bpf file. Section names
  28 * are interpreted by libbpf depending on the context (BPF programs, BPF maps,
  29 * extern variables, etc).
  30 * To allow use of SEC() with externs (e.g., for extern .maps declarations),
  31 * make sure __attribute__((unused)) doesn't trigger compilation warning.
  32 */
  33#define SEC(name) \
  34        _Pragma("GCC diagnostic push")                                      \
  35        _Pragma("GCC diagnostic ignored \"-Wignored-attributes\"")          \
  36        __attribute__((section(name), used))                                \
  37        _Pragma("GCC diagnostic pop")                                       \
  38
  39/* Avoid 'linux/stddef.h' definition of '__always_inline'. */
  40#undef __always_inline
  41#define __always_inline inline __attribute__((always_inline))
  42
  43#ifndef __noinline
  44#define __noinline __attribute__((noinline))
  45#endif
  46#ifndef __weak
  47#define __weak __attribute__((weak))
  48#endif
  49
  50/*
  51 * Use __hidden attribute to mark a non-static BPF subprogram effectively
  52 * static for BPF verifier's verification algorithm purposes, allowing more
  53 * extensive and permissive BPF verification process, taking into account
  54 * subprogram's caller context.
  55 */
  56#define __hidden __attribute__((visibility("hidden")))
  57
  58/* When utilizing vmlinux.h with BPF CO-RE, user BPF programs can't include
  59 * any system-level headers (such as stddef.h, linux/version.h, etc), and
  60 * commonly-used macros like NULL and KERNEL_VERSION aren't available through
  61 * vmlinux.h. This just adds unnecessary hurdles and forces users to re-define
  62 * them on their own. So as a convenience, provide such definitions here.
  63 */
  64#ifndef NULL
  65#define NULL ((void *)0)
  66#endif
  67
  68#ifndef KERNEL_VERSION
  69#define KERNEL_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c)))
  70#endif
  71
  72/*
  73 * Helper macros to manipulate data structures
  74 */
  75#ifndef offsetof
  76#define offsetof(TYPE, MEMBER)  ((unsigned long)&((TYPE *)0)->MEMBER)
  77#endif
  78#ifndef container_of
  79#define container_of(ptr, type, member)                         \
  80        ({                                                      \
  81                void *__mptr = (void *)(ptr);                   \
  82                ((type *)(__mptr - offsetof(type, member)));    \
  83        })
  84#endif
  85
  86/*
  87 * Helper macro to throw a compilation error if __bpf_unreachable() gets
  88 * built into the resulting code. This works given BPF back end does not
  89 * implement __builtin_trap(). This is useful to assert that certain paths
  90 * of the program code are never used and hence eliminated by the compiler.
  91 *
  92 * For example, consider a switch statement that covers known cases used by
  93 * the program. __bpf_unreachable() can then reside in the default case. If
  94 * the program gets extended such that a case is not covered in the switch
  95 * statement, then it will throw a build error due to the default case not
  96 * being compiled out.
  97 */
  98#ifndef __bpf_unreachable
  99# define __bpf_unreachable()    __builtin_trap()
 100#endif
 101
 102/*
 103 * Helper function to perform a tail call with a constant/immediate map slot.
 104 */
 105#if __clang_major__ >= 8 && defined(__bpf__)
 106static __always_inline void
 107bpf_tail_call_static(void *ctx, const void *map, const __u32 slot)
 108{
 109        if (!__builtin_constant_p(slot))
 110                __bpf_unreachable();
 111
 112        /*
 113         * Provide a hard guarantee that LLVM won't optimize setting r2 (map
 114         * pointer) and r3 (constant map index) from _different paths_ ending
 115         * up at the _same_ call insn as otherwise we won't be able to use the
 116         * jmpq/nopl retpoline-free patching by the x86-64 JIT in the kernel
 117         * given they mismatch. See also d2e4c1e6c294 ("bpf: Constant map key
 118         * tracking for prog array pokes") for details on verifier tracking.
 119         *
 120         * Note on clobber list: we need to stay in-line with BPF calling
 121         * convention, so even if we don't end up using r0, r4, r5, we need
 122         * to mark them as clobber so that LLVM doesn't end up using them
 123         * before / after the call.
 124         */
 125        asm volatile("r1 = %[ctx]\n\t"
 126                     "r2 = %[map]\n\t"
 127                     "r3 = %[slot]\n\t"
 128                     "call 12"
 129                     :: [ctx]"r"(ctx), [map]"r"(map), [slot]"i"(slot)
 130                     : "r0", "r1", "r2", "r3", "r4", "r5");
 131}
 132#endif
 133
 134/*
 135 * Helper structure used by eBPF C program
 136 * to describe BPF map attributes to libbpf loader
 137 */
 138struct bpf_map_def {
 139        unsigned int type;
 140        unsigned int key_size;
 141        unsigned int value_size;
 142        unsigned int max_entries;
 143        unsigned int map_flags;
 144};
 145
 146enum libbpf_pin_type {
 147        LIBBPF_PIN_NONE,
 148        /* PIN_BY_NAME: pin maps by name (in /sys/fs/bpf by default) */
 149        LIBBPF_PIN_BY_NAME,
 150};
 151
 152enum libbpf_tristate {
 153        TRI_NO = 0,
 154        TRI_YES = 1,
 155        TRI_MODULE = 2,
 156};
 157
 158#define __kconfig __attribute__((section(".kconfig")))
 159#define __ksym __attribute__((section(".ksyms")))
 160
 161#ifndef ___bpf_concat
 162#define ___bpf_concat(a, b) a ## b
 163#endif
 164#ifndef ___bpf_apply
 165#define ___bpf_apply(fn, n) ___bpf_concat(fn, n)
 166#endif
 167#ifndef ___bpf_nth
 168#define ___bpf_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, N, ...) N
 169#endif
 170#ifndef ___bpf_narg
 171#define ___bpf_narg(...) \
 172        ___bpf_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
 173#endif
 174
 175#define ___bpf_fill0(arr, p, x) do {} while (0)
 176#define ___bpf_fill1(arr, p, x) arr[p] = x
 177#define ___bpf_fill2(arr, p, x, args...) arr[p] = x; ___bpf_fill1(arr, p + 1, args)
 178#define ___bpf_fill3(arr, p, x, args...) arr[p] = x; ___bpf_fill2(arr, p + 1, args)
 179#define ___bpf_fill4(arr, p, x, args...) arr[p] = x; ___bpf_fill3(arr, p + 1, args)
 180#define ___bpf_fill5(arr, p, x, args...) arr[p] = x; ___bpf_fill4(arr, p + 1, args)
 181#define ___bpf_fill6(arr, p, x, args...) arr[p] = x; ___bpf_fill5(arr, p + 1, args)
 182#define ___bpf_fill7(arr, p, x, args...) arr[p] = x; ___bpf_fill6(arr, p + 1, args)
 183#define ___bpf_fill8(arr, p, x, args...) arr[p] = x; ___bpf_fill7(arr, p + 1, args)
 184#define ___bpf_fill9(arr, p, x, args...) arr[p] = x; ___bpf_fill8(arr, p + 1, args)
 185#define ___bpf_fill10(arr, p, x, args...) arr[p] = x; ___bpf_fill9(arr, p + 1, args)
 186#define ___bpf_fill11(arr, p, x, args...) arr[p] = x; ___bpf_fill10(arr, p + 1, args)
 187#define ___bpf_fill12(arr, p, x, args...) arr[p] = x; ___bpf_fill11(arr, p + 1, args)
 188#define ___bpf_fill(arr, args...) \
 189        ___bpf_apply(___bpf_fill, ___bpf_narg(args))(arr, 0, args)
 190
 191/*
 192 * BPF_SEQ_PRINTF to wrap bpf_seq_printf to-be-printed values
 193 * in a structure.
 194 */
 195#define BPF_SEQ_PRINTF(seq, fmt, args...)                       \
 196({                                                              \
 197        static const char ___fmt[] = fmt;                       \
 198        unsigned long long ___param[___bpf_narg(args)];         \
 199                                                                \
 200        _Pragma("GCC diagnostic push")                          \
 201        _Pragma("GCC diagnostic ignored \"-Wint-conversion\"")  \
 202        ___bpf_fill(___param, args);                            \
 203        _Pragma("GCC diagnostic pop")                           \
 204                                                                \
 205        bpf_seq_printf(seq, ___fmt, sizeof(___fmt),             \
 206                       ___param, sizeof(___param));             \
 207})
 208
 209/*
 210 * BPF_SNPRINTF wraps the bpf_snprintf helper with variadic arguments instead of
 211 * an array of u64.
 212 */
 213#define BPF_SNPRINTF(out, out_size, fmt, args...)               \
 214({                                                              \
 215        static const char ___fmt[] = fmt;                       \
 216        unsigned long long ___param[___bpf_narg(args)];         \
 217                                                                \
 218        _Pragma("GCC diagnostic push")                          \
 219        _Pragma("GCC diagnostic ignored \"-Wint-conversion\"")  \
 220        ___bpf_fill(___param, args);                            \
 221        _Pragma("GCC diagnostic pop")                           \
 222                                                                \
 223        bpf_snprintf(out, out_size, ___fmt,                     \
 224                     ___param, sizeof(___param));               \
 225})
 226
 227#endif
 228