Spec-Zone.ru › GCC 14

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 = 4
FIELD_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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API