ФЭНДОМ


Общие сведения

Системная архитектура процессоров M-профиля кардинально отличается от таковой в профилях A и R. В частности, формат регистров состояния программы (PSR) во всех трёх профилях совпадает лишь в части, доступной непривилегированному коду.

В отличие от профилей A и R, где большая часть функций управления процессором возложена на регистры сопроцессора CP15, формально не являющегося частью центрального процессора (и вообще отсутствующего у некоторых старых процессорных ядер, например, ARM7TDMI архитектуры ARMv4T), в М-профиле самые важные функции управления возложены на несколько регистров, входящих в состав процессорного ядра и доступных с помощью команд MRS и MSR, а все остальные — на довольно многочисленный набор регистров, отображённых на память по строго определённым адресам и доступных с помощью обычных команд загрузки и сохранения данных. В этом разделе описываются регистры, непосредственно входящие в состав ядра; описания прочих регистров можно найти в разделе «Пространство управления системой в M-профиле» и его подразделах.

Регистры состояния

Документация фирмы ARM делит единый регистр состояния на три части: регистр состояния приложения APSR (application program status register), регистр состояния прерывания IPSR (interrupt program status register) и регистр состояния выполнения программы EPSR (execution program status register). Их формат для архитектуры ARMv8-M приведён на рисунке ниже; отличия для более ранних версий будут описаны далее.

ARM M profile PSR

Формат регистров состояния для M-профиля

Регистр APSR содержит биты, которые могут явным образом изменяться непривилегированными программами с помощью команды MSR, а также считываться командой MRS. Назначение этих разрядов будет описано ниже. Биты GE[3:0] реализованы лишь в процессорах, имеющих расширение DSP. Бит Q отсутствует в версии ARMv6-M, а также в версии ARMv8-M без основного расширения.

Регистр IPSR состоит из единственного поля, занимающего разряды 8–0 (фактически оно может иметь меньшее число битов, что зависит от количества различных векторов прерываний, поддерживаемых в конкретной реализации). В режиме потока там всегда находится нуль, а в режиме обработчика — номер (вектор) текущего обрабатываемого прерывания. Если процессор имеет расширение безопасности, то при вызове небезопасной функции из безопасного обработчика в этом поле будет содержаться единица, что не позволит небезопасному коду определить, обработчик какого прерывания в данный момент фактически выполняется.

Привилегированный код может прочитать значение IPSR командой MRS, однако запись в него игнорируется. Документация на ARMv8-M указывает, что значение IPSR может быть изменено через отладочный регистр DCRDR, при этом оно становится неизвестным, однако технически допустимым для данной реализации.

Регистр EPSR включает бит T и поле ICI/IT/ECI, разделённое на две части. При считывании командой MRS все эти биты будут иметь нулевое значение, а попытка записи в них игнорируется.

Бит T отражает текущую используемую систему команд и в процессорах M-профиля всегда должен быть равен единице, поскольку они поддерживают только набор Thumb/Thumb-2 (если он равен нулю, попытка выполнения первой же команды после его сброса приведёт к возникновению прерывания).

Поле ICI/IT/ECI, отсутствующее в версиях ARMv8-M без основного расширения и ARMv6-M, предназначено для хранения состояния выполнения условного блока команд, начинаемого командой IT, либо состояния выполнения прерываемых команд групповой загрузки или сохранения регистров LDM, STM, PUSH и POP, либо команд векторной обработки (последние имеются лишь при наличии расширения MVE). В случае возникновения прерывания сохранённое в стеке значение этого поля используется для продолжения выполнения условного блока или прерываемой команды после возврата из обработчика прерывания.

Ещё один, девятый бит регистра EPSR считается зарезервированным, однако при сохранении регистра состояния в стеке во время входа в обработчик прерывания он устанавливается, если указатель стека (SP) был дополнительно уменьшен на 4 для обеспечения выравнивания на границу двойного слова, и сбрасывается, если дополнительное уменьшение SP не выполнялось. При возврате из обработчика прерывания этот бит анализируется с целью определения того, как именно надо скорректировать SP.

