1.9.1 例外情况
01-例外情况 — Comprehensive Rust
译文 · 基于 Comprehensive Rust
原文链接: https://google.github.io/comprehensive-rust/bare-metal/aps/aarch64-rt/exceptions.html
1.9.1 例外情况
aarch64-rt提供一个特征来定义异常处理程序,以及一个宏
生成异常向量的汇编代码以调用它们。
该特征对每个方法都有默认实现,这只会引起恐慌,所以我们
可以省略我们不希望发生的异常的方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| // 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,并更新异常处理程序返回时要恢复的值。