commit - eb8e4bd9f7189e4d9dc2e2bbbe36f9d691f665bb
commit + 8a34432aaf4dc1a65d173a747929d9c04a354811
blob - f17aa2fc8a1a81bb62ad8f0c11e51b25229a9ee0
blob + 0c84e3ae651cb69fdd4e317fac9643c89901ab3e
--- capsule/squat/reports/aarch64_exception_model.gmi
+++ capsule/squat/reports/aarch64_exception_model.gmi
* выход из режима отладки
При возникновении исключения уровень исключения может увеличиться или остаться прежним (никогда не уменьшается). При возврате из исключения уровень исключения может уменьшиться или остаться прежним (никогда не увеличивается).
+🛈 Еще одно ограничение: исключение не может быть обработано на уровне 0 (EL0).
## Привилегии и доступ
* Физические прерывания (physical interrupts). Одним из способ сообщить о смене состояния периферийного устройства может быть прерывание. Сложные системы могут иметь множество источников прерываний с различными уровнями приоритета, включая возможность вложенной обработки прерываний, при которой прерывание с более высоким приоритетом может прервать прерывание с более низким приоритетом. Скорость реакции ядра на такие события может быть критически важной и называется задержкой прерывания (interrupt latency). В архитектуре arm есть два типа асинхронных исключений для обработки сигналов от периферии: IRQ и FIQ. Они имеют независимую маршрутизацию и часто используются для реализации защищённых (Secure) и незащищённых (Non-secure) прерываний. Во всех реализация arm для управления IRQ и FIQ используется универсальный контроллер прерываний (Generic Interrupt Controller, GIC). Этот контроллер приоритезирует и маршрутизирует прерывания, отправляя их процессорному ядру.
* Виртуальные прерывания (Virtual interrupts). Система, использующая виртуализацию, имеет более сложные требования к обработке прерываний. Некоторые прерывания может получать гипервизор, а другие могут быть обработаны непосредственно в виртуальной машине. Прерывания, которые видит виртуальная машина, являются виртуальными прерываниями: vSError (Virtual System Error), vIRQ (Virtual IRQ) и vFIQ (Virtual FIQ). Виртуальные прерывания могут быть сгенерированы извне устройством, подключенным к контроллеру прерываний, или могут быть сгенерированы программно. Виртуальные прерывания могут быть доставлены только на EL1.
+🛈 В более ранних версиях arm прерывания FIQ имели более высокий приоритет относительно IRQ. В AArch64 FIQ и IRQ имеют одинаковый приоритет.
## Маскирование (Masking)
* Уровень исключения и состояние, которые исполнялись в момент принятия исключения, называются уровнем и состоянием с которого принимается исключение (taken from).
* Уровень исключения и состояние, которые будут обрабатывать исключение, называются уровнем и состоянием в которые принимается исключение (taken to).
-Например исключение может быть принято с AArch32 EL0 в AArch64 EL1. Обработка исключения будет происходить в AArch64 на уровне исключений EL1. После обработки исключения система должна вернуться к состоянию с которого было принято исключение. В arm для этого есть отдельные инструкции. В нашем примере возврат из из исключения перейдет обратно в AArch32 на EL0.
+Например исключение может быть принято с AArch32 EL0 в AArch64 EL1. Обработка исключения будет происходить в AArch64 на уровне исключений EL1. После обработки исключения система должна вернуться к состоянию с которого было принято исключение. В arm для этого есть отдельные инструкции. В нашем примере возврат из из исключения перейдет обратно в AArch32 на EL0. При переходе из AArch32 в AArch64 регистры, недоступные в состоянии AArch32, сохраняют свои значения из предыдущего исполнения AArch64. Для регистров, доступных в обоих состояниях исполнения, верхняя половина 64-разрядных регистров содержит либо 0, либо старое значение.
+
+Соответствие между регистрами AArch32 и AArch64:
+* R0-R12 из AArch32 соответствуют в AArch64 регистрам X0-X12
+* Переключаемые регистры SP и LR из AArch32 соответствуют в AArch64 регистрам X13-X23
+* Переключаемые регистры FIQ из AArch32 соответствуют в AArch64 регистрам X24-X30
+
+🛈 Обработка исключения производится с использованием так называемых векторов исключений. В отличии от множества других архитектур, в amr в векторах исключений хранятся не адреса обработчиков, а непосредственно код самого обработчика. Непосредственно в векторе исключения умещается только 32 инструкции, которых достаточно для формирования стека и вызова полноценного обработчика исключения.
+
+### Сохранение текущего состояния процессора
+
+В AArch64 существует концепция состояния процессора, известная как PSTATE. Это состояние при принятии исключения записывается в регистр сохранённого состояния программы (Saved Program Status Register, SPSR). PSTATE содержит такие сведения, как текущий уровень исключения и флаги арифметико-логического блока (ALU). В AArch64 так же содержится:
+* Флаги состояния
+* Элементы управления состоянием выполнения
+* Биты маски исключений (DAIF: Debug, SError asynchronous, IRQ, FIQ. Исключение не происходит, если соответствующий бит установлен)
+* Биты управления доступом
+* Биты управления таймингом
+* Биты управления спекулятивным исполнением
+
+Для каждого уровня исключения существует свой SPSR - SPSR_ELx. При принятии исключения используется SPSR_ELx, в которое принимается исключение (taken to).
+
+🛈 В Armv7 и более ранних версиях PSTATE назывался CPSR и был реализован в виде регистра.
+
+Для синхронных исключений и SError помимо прочего заполняется и регистр синдрома исключения (Exception Syndrome Register, ESR). В него записывается причина исключения.
+
+### Маршрутизация и контроллер прерываний