commit b31ea8b9c984deb656dae7ff9495a95baa776b86 from: Aleksey Ryndin date: Wed Oct 04 17:07:50 2023 UTC Append aarch64_exception_model.gmi: vector tables commit - 46b320cbc3e5839bd91d1b7142fc837f1cda0f1b commit + b31ea8b9c984deb656dae7ff9495a95baa776b86 blob - d51f2322cc5418fcf00f6f84c7e2b28121e21bb7 blob + f253a661275208219a89f1899fbb4b1058bfff86 --- capsule/squat/reports/aarch64_exception_model.gmi +++ capsule/squat/reports/aarch64_exception_model.gmi @@ -118,8 +118,6 @@ Arm архитектура не имеет строг * Переключаемые регистры SP и LR из AArch32 соответствуют в AArch64 регистрам X13-X23 * Переключаемые регистры FIQ из AArch32 соответствуют в AArch64 регистрам X24-X30 -🛈 Обработка исключения производится с использованием так называемых векторов исключений. В отличии от множества других архитектур, в amr в векторах исключений хранятся не адреса обработчиков, а непосредственно код самого обработчика. Непосредственно в векторе исключения умещается только 32 инструкции, которых достаточно для формирования стека и вызова полноценного обработчика исключения. - ### Сохранение текущего состояния процессора В AArch64 существует концепция состояния процессора, известная как PSTATE. Это состояние при принятии исключения записывается в регистр сохранённого состояния программы (Saved Program Status Register, SPSR). PSTATE содержит такие сведения, как текущий уровень исключения и флаги арифметико-логического блока (ALU). В AArch64 так же содержится: @@ -165,3 +163,23 @@ Arm архитектура не имеет строг В расширениях 2021 года, Armv8.8-A и Armv9.3-A, добавлена поддержка немаскируемых прерываний (Non-maskable interrupt, NMI). Если эта возможность включена, то такое прерывание может быть доставлено процессору несмотря на маски. ### Таблицы векторов (vector tables) AArch64 + +При принятии исключения процессор исполняет код обработчика исключения. Место в памяти, где хранится обработчик, называется вектором исключения. + +🛈 В отличии от других архитектур, в amr в векторах исключений хранятся не адреса обработчиков, а непосредственно код самого обработчика. + +Векторы исключений вместе образуют таблицу векторов исключений. Каждый уровень исключений, который может быть принимающим исключение, имеет свою собственную таблицу векторов, базовый адрес которой определяется собственным регистром базового адреса вектора (Vector Base Address Register) - VBAR_EL, где - это 1, 2 или 3. Значения регистров VBAR после сброса не определены, поэтому их необходимо задать явно до включения прерываний. + +Векторные таблицы используют единый формат. Таблица делится на четыре категории: +* VBAR_ELx+0x000 - Исключения с текущего EL при использовании SP_EL0 +* VBAR_ELx+0x200 - Исключения с текущего EL при использовании SP_ELx +* VBAR_ELx+0x400 - Исключения с меньшего EL, где среди уровней с меньшим EL хотя бы один AArch64 +* VBAR_ELx+0x600 - Исключения с меньшего EL, где среди уровней с меньшим EL все AArch32 + +Каждая категория делится на 4 вектора, по одному вектору на тип произошедшего исключения: +* +0x000 - синхронное (Synchronous) исключение +* +0x080 - IRQ/vIRQ +* +0x100 - FIQ/vFIQ +* +0x180 - SError/VSError + +Непосредственно в векторе исключения умещаются 32 процессорных инструкции. Обычно код вектора исключения сохраняет в стеке содержимое регистров, которые могут быть изменены и вызывает функцию более сложного обработчика, специфичного для текущего исключения. После возврата содержимое регистров восстанавливается и вызывается инструкция возврата из исключения (ERET).