OSDev Wiki
Advertisement

Команда SG (secure gateway – шлюз безопасности) предназначена для организации переходов из небезопасного режима выполнения в безопасный режим.

Кодирование команды[]

SG{.W}

Thumb[]

T1[]

ARM SG Instruction, T1



Требования к версиям и режимам[]

Команда SG появилась в версии ARMv8-M и используется при наличии расширения безопасности. Если последнее не реализовано, она трактуется как NOP.

Версия ARMv8.1-M добавила возможность проверки допустимости точки входа (например, для защиты от повторного входа).

Выполняемые действия[]

Команда SG является безусловно выполняемой, даже если располагается внутри IT-блока. ARM не рекомендует, однако, размещать её в IT-блоке.

Если команда расположена в небезопасном регионе памяти, она выполняется как NOP.

Если команда расположена в безопасном регионе, а текущий режим работы – небезопасный, то:

  • выполняется чтение слова из памяти по адресу, находящемуся в используемом потоком безопасного режима указателе стека (т. е. в MSP_S, если бит CONTROL_S.SPSEL сброшен, и в PSP_S, если указанный бит установлен). Доступ к слову выполняется от имени безопасного режима с режимом привилегированности, заданным битом CONTROL_S.nPRIV. Если при выборке возникнет прерывание, выполнение команды прекращается и управление передаётся соответствующему обработчику;
  • если бит CCR_S.TRD установлен и либо поток безопасного режима использует основной стек, либо 31 старший разряд выбранного слова равен 31 старшему биту значения FEFA125A, выполнение команды прекращается и возникает прерывание SecureFault по недопустимой точке входа (устанавливается бит SFSR.INVEP);
  • младший бит регистра LR сбрасывается (для обеспечения последующего возврата из безопасного состояния в небезопасное);
  • если имеется FPU или векторное расширение, бит CONTROL_S.SFPA сбрасывается, т. е. состояние FPU для безопасного режима отмечается как неактивное (безопасный код ещё не использовал FPU в текущем периоде выполнения);
  • если имеется LOB, информация LOB очищается во избежание влияния небезопасного кода на выполнение безопасного кода;
  • устанавливается безопасный режим;

После этого, независимо от того, выполняется ли команда в небезопасном или в безопасном режиме, производится обнуление поля ICI/IT/ECI регистра EPSR во избежание влияния небезопасного кода на безопасный.

Как следствие, после успешного завершения выполнения команды SG процессор перейдёт в безопасный режим, и следующая за ней команда будет выполняться уже в безопасном режиме.

Advertisement