例外

aarch64-rt は、例外ハンドラを定義するためのトレイトと、それらを呼び出す 例外ベクタ向けのアセンブリコードを生成するマクロを提供します。

このトレイトには、単に panic する各メソッドのデフォルト実装があるため、 発生しないと想定している例外のメソッドは省略できます。

// 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 マクロは、Rust コードを呼び出すための例外ベクタを含む global_asm! ブロックを生成します。これは、以前使用していた exceptions.S と 似ています。
  • RegisterStateRef は、例外が発生したときにアセンブリコードによってレジスタ値が 保存されたスタックフレームへの参照をラップします。これは、たとえば下位 EL からの SMC または HVC 呼び出しのパラメータを取り出し、例外ハンドラの復帰時に 復元される値を更新するために使用できます。