例外
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 呼び出しのパラメータを取り出し、例外ハンドラの復帰時に 復元される値を更新するために使用できます。