os/arch/riscv/intr/
mod.rs

1//! RISC-V 架构的中断管理
2#![allow(unused)]
3mod softirq;
4
5use riscv::register::{
6    sie,
7    sstatus::{self, Sstatus},
8};
9pub use softirq::*;
10
11use crate::{
12    arch::{
13        constant::{IRQ_MIN, SSTATUS_SIE},
14        mm::paddr_to_vaddr,
15    },
16    println,
17};
18
19/// 启用定时器中断
20/// 安全性: 该函数直接操作 CPU 寄存器,启用中断可能会引发竞态条件或不一致状态。
21/// 调用者必须确保在适当的上下文中调用此函数,以避免潜在的问题。
22pub unsafe fn enable_timer_interrupt() {
23    unsafe { sie::set_stimer() };
24}
25
26/// 禁用定时器中断
27/// 安全性: 该函数直接操作 CPU 寄存器,禁用中断可能会引发竞态条件或不一致状态。
28/// 调用者必须确保在适当的上下文中调用此函数,以避免潜在的问题。
29pub unsafe fn disable_timer_interrupt() {
30    unsafe { sie::clear_stimer() };
31}
32
33/// 启用中断
34/// 安全性: 该函数直接操作 CPU 寄存器,启用中断可能会引发竞态条件或不一致状态。
35/// 调用者必须确保在适当的上下文中调用此函数,以避免潜在的问题。
36pub unsafe fn enable_interrupts() {
37    unsafe { sstatus::set_sie() };
38}
39
40/// 禁用中断
41/// 安全性: 该函数直接操作 CPU 寄存器,禁用中断可能会引发竞态条件或不一致状态。
42/// 调用者必须确保在适当的上下文中调用此函数,以避免潜在的问题。
43pub unsafe fn disable_interrupts() {
44    unsafe { sstatus::clear_sie() };
45}
46
47/// 检查中断是否已启用
48pub fn are_interrupts_enabled() -> bool {
49    sstatus::read().sie()
50}
51
52/// 读取并禁用中断,返回之前的中断状态
53/// 返回值: 之前的 sstatus 寄存器值
54/// 安全性: 该函数直接操作 CPU 寄存器,禁用中断可能会引发竞态条件或不一致状态。
55/// 调用者必须确保在适当的上下文中调用此函数,以避免潜在的问题。
56pub unsafe fn read_and_disable_interrupts() -> usize {
57    // SIE 在 sstatus 的位 1
58    let sie_mask: usize = 1 << 1;
59    let old: usize;
60    // 原子地清除 sstatus 中的 SIE 位,并返回旧的 sstatus 值
61    unsafe {
62        core::arch::asm!(
63            "csrrc {old}, sstatus, {mask}",
64            old = out(reg) old,
65            mask = in(reg) sie_mask,
66            options(nomem, nostack)
67        );
68    }
69    old
70}
71
72///读取并启用中断
73pub unsafe fn read_and_enable_interrupts() -> usize {
74    // SIE 在 sstatus 的位 1
75    let sie_mask: usize = 1 << 1;
76    let old: usize;
77    // 原子地设置 sstatus 中的 SIE 位,并返回旧的 sstatus 值
78    unsafe {
79        core::arch::asm!(
80        "csrrs {old}, sstatus, {mask}",
81        old = out(reg) old,
82        mask = in(reg) sie_mask,
83        options(nomem, nostack)
84        );
85    }
86    old
87}
88/// 恢复中断状态
89/// 参数: flags - 之前的 sstatus 寄存器值
90/// 安全性: 该函数直接操作 CPU 寄存器,恢复中断状态可能会引发竞态条件或不一致状态。
91/// 调用者必须确保在适当的上下文中调用此函数,以避免潜在的问题。
92pub unsafe fn restore_interrupts(flags: usize) {
93    let spie: usize = flags & SSTATUS_SIE;
94    if spie != 0 {
95        unsafe { sstatus::set_sie() };
96    }
97}
98
99/// 启用指定的中断号
100pub fn enable_irq(irq: usize) {
101    // Handled in PLIC driver
102}