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