6.60.12 Функции 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, и возврат их.
-
Встроенная функция:
void *__builtin_preserve_access_index(expr) Поддержка BPF Compile Once-Run Everywhere (CO-RE). Инструктирует GCC генерировать записи перемещения CO-RE для любых обращений к агрегатным структурам данных (struct, union, типы массивов) в expr. Эта встроенная функция в противном случае прозрачна, возвращаемое значение — то, что возвращает expr. Она также перегружена: expr может быть любого типа (не обязательно указатель), тип возвращаемого значения — тот же. Не оказывает никакого эффекта, если
-mco-reне активна (не указана явно или подразумевается).
-
Встроенная функция:
unsigned int__builtin_preserve_field_info(expr, unsigned int kind) -
Поддержка BPF Compile Once-Run Everywhere (CO-RE). Эта встроенная функция используется для извлечения информации, которая помогает в перемещениях struct/union. 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; }
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/BPF-Built_002din-Functions.html