Исключения
aarch64-rt предоставляет трейт для определения обработчиков исключений и макрос для генерации ассемблерного кода вектора исключений, который их вызывает.
У трейта есть реализации по умолчанию для каждого метода, которые просто вызывают панику, поэтому можно опустить методы для исключений, которые, как мы ожидаем, не произойдут.
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
use aarch64_rt::{ExceptionHandlers, RegisterStateRef, exception_handlers};
use log::error;
use smccc::Hvc;
use smccc::psci::system_off;
struct Handlers;
impl ExceptionHandlers for Handlers {
extern "C" fn sync_current(_state: RegisterStateRef) {
error!("sync_current");
system_off::<Hvc>().unwrap();
}
extern "C" fn irq_current(_state: RegisterStateRef) {
error!("irq_current");
system_off::<Hvc>().unwrap();
}
extern "C" fn fiq_current(_state: RegisterStateRef) {
error!("fiq_current");
system_off::<Hvc>().unwrap();
}
extern "C" fn serror_current(_state: RegisterStateRef) {
error!("serror_current");
system_off::<Hvc>().unwrap();
}
}
exception_handlers!(Handlers);
- Макрос
exception_handlersгенерирует блокglobal_asm!с вектором исключений, который вызывает код Rust, аналогично нашему прежнемуexceptions.S. RegisterStateRefоборачивает ссылку на кадр стека, где ассемблерный код сохранил значения регистров при возникновении исключения. Это можно использовать, например, чтобы извлечь параметры вызова SMC или HVC из более низкого EL и обновить значения, которые будут восстановлены при возврате из обработчика исключений.