С помощью команд MSR и MRS возможен доступ сразу к двум или всем трём этим регистрам. Это объясняется тем, что физически имеется только один общий регистр состояния, а APSR, IPSR и EPSR являются лишь его представлениями «во внешнем мире». Чтобы указать, к каким именно частям регистра требуется доступ, используются обозначения IAPSR, EAPSR, IEPSR и XPSR (последнее означает одновременное обращение ко всему регистру состояния).

Изменения в регистре состояния, внесённые с помощью команды MSR, вступают в силу немедленно по её завершении.

Флаги условий

Биты N, Z, C и V носят общее название флагов условий или просто флагов. Они характеризуют результат выполнения той или иной операции и могут использоваться для организации переходов и условного выполнения команд.

Флаги условий изменяются командами обработки данных в S-форме, отражая полученный в них результат. Общие правила их модификации приведены в таблице; все исключения и уточнения даются в описаниях команд.

Флаг Описание
N
Устанавливается равным старшему биту результата операции. В том случае, когда результат трактуется как число со знаком, нулевое значение N будет соответствовать нулевому или положительному результату, единичное — отрицательному
Z
Устанавливается, если результат операции равен нулю, и сбрасывается в противном случае
C
Устанавливается или сбрасывается одним из следующих способов:
  • в операциях сложения, включая команду сравнения CMN, флаг C устанавливается, если в результате сложения возник перенос (т. е. если произошло беззнаковое переполнение), и сбрасывается в противном случае;
  • в операциях вычитания, включая команду сравнения CMP, флаг C сбрасывается, если в результате вычитания возник заём (т. е. если беззнаковый результат получился меньше нуля), и устанавливается в противном случае;
  • после операций сдвига флаг C будет равен значению последнего выдвинутого разряда;
  • прочие операции обычно не изменяют значение флага C. Все особые случаи оговариваются в описаниях команд.
V
Операции сложения и вычитания устанавливают флаг V, если возникло знаковое переполнение (т. е. когда знак результата получается не тем, что должен быть по правилам математики), и сбрасывают V при отсутствии переполнения. Остальные команды, как правило, не изменяют его состояние. Все исключения оговариваются в описании команд

Помимо изменения состояния с помощью команд обработки данных, флаги могут быть изменены ещё несколькими способами, включая прямую их загрузку командой MSR. Эта загрузка может выполняться как привилегированным, так и непривилегированным кодом.

Флаг Q

Этот флаг является признаком переполнения и/или насыщения, возникшего при выполнении некоторых команд цифровой обработки сигналов. Будучи установленным при наступлении соответствующего события, он остаётся установленным до явного сброса программой.

Как и флаги NZVC, этот бит может прямо изменяться непривилегированным кодом. Он присутствует только в процессорах, поддерживающих соответствующие команды; в частности, его нет ни в одном ядре архитектуры ARMv6-M.

Биты GE[3:0]

Эти биты используются командами набора SIMD и отражают выполнение условия «больше или равно» для отдельных байтов или полуслов результата. Они отсутствуют, если соответствующие команды в процессоре не реализованы (например, в ядрах архитектуры ARMv6-M).

Каждый из этих битов устанавливается в следующих случаях:

  • для беззнакового сложения байтов — если результат больше 255;
  • для беззнакового сложения полуслов — если результат больше 65535;
  • для беззнакового вычитания — если результат больше либо равен нулю;
  • для знаковой арифметики — если результат больше либо равен нулю.

Если эти условия не выполняются, соответствующий бит сбрасывается.

Регистры масок

Эти регистры управляют приоритетом кода, выполняемого процессором, а соответственно, возможностью его прерывания.

Версии ARMv8-M с основным расширением и ARMv7-M имеют три регистра — основной маски прерываний PRIMASK, маски отказов FAULTMASK и базового приоритета BASEPRI. В версиях ARMv8-M без основного расширения и ARMv6-M присутствует только первый регистр, два других отсутствуют, что эквивалентно наличию в них нулевых значений.

Если процессор имеет расширение безопасности, то у каждого из двух режимов безопасности имеются свои регистры масок.

Формат регистров масок показан на рисунке.

ARMv6-M and ARMv7-M special-purpose mask registers

Формат регистров масок для M-профиля

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

