7.13.11 Встроенные функции BPF
Для целевых платформ eBPF доступны следующие встроенные функции.
-
Встроенная функция:
unsigned long long__builtin_bpf_load_byte(unsigned long long offset) Загружает байт из данных пакета
struct sk_buff, на которые указывает регистр%r6, и возвращает его.
-
Встроенная функция:
unsigned long long__builtin_bpf_load_half(unsigned long long offset) Загружает 16 бит из данных пакета
struct sk_buff, на которые указывает регистр%r6, и возвращает их.
-
Встроенная функция:
unsigned long long__builtin_bpf_load_word(unsigned long long offset) Загружает 32 бита из данных пакета
struct sk_buff, на которые указывает регистр%r6, и возвращает их.
-
Встроенная функция:
type__builtin_preserve_access_index(type expr) Поддержка BPF Compile Once-Run Everywhere (CO-RE). Указывает GCC создавать записи релокации CO-RE для любого доступа к агрегатным структурам данных (типам struct, union, array) в expr. В остальном эта встроенная функция прозрачна: expr может иметь любой тип, и возвращается его значение. Эта встроенная функция не действует, если
-mco-reне активен (не указан явно и не подразумевается).
-
Встроенная функция:
unsigned int__builtin_preserve_field_info(expr, unsigned int kind) -
Поддержка BPF Compile Once-Run Everywhere (CO-RE). Эта встроенная функция используется для получения сведений, необходимых для релокаций struct/union. expr — это обращение к полю структуры struct или union. В зависимости от kind программа получает различные сведения. Если активен
-mco-re, для обращения в expr записывается релокация CO-RE с типом kind.Для 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). Эта встроенная функция собирает сведения о перечислении и создает релокацию CO-RE относительно enum, который должен иметь тип type. Параметр kind задает выполняемое действие.
Для kind поддерживаются следующие значения:
ENUM_VALUE_EXISTS = 0-
Возвращаемое значение равно 0 или 1 в зависимости от того, существует ли значение перечисления в целевой системе.
ENUM_VALUE = 1Возвращаемое значение — значение перечисления в целевом ядре.
-
Встроенная функция:
unsigned int__builtin_btf_type_id(type, unsigned int kind) -
Поддержка BPF Compile Once-Run Everywhere (CO-RE). Эта встроенная функция используется для получения идентификатора типа BTF для заданного type. В зависимости от аргумента kind она возвращает либо идентификатор локальной информации BTF, либо идентификатор типа BTF в целевом ядре.
Для kind поддерживаются следующие значения:
BTF_TYPE_ID_LOCAL = 0-
Возвращает локальный идентификатор типа BTF. Всегда завершается успешно.
BTF_TYPE_ID_TARGET = 1Возвращает целевой идентификатор типа 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. Если type не существует в целевом ядре, функция всегда возвращает 0.
Для 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-15.3.0/gcc/BPF-Built_002din-Functions.html