Spec-Zone.ru › GCC 13

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 = 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;
}

© 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

Spec-Zone.ru

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