В регистре PRIMASK используется только младший бит, PM. Когда он установлен, приоритет выполняющегося в данный момент кода повышается до 0, из-за чего он может быть прерван только тяжёлым отказом (HardFault), немаскируемым прерыванием (NMI) или сбросом.

В регистре FAULTMASK используется тоже только младший бит, FM. Когда он установлен, приоритет выполняющегося в данный момент кода повышается до –1, и он может быть прерван только NMI или сбросом. Он может быть установлен лишь при текущем уровне приоритета, численно равным или большим нуля; попытка установить этот бит в обработчике HardFault или NMI игнорируется. Возврат из любого прерывания, кроме NMI, сбрасывает этот бит.

Регистр BASEPRI содержит одноимённое поле, которое позволяет повысить приоритет текущего выполняемого кода и тем самым повлиять на способность прерываний вытеснить его с процессора. В отличие от маски PM, поле BASEPRI не запрещает прерывания полностью, а лишь поднимает «верхнюю планку» приоритета. Значение в BASEPRI влияет на текущий приоритет выполнения лишь в случае, если оно численно меньше, чем собственный приоритет текущего выполняющегося обработчика (т. е. нельзя понизить приоритет кода ниже его собственного уровня), при этом значение 0 используется как индикатор того, что повышение приоритета с помощью BASEPRI отключено.

Размер регистра BASEPRI зависит от реализации и может достигать 8 битов. Их количество равно числу разрядов приоритета прерывания, обеспечиваемому данной реализацией.

Для обращения ко всем этим регистрам используются команды MSR и MRS. Кроме того, биты PM и FM могут устанавливаться и сбрасываться командой CPS. Попытки изменения этих регистров непривилегированным кодом игнорируются.

Если команда MSR или CPS используется для повышения (численно — понижения) текущего приоритета выполнения, новый приоритет вступает в силу сразу по завершении выполнения этой команды. Если же она применяется для понижения текущего приоритета, новый приоритет гарантированно вступит в силу лишь после выполнения команды ISB либо при входе или выходе из обработчика прерывания.

Команда MSR, осуществляющая запись в BASEPRI, имеет два варанта. Первый всегда записывает новое значение, а второй — лишь в случае, если новое значение численно меньше старого либо если старое значение BASEPRI равно нулю (т. е. в случае, если запись повышает текущий приоритет выполнения).

При сбросе во все три регистра масок заносятся нули.

Регистр CONTROL

Регистр CONTROL содержит следующие биты:

  • Биты 31—4 не используются и должны быть равны нулю.
  • Бит 3, SFPA (secure floating-point active), установлен, если регистры FPU содержат новую информацию, сформированную при работе в безопасном режиме, и сброшен, если такой информации в них нет.
При считывании регистра CONTROL в небезопасном режиме этот бит всегда содержит 0; попытка записи в него в этом режиме игнорируется.
Этот бит реализован лишь в процессорах, имеющих FPU и расширение безопасности.
  • Бит 2, FPCA (floating-point context active), установлен, если в текущем контексте исполнения FPU использовался, и сброшен в противном случае. Установленное состояние данного бита означает, что при сохранении контекста в момент вызова обработчика прерывания необходимо выделить место под сохранение состояния FPU и, возможно, фактически сохранить его состояние.
Если бит NSACR.CP10 сброшен, в небезопасном режиме возможно только считывание состояния этого бита.
Когда разрешено автоматическое сохранение контекста FPU (установлен бит FPCCR.ASPEN), бит FPCA устанавливается при успешном выполнении любой команды с плавающей запятой.
Этот бит реализован лишь в процессорах, имеющих FPU.
  • Бит 1, SPSEL, выбирает текущий используемый стек. Когда он равен нулю, используется основной стек (его указатель находится в регистре SP_main, или MSP), когда равен единице — стек процесса (указатель в SP_process, или PSP). Последнее возможно только при работе процессора в режиме потока; в режиме обработчика этот бит должен быть равен нулю. Явная запись (командой MSR) в этот разряд в режиме обработчика игнорируется, однако он неявно загружается при выполнении возврата из обработчика прерывания.
