Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Исключения

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 и обновить значения, которые будут восстановлены при возврате из обработчика исключений.