Spec-Zone.ru › GCC 15

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 = 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). Эта встроенная функция собирает сведения о перечислении и создает релокацию 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

Spec-Zone.ru

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