Spec-Zone.ru › GCC 15

7.13.40 Встроенные функции защиты потока управления x86

Функция CET: ret_type _get_ssp (void)

Получить текущее значение указателя теневого стека, если в аппаратном обеспечении включена поддержка теневого стека Intel CET, или 0 в противном случае. ret_type равно unsigned long long для 64-разрядных целевых платформ и unsigned int для 32-разрядных целевых платформ.

Функция CET: void _inc_ssp (unsigned int)

Увеличить текущий указатель теневого стека на размер, указанный аргументом функции. По соображениям безопасности аргумент маскируется до значения, помещающегося в байт, поэтому для увеличения более чем на 255 байт необходимо вызвать функцию несколько раз.

Код раскрутки теневого стека выглядит так:

#include <immintrin.h>

/* Unwind the shadow stack for EH.  */
#define _Unwind_Frames_Extra(x)       \
  do                                  \
    {                                \
      _Unwind_Word ssp = _get_ssp (); \
      if (ssp != 0)                   \
        {                            \
          _Unwind_Word tmp = (x);     \
          while (tmp > 255)           \
            {                        \
              _inc_ssp (tmp);         \
              tmp -= 255;             \
            }                        \
          _inc_ssp (tmp);             \
        }                            \
    }                                \
    while (0)

Этот код безусловно выполняется на всех 64-разрядных процессорах. На 32-разрядных процессорах код выполняется на тех из них, которые поддерживают многобайтовые инструкции NOP.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/x86-control_002dflow-protection-intrinsics.html

Spec-Zone.ru

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