6.62.12 Встроенные функции BPF
Следующие встроенные функции доступны для целей eBPF.
-
Встроенная функция:
unsigned long long__builtin_bpf_load_byte(unsigned long long offset) Загрузка байта из данных пакета, на которые указывает регистр
struct sk_buff, и возврат этого байта.
-
Встроенная функция:
unsigned long long__builtin_bpf_load_half(unsigned long long offset) Загрузка 16 бит из данных пакета, на которые указывает регистр
%r6, и возврат результата.
-
Встроенная функция:
unsigned long long__builtin_bpf_load_word(unsigned long long offset) Загрузка 32 бит из данных пакета, на которые указывает регистр
%r6, и возврат результата.
-
Встроенная функция:
type__builtin_preserve_access_index(type expr) Поддержка BPF Compile Once-Run Everywhere (CO-RE). Инструктирует GCC генерировать CO-RE записи перемещения для всех обращений к агрегатным структурам данных (struct, union, массивы) в expr. Эта встроенная функция в остальном прозрачна; expr может иметь любой тип, и его значение возвращается. Эта встроенная функция не имеет эффекта, если
-mco-reне активна (не указана явно или подразумевается).
-
Встроенная функция:
unsigned int__builtin_preserve_field_info(expr, unsigned int kind) -
Поддержка BPF Compile Once-Run Everywhere (CO-RE). Эта встроенная функция используется для извлечения информации, которая помогает при перемещении структур/объединений. expr — это доступ к полю структуры или объединения. В зависимости от kind возвращается разная информация программе. CO-RE перемещение для доступа в expr с типом kind записывается, если
-mco-reактивна.Следующие значения поддерживаются для kind:
FIELD_BYTE_OFFSET = 0-
Возвращаемое значение — это смещение, в байтах, поля от начала содержащей структуры. Для полей-битов это смещение байта содержащего слова.
FIELD_BYTE_SIZE = 1-
Возвращаемое значение — это размер, в байтах, поля. Для полей-битов это размер, в байтах, содержащего слова.
FIELD_EXISTENCE = 2-
Возвращаемое значение — 1, если поле существует, 0 — в противном случае. Всегда 1 во время компиляции.
FIELD_SIGNEDNESS = 3-
Возвращаемое значение — 1, если поле со знаком, 0 — в противном случае.
FIELD_LSHIFT_U64 = 4FIELD_RSHIFT_U64 = 5-
Возвращаемое значение — количество бит сдвига влево или вправо (соответственно), необходимых для восстановления исходного значения поля после его загрузки считыванием
FIELD_BYTE_SIZEбайтов в 64-битное беззнаковое значение. В основном полезно для чтения значений полей-битов из структур, которые могут меняться между версиями ядра.
Обратите внимание, что возвращаемое значение — это константа, известная во время компиляции. Если у поля есть переменное смещение, то
FIELD_BYTE_OFFSET,FIELD_LSHIFT_U64, иFIELD_RSHIFT_U64не поддерживаются. Аналогично, если у поля есть переменный размер, тоFIELD_BYTE_SIZE,FIELD_LSHIFT_U64, иFIELD_RSHIFT_U64не поддерживаются.Например,
__builtin_preserve_field_infoможно использовать для надёжного извлечения значений полей-битов из структуры, которая может изменяться между версиями ядра:struct S { short a; int x:7; int y:5; }; int read_y (struct S *arg) { unsigned long long val; unsigned int offset = __builtin_preserve_field_info (arg->y, FIELD_BYTE_OFFSET); unsigned int size = __builtin_preserve_field_info (arg->y, FIELD_BYTE_SIZE); /* Read size bytes from arg + offset into val. */ bpf_probe_read (&val, size, arg + offset); val <<= __builtin_preserve_field_info (arg->y, FIELD_LSHIFT_U64); if (__builtin_preserve_field_info (arg->y, FIELD_SIGNEDNESS)) val = ((long long) val >> __builtin_preserve_field_info (arg->y, FIELD_RSHIFT_U64)); else val >>= __builtin_preserve_field_info (arg->y, FIELD_RSHIFT_U64); return val; }
-
Встроенная функция:
unsigned int__builtin_preserve_enum_value(type, enum, unsigned int kind) -
Поддержка BPF Compile Once-Run Everywhere (CO-RE). Эта встроенная функция собирает информацию об enum и создаёт CO-RE перемещение относительно enum, который должен быть типа type. kind определяет выполняемое действие.
Следующие значения поддерживаются для kind:
ENUM_VALUE_EXISTS = 0-
Возвращаемое значение — 0 или 1, в зависимости от того, существует ли значение enum в целевом объекте.
ENUM_VALUE = 1Возвращаемое значение — значение enum в целевом ядре.
-
Встроенная функция:
unsigned int__builtin_btf_type_id(type, unsigned int kind) -
Поддержка BPF Compile Once-Run Everywhere (CO-RE). Эта встроенная функция используется для получения идентификатора типа BTF указанного type. В зависимости от аргумента kind она возвращает ID локальной информации BTF или ID типа BTF в целевом ядре.
Следующие значения поддерживаются для kind:
BTF_TYPE_ID_LOCAL = 0-
Возвращает локальный ID типа BTF. Всегда успешно.
BTF_TYPE_ID_TARGET = 1Возвращает ID типа BTF в целевом объекте. Если type не существует в целевом объекте, возвращает 0.
-
Встроенная функция:
unsigned int__builtin_preserve_type_info(type, unsigned int kind) -
Поддержка BPF Compile Once-Run Everywhere (CO-RE). Эта встроенная функция выполняет проверку типов с именами (struct/union/enum/typedef). Тип проверки зависит от предоставленного аргумента kind. Эта встроенная функция всегда возвращает 0, если type не существует в целевом ядре.
Следующие значения поддерживаются для kind:
BTF_TYPE_EXISTS = 0-
Проверяет, существует ли type в целевом объекте.
BTF_TYPE_MATCHES = 1-
Проверяет, соответствует ли type локальному определению в целевом ядре.
BTF_TYPE_SIZE = 2Возвращает размер type в целевом объекте.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/BPF-Built_002din-Functions.html