При наличии расширения безопасности бит SPSEL существует в двух экземплярах: для безопасного и небезопасного режимов.
  • Бит 0, nPRIV, определяет привилегированность кода, выполняемого процессором в режиме потока. Когда он равен нулю, выполняется привилегированный код, когда равен единице — непривилегированный. В режиме обработчика всегда выполняется привилегированный код независимо от состояния этого разряда.
Если процессор архитектуры ARMv6-M либо ARMv8-M без основного расширения не поддерживает непривилегированное исполнение, этот разряд всегда будет равен нулю, а запись в него игнорируется.
При наличии расширения безопасности бит nPRIV существует в двух экземплярах: для безопасного и небезопасного режимов.

При сбросе все биты регистра CONTROL обнуляются. При входе в обработчик прерывания биты SPSEL, FPCA и SFPA обнуляются. При возврате из обработчика прерывания бит FPCA изменяется в соответствии со значением кода EXC_RETURN.

Для того, чтобы изменения в регистре CONTROL гарантированно возымели эффект, необходимо обеспечить синхронизацию изменения состояния.

Регистры предела стека

В архитектуре ARMv8-M с основным расширением имеются регистры предела стека MSPLIM и PSPLIM, содержащие минимально допустимые значения для указателей стека (MSP и PSP соответственно). Если при этом имеется расширение безопасности, каждый из режимов безопасности имеет свой набор регистров предела стека.

В архитектуре ARMv8-M без основного расширения и без расширения безопасности регистры предела стека отсутствуют; их нет и в более старых версиях архитектуры. В архитектуре ARMv8-M без основного расширения, но с расширением безопасности имеются регистры предела стека для безопасного режима, однако небезопасный режим их не имеет.

Два младших бита этих регистров всегда равны нулю, остальные могут изменяться привилегированным кодом. При сбросе эти регистры обнуляются.

Проверка на выход за пределы стека выполняется в следующих случаях:

  • при входе в обработчик прерывания;
  • при сцеплении прерываний, если при этом происходит переход от безопасного к небезопасному обработчику;
  • при вызове небезопасной функции из безопасного кода;
  • при выполнении многих команд, оперирующих указателем стека. Однако здесь имеются следующие исключения:
  • команда MSR, изменяющая SP_NS, выполняет проверку предела стека, однако эта же команда, меняющая регистр предела стека или иной указатель стека, не выполняет проверку предела;
  • команда LDR, обновляющая базовый регистр, выполняет проверку предела стека, если SP выступает в роли базового регистра. Однако она не выполняет проверку, если SP является регистром, принимающим загружаемое из памяти значение;
  • ряд команд, способных изменить значение указателя стека (как минимум, обычные команды арифметико-логической обработки данных, где SP может быть указан в качестве приёмника результата наряду с любым другим регистром общего назначения), могут выполнять или не выполнять проверку предела стека в зависимости от особенностей реализации. Заметим, что специализированные версии команд ADD и SUB, специально предназначенные для изменения SP, осуществляют проверку на выход за пределы стека;
  • команда (например, STR), осуществляющая запись ниже границы стека и одновременно модифицирующая указатель стека таким образом, что он становится допустимым (т. е. увеличивающая его значение), может вызывать или не вызывать прерывание.

Если обнаруживается нарушение предела стека, возникает прерывание UsageFault (HardFault в случае процессора без основного расширения). Запись в ячейки стека, лежащие ниже предела (т. е. запись в которые с использованием указателя стека запрещена), не производится. Если операция, вызывающая выход за пределы стека, должна осуществить запись в ячейки стека, лежащие выше его предела (т. е. формально доступные для записи), нельзя предсказать, будет ли эта запись выполнена. В случае, если нарушение возникло при входе в обработчик прерывания или при сцеплении прерываний, значение указателя стека будет установлено равным пределу стека.

Бит STKOFHFNMIGN регистра CCR позволяет заблокировать проверку выхода за пределы стека для кода, выполняющегося с отрицательным приоритетом (т. е. для обработчиков HardFault и NMI).

Регистр VPR

Регистр VPR (vector predication status and control register) появился в архитектуре ARMv8.1-M с поддержкой MVE.

Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA , если не указано иное.