Команда SG (secure gateway – шлюз безопасности) предназначена для организации переходов из небезопасного режима выполнения в безопасный режим.
Кодирование команды[]
SG{.W}
Thumb[]
T1[]
Требования к версиям и режимам[]
Команда SG появилась в версии ARMv8-M и используется при наличии расширения безопасности. Если последнее не реализовано, она трактуется как NOP.
Версия ARMv8.1-M добавила возможность проверки допустимости точки входа (например, для защиты от повторного входа).
Выполняемые действия[]
Команда SG является безусловно выполняемой, даже если располагается внутри IT-блока. ARM не рекомендует, однако, размещать её в IT-блоке.
Если команда расположена в небезопасном регионе памяти, она выполняется как NOP.
Если команда расположена в безопасном регионе, а текущий режим работы – небезопасный, то:
- В версии ARMv8.1-M, если команда выполняется в режиме потока:
- выполняется чтение слова из памяти по адресу, находящемуся в используемом потоком безопасного режима указателе стека (т. е. в MSP_S, если бит CONTROL_S.SPSEL сброшен, и в PSP_S, если указанный бит установлен). Доступ к слову выполняется от имени безопасного режима с режимом привилегированности, заданным битом CONTROL_S.nPRIV. Если при выборке возникнет прерывание, выполнение команды прекращается и управление передаётся соответствующему обработчику;
- младший бит регистра LR сбрасывается (для обеспечения последующего возврата из безопасного состояния в небезопасное);
- если имеется FPU или векторное расширение, бит CONTROL_S.SFPA сбрасывается, т. е. состояние FPU для безопасного режима отмечается как неактивное (безопасный код ещё не использовал FPU в текущем периоде выполнения);
- если имеется LOB, информация LOB очищается во избежание влияния небезопасного кода на выполнение безопасного кода;
- устанавливается безопасный режим;
После этого, независимо от того, выполняется ли команда в небезопасном или в безопасном режиме, производится обнуление поля ICI/IT/ECI регистра EPSR во избежание влияния небезопасного кода на безопасный.
Как следствие, после успешного завершения выполнения команды SG процессор перейдёт в безопасный режим, и следующая за ней команда будет выполняться уже в безопасном режиме.