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