Spec-Zone.ru › GCC 12

6.60.38 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-12.2.0/gcc/x86-control-flow-protection-intrinsics.html

Spec-Zone.ru

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