commit - 8a34432aaf4dc1a65d173a747929d9c04a354811
commit + 46b320cbc3e5839bd91d1b7142fc837f1cda0f1b
blob - 0c84e3ae651cb69fdd4e317fac9643c89901ab3e
blob + d51f2322cc5418fcf00f6f84c7e2b28121e21bb7
--- capsule/squat/reports/aarch64_exception_model.gmi
+++ capsule/squat/reports/aarch64_exception_model.gmi
🛈 В более ранних версиях arm прерывания FIQ имели более высокий приоритет относительно IRQ. В AArch64 FIQ и IRQ имеют одинаковый приоритет.
-## Маскирование (Masking)
-
-Физические и виртуальные асинхронные исключения могут быть временно замаскированы. При этом исключения будут оставаться в ожидании начала обработки до момент, пока маска не будет снята.
-
-Синхронные исключения не могут быть замаскированы, так как они непосредственно связаны с текущей инструкцией и не могут быть отложены или проигнорированы.
-
-В расширениях 2021 года, Armv8.8-A и Armv9.3-A, добавлена поддержка немаскируемых прерываний (Non-maskable interrupt, NMI). Если эта возможность включена, то такое прерывание может быть доставлено процессору несмотря на маски.
-
## Обработка исключений
При обработка исключений в AArch64 используется специальная терминология:
Для синхронных исключений и SError помимо прочего заполняется и регистр синдрома исключения (Exception Syndrome Register, ESR). В него записывается причина исключения.
### Маршрутизация и контроллер прерываний
+
+Каждое исключение имеет свой принимающий уровень исключений (EL), который определяется одним из условий:
+* Тип исключения явно указывает на принимающий уровень исключений. Например: инструкция SVC всегда порождает исключение, принимаемое на уровне EL1.
+* Исключение маршрутизируется в соответствии с конфигурацией системных регистров. Маршрутизация задается независимо для IRQ, FIQ и SError.
+
+Настройка маршрутизации осуществляется двумя регистрами:
+* Регистр конфигурации гипервизора (Hypervisor Configuration Register): HCR_EL2.Определяет какие исключения будет принимать EL2. При сбросе значение регистра не определено и должно
+* Регистр конфигурации монитора безопасности (Secure Configuration Register): SCR_EL3. Определяет какие исключения будет принимать EL3. Имеет более высокий приоритет относительно HCR_EL2.
+
+Исключения, маршрутизация которых не задана ни в SCR_EL3, ни в HCR_EL2 будут приниматься в EL1.
+
+При сбросе значение регистров HCR_EL2 и SCR_EL3 не определено и должно быть задано явным образом.
+
+Для более детальных маршрутизации, управления и приоритизации используется контроллер прерываний arm (Generic Interrupt Controller, GIC). Он позволяет существенно снизить накладные расходы при виртуализации. Технические детали можно найти в техническом руководстве.
+
+🛈 Нельзя перенаправлять исключение на нереализованный уровень исключений. Такое поведение является неопределенным (UNDEFINED). Так же нельзя возвращаться из исключения на отключенный или нереализованный уровень исключений. Попытка выполнения инструкции возврата приведет к возникновению ошибки.
+
+### Маскирование (Masking)
+
+Физические и виртуальные асинхронные исключения могут быть временно замаскированы. При этом исключения будут оставаться в ожидании начала обработки до момент, пока маска не будет снята.
+
+Синхронные исключения не могут быть замаскированы, так как они непосредственно связаны с текущей инструкцией и не могут быть отложены или проигнорированы.
+
+Исключения, принимаемые на более высоком уровне исключений, не могут быть замаскированы с более низкого уровня исключений. Исключения принимаемые на более низком уровне исключений, замаскированы всегда, пока исполняется более высокий уровень исключений. Это, в числе прочего, согласуется с тем, что нельзя понизить привилегии, принимая возникшее исключение.
+
+В расширениях 2021 года, Armv8.8-A и Armv9.3-A, добавлена поддержка немаскируемых прерываний (Non-maskable interrupt, NMI). Если эта возможность включена, то такое прерывание может быть доставлено процессору несмотря на маски.
+
+### Таблицы векторов (vector tables) AArch64