os/arch/riscv/trap/
mod.rs

1//! RISC-V 架构的陷阱处理模块
2//!
3//! 包含陷阱处理程序的实现
4mod sum_guard;
5mod trap_frame;
6mod trap_handler;
7
8use core::arch::global_asm;
9use riscv::register::{
10    mtvec::TrapMode,
11    stvec::{self, Stvec},
12};
13
14pub use sum_guard::SumGuard;
15pub use trap_frame::TrapFrame;
16
17global_asm!(include_str!("trap_entry.S"));
18global_asm!(include_str!("boot_trap_entry.S"));
19global_asm!(include_str!("sigreturn.S"));
20
21/// 初始化引导时的陷阱处理程序
22pub fn init_boot_trap() {
23    set_boot_trap_entry();
24}
25
26/// 初始化陷阱处理程序
27pub fn init() {
28    set_trap_entry();
29}
30
31/// 恢复到陷阱前的上下文
32/// # Safety
33/// 该函数涉及直接操作处理器状态,必须确保传入的 TrapFrame 是有效且正确的。
34pub unsafe fn restore(trap_frame: &TrapFrame) {
35    unsafe { __restore(trap_frame) };
36}
37
38/// 获取信号返回的 trampoline 地址
39pub fn sigreturn_trampoline_address() -> usize {
40    __sigreturn_trampoline as usize
41}
42
43fn set_trap_entry() {
44    // Safe: 仅在内核初始化阶段调用,确保唯一性
45    unsafe {
46        stvec::write(Stvec::new(trap_entry as usize, TrapMode::Direct));
47    }
48}
49
50fn set_boot_trap_entry() {
51    // Safe: 仅在内核初始化阶段调用,确保唯一性
52    unsafe {
53        stvec::write(Stvec::new(boot_trap_entry as usize, TrapMode::Direct));
54    }
55}
56
57unsafe extern "C" {
58    unsafe fn boot_trap_entry();
59    unsafe fn trap_entry();
60    unsafe fn __restore(trap_frame: &TrapFrame);
61    unsafe fn __sigreturn_trampoline();